[软件名称] : GiliSoftVideo Editor 7.4.0
[编译类型] : Delphi
[是否有壳] : 无壳
[注册类型] : 注册码注册
[作者信息] : LYQingYe [FBI Warning] : 学到东西的别忘记评分!
@Shark恒  这回我解释了关键CALL找法.
PS:再此之前已经 @Bu弃 发过爆破教程了.我再次补一补算法分析.爆破帖地址
关键CALL找法分析 , 先bp MessageBoxA
//回溯返回到
//往上翻到子程序头就是关键CALL了 -> Sub_004AC8CC
//第一部分-参数校验 //7~13位 我认为应该是版本Key,如有错误请指正。 //最终验证 部分
10001CA3 mov eax,dword ptr ss:[ebp+0x8] 10001CA6 push eax ;DLL验证CALL传入的参数 10001CA7 call magicski.100040AC ; 从表挑选一个常量
//之所以说13~17位是版本key,是因为这个DLL验证CALL会传入一个参数, call magicski.100040AC 这个CALL就用到了这个参数,参数为 表中的索引, 传入的 为0 ,我猜 代表最新版本 .看下这个表
100040C8 mov dword ptr ss:[ebp-0x4],0xC3BC 100040D1 mov dword ptr ss:[ebp-0x4],0xC7A4 100040DA mov dword ptr ss:[ebp-0x4],0xCB8C 100040E3 mov dword ptr ss:[ebp-0x4],0xCF74 100040EC mov dword ptr ss:[ebp-0x4],0x138EC 100040F5 mov dword ptr ss:[ebp-0x4],0xD35C 100040FE mov dword ptr ss:[ebp-0x4],0xD744 10004107 mov dword ptr ss:[ebp-0x4],0xDB2C 10004110 mov dword ptr ss:[ebp-0x4],0xDF14 10004119 mov dword ptr ss:[ebp-0x4],0xC3BC
//因为索引为0 ,所以获得常量 “0xC3BC” 我们将它命名为 local,这个常量值校验的时候用到 [Asm] 纯文本查看 复制代码 004AC8CC />push ebp
004AC8CD |>mov ebp,esp
004AC8CF |>mov ecx,0x11
004AC8D4 |>/push 0x0
004AC8D6 |>|push 0x0
004AC8D8 |>|dec ecx ; ntdll.7C93005D
004AC8D9 |>\jnz short videoedi.004AC8D4
004AC8DB |>push ecx ; ntdll.7C93005D
004AC8DC |>push ebx
004AC8DD |>push esi ; videoedi.004BD70C
004AC8DE |>mov ebx,eax
004AC8E0 |>mov esi,dword ptr ds:[0x4B97B8] ; videoedi.004BD70C
004AC8E6 |>xor eax,eax
004AC8E8 |>push ebp
004AC8E9 |>push videoedi.004ACF56
004AC8EE |>push dword ptr fs:[eax]
004AC8F1 |>mov dword ptr fs:[eax],esp
004AC8F4 |>lea edx,[local.6]
004AC8F7 |>mov eax,dword ptr ds:[ebx+0x374]
004AC8FD |>call videoedi.00449AB4 ; GetEmailAddress获取输入输入的Email 地址
004AC902 |>mov eax,[local.6] ; Eax-> Email
004AC905 |>lea edx,[local.2] ; Edx - >NewBuffer
004AC908 |>call videoedi.00409160 ; Trim(const S: string): string; overload; 从给定字串中去除首尾空格和控制符
004AC90D |>cmp [local.2],0x0 ; 判断是新字符串地址是否合法,若非法则提示NoName
004AC911 |>jnz short videoedi.004AC963 ; Check New Str Point Invalid
004AC913 |>push 0x40
004AC915 |>lea edx,[local.7]
004AC918 |>mov eax,dword ptr ds:[0x4B9638] ; 凑K
004AC91D |>mov eax,dword ptr ds:[eax]
004AC91F |>call videoedi.00466464
004AC924 |>mov eax,[local.7]
004AC927 |>call videoedi.00404E70
004AC92C |>push eax
004AC92D |>lea eax,[local.8]
004AC930 |>push eax
004AC931 |>mov eax,dword ptr ds:[0x4B93C0]
004AC936 |>mov eax,dword ptr ds:[eax]
004AC938 |>mov ecx,videoedi.004ACF6C ; strNoName
004AC93D |>mov edx,dword ptr ds:[ebx+0x3C4]
004AC943 |>call videoedi.004A52F4
004AC948 |>mov eax,[local.8]
004AC94B |>call videoedi.00404E70
004AC950 |>push eax
004AC951 |>mov eax,ebx
004AC953 |>call videoedi.004515EC
004AC958 |>push eax ; |hOwner = 00000001
004AC959 |>call <jmp.&user32.MessageBoxA> ; \MessageBoxA
004AC95E |>jmp videoedi.004ACF01
004AC963 |>cmp dword ptr ds:[esi],0x4
004AC966 |>je short videoedi.004AC9C4
004AC968 |>mov eax,[local.2] ; EAX ->Email
004AC96B |>call videoedi.004A4D10
004AC970 |>test eax,eax
004AC972 |>jnz short videoedi.004AC9C4 ;若输入的Email非法则提示strErrorEmail
004AC974 |>push 0x40
004AC976 |>lea edx,[local.9]
004AC979 |>mov eax,dword ptr ds:[0x4B9638] ; 凑K
004AC97E |>mov eax,dword ptr ds:[eax]
004AC980 |>call videoedi.00466464
004AC985 |>mov eax,[local.9]
004AC988 |>call videoedi.00404E70
004AC98D |>push eax
004AC98E |>lea eax,[local.10]
004AC991 |>push eax
004AC992 |>mov eax,dword ptr ds:[0x4B93C0]
004AC997 |>mov eax,dword ptr ds:[eax]
004AC999 |>mov ecx,videoedi.004ACF80 ; strErrorEmail
004AC99E |>mov edx,dword ptr ds:[ebx+0x3C4]
004AC9A4 |>call videoedi.004A52F4
004AC9A9 |>mov eax,[local.10]
004AC9AC |>call videoedi.00404E70
004AC9B1 |>push eax
004AC9B2 |>mov eax,ebx
004AC9B4 |>call videoedi.004515EC
004AC9B9 |>push eax ; |hOwner = 00000001
004AC9BA |>call <jmp.&user32.MessageBoxA> ; \MessageBoxA
004AC9BF |>jmp videoedi.004ACF01
004AC9C4 |>lea edx,[local.11]
004AC9C7 |>mov eax,dword ptr ds:[ebx+0x370]
004AC9CD |>call videoedi.00449AB4 ; GetKey , 获取我们输入的Key
004AC9D2 |>mov eax,[local.11] ; Eax ->Key
004AC9D5 |>lea edx,[local.1] ; Edx ->NewBuffer
004AC9D8 |>call videoedi.00409160 ; Trim(const S: string): string; overload; 从给定字串中去除首尾空格和控制符。
004AC9DD |>cmp [local.1],0x0 ; Check New Str Key Point Invalid
004AC9E1 |>jnz short videoedi.004ACA33 ; 若 指针非法则提示 ‘strNoKey’
004AC9E3 |>push 0x40
004AC9E5 |>lea edx,[local.12]
004AC9E8 |>mov eax,dword ptr ds:[0x4B9638] ; 凑K
004AC9ED |>mov eax,dword ptr ds:[eax]
004AC9EF |>call videoedi.00466464
004AC9F4 |>mov eax,[local.12]
004AC9F7 |>call videoedi.00404E70
004AC9FC |>push eax
004AC9FD |>lea eax,[local.13]
004ACA00 |>push eax
004ACA01 |>mov eax,dword ptr ds:[0x4B93C0]
004ACA06 |>mov eax,dword ptr ds:[eax]
004ACA08 |>mov ecx,videoedi.004ACF98 ; strNoKey
004ACA0D |>mov edx,dword ptr ds:[ebx+0x3C4]
004ACA13 |>call videoedi.004A52F4
004ACA18 |>mov eax,[local.13]
004ACA1B |>call videoedi.00404E70
004ACA20 |>push eax
004ACA21 |>mov eax,ebx
004ACA23 |>call videoedi.004515EC
004ACA28 |>push eax ; |hOwner = 00000001
004ACA29 |>call <jmp.&user32.MessageBoxA> ; \MessageBoxA
004ACA2E |>jmp videoedi.004ACF01
004ACA33 |>cmp dword ptr ds:[esi],0x4
004ACA36 |>jnz short videoedi.004ACA45
004ACA38 |>lea eax,[local.1]
004ACA3B |>mov edx,videoedi.004ACFAC ; -11111
004ACA40 |>call videoedi.00404C78
004ACA45 |>mov eax,[local.1] ; Eax - >Key
004ACA48 |>test eax,eax
004ACA4A |>je short videoedi.004ACA51 ; 判断指针是否合法
004ACA4C |>sub eax,0x4 ; Eax = Eax - 4 -> KeyLength
004ACA4F |>mov eax,dword ptr ds:[eax] ; Eax = KeyLength ,获取Key的长度
004ACA51 |>cmp eax,0x23 ; Check Key length == 0X23 (35)
004ACA54 |>je short videoedi.004ACAA6 ; Key的长度要为 35 ,否则失败
//上面的校验也很简单,首先根据版本 (猜测)->从 表中 获取一个常量值local 然后,取key 7~11位 和 key 1~5位做运算,最后拿key19~23位和 25~29位做校验,一定要相等,在这 我们就得到了 19~23的和25~29的来源 (7~11+ local) % 0x1869f = 19~23 (1~5+ local) % 0x1869f = 25~29
//知道了,校验过程,下面来手动算码. 初始化假码格式 应该为这样, 78888-67890-12345-12345-12345-12345。 78888和 67890 是随便写的,因为(1~5 + local) 要取 99999(0x1869f)的余数,所以数字得大一点 根据第一次校验 13~17位应该为 常量 “21851”,所以注册码变为 78888-67890-21851-12345-12345-12345 根据DLL校验部分 (7~11+ local) % 0x1869f = 19~23 (1~5+ local) % 0x1869f = 25~29 //得到 (0x10932+ 0xc3bc) % 0x1869f = 0x464F (17999) (7~11bit+ local) % 0x1869F = 19~23bit (17999)
(0x13428+ 0xc3bc) % 0x1869f = 0x7145 (28997) (1~5bit + local) % 0x1869f = 25~29bit (28997)
我们注册下测试
|