这年头,软件作者越来越能了。。。。。。。。。。。。。。。。。。。。。。。。。。。。
后来不想玩爆破了,,,,,,,一直分析软件的真码咋算出来的,今天碰到一个,。。。。。可能进了一个假的算法call
先来看下软件的界面,,
软件无壳,,Delphi程序
首先拖入OD,下好按钮事件,输入用户名和假码,,会断在按钮事件的call中,
我们点进去,
看到有两个jnz,,这是判断用户名和假码是否为空,为空的话就跳走了
我们进去这个关键call
这里我把关键call的代码复制了出来
006A96D4 /$ 55 push ebp
006A96D5 |. 8BEC mov ebp,esp
006A96D7 |. 83C4 E8 add esp,-0x18
006A96DA |. 53 push ebx
006A96DB |. 56 push esi
006A96DC |. 33D2 xor edx,edx
006A96DE |. 8955 E8 mov [local.6],edx
006A96E1 |. 8955 EC mov [local.5],edx
006A96E4 |. 8955 FC mov [local.1],edx
006A96E7 |. 8945 F8 mov [local.2],eax
006A96EA |. 33C0 xor eax,eax
006A96EC |. 55 push ebp
006A96ED |. 68 F0976A00 push Converte.006A97F0
006A96F2 |. 64:FF30 push dword ptr fs:[eax]
006A96F5 |. 64:8920 mov dword ptr fs:[eax],esp
006A96F8 |. 33DB xor ebx,ebx
006A96FA |. 8D55 FC lea edx,[local.1]
006A96FD |. 8B45 F8 mov eax,[local.2]
006A9700 |. 8B80 94030000 mov eax,dword ptr ds:[eax+0x394]
006A9706 |. E8 990AEEFF call Converte.0058A1A4
006A970B |. 8B45 FC mov eax,[local.1]
006A970E |. 85C0 test eax,eax
006A9710 |. 74 16 je short Converte.006A9728
006A9712 |. 8BD0 mov edx,eax
006A9714 |. 83EA 0A sub edx,0xA
006A9717 |. 66:833A 02 cmp word ptr ds:[edx],0x2
006A971B |. 74 0B je short Converte.006A9728
006A971D |. 8D45 FC lea eax,[local.1]
006A9720 |. 8B55 FC mov edx,[local.1]
006A9723 |. E8 64CDD5FF call Converte.0040648C
006A9728 |> 85C0 test eax,eax
006A972A |. 74 05 je short Converte.006A9731
006A972C |. 83E8 04 sub eax,0x4
006A972F |. 8B00 mov eax,dword ptr ds:[eax] ; Converte.006A8CF0
006A9731 |> 8BF0 mov esi,eax
006A9733 |. 85F6 test esi,esi
006A9735 |. 7E 37 jle short Converte.006A976E
006A9737 |. C745 F0 01000>mov [local.4],0x1
006A973E |> 8D45 EC /lea eax,[local.5]
006A9741 |. 50 |push eax
006A9742 |. B9 01000000 |mov ecx,0x1 ; ecx赋值为1
006A9747 |. 8B55 F0 |mov edx,[local.4]
006A974A |. 8B45 FC |mov eax,[local.1] ; 用户名给eax
006A974D |. E8 EEE1D5FF |call Converte.00407940
006A9752 |. 8B45 EC |mov eax,[local.5] ; 用户名第一位给eax
006A9755 |. E8 32DBD5FF |call Converte.0040728C
006A975A |. 0FB700 |movzx eax,word ptr ds:[eax]
006A975D |. 0FB7C0 |movzx eax,ax
006A9760 |. 03D8 |add ebx,eax ; ebx加上eax后的值放到ebx中
006A9762 |. 81F3 05FA0B00 |xor ebx,0xBFA05 ; ebx与0xBFA05异或
006A9768 |. FF45 F0 |inc [local.4]
006A976B |. 4E |dec esi
006A976C |.^ 75 D0 \jnz short Converte.006A973E ; 这个循环就是将用户名第一位与0x8FA05进行异或,结果加上用户名第二位再与ox8FA05进行异或,这样循环下去一直到用户名最后一位,循环后ebx的值为 8F9CA
006A976E |> A1 D8397600 mov eax,dword ptr ds:[0x7639D8] ; 将0x7639D8里面的4字节内容,也就是0030FE6D给eax
006A9773 |. 8BD0 mov edx,eax ; 将eax的值给edx
006A9775 |. C1E0 04 shl eax,0x4 ; eax的值左移4位
006A9778 |. 03C2 add eax,edx ; eax的值加上 edx
006A977A |. 03D8 add ebx,eax ; ebx(就是刚才那个循环后的值),加上eax(就是0030FE6D左移4位后的值加上本身)
006A977C |. 81C3 D4A31300 add ebx,0x13A3D4 ; ebx再加上 0x13A3D4
006A9782 |. 81F3 8DED5900 xor ebx,0x59ED8D ; ebx的值与0x59ED8D异或 03396F56
006A9788 |. 8D55 E8 lea edx,[local.6]
006A978B |. 8B45 F8 mov eax,[local.2]
006A978E |. 8B80 98030000 mov eax,dword ptr ds:[eax+0x398]
006A9794 |. E8 0B0AEEFF call Converte.0058A1A4
006A9799 |. 8B45 E8 mov eax,[local.6] ; 假码给eax
006A979C |. E8 BFB1D6FF call Converte.00414960 ; 假码计算call
006A97A1 |. 8BF3 mov esi,ebx ; ebx的值给esi 03396F56
006A97A3 |. 81F6 2473C400 xor esi,0xC47324 ; esi与 0xC47324 进行异或运算 03FD1C72
006A97A9 |. 3BC6 cmp eax,esi 这个地方就是比较用户名计算出来的结果和注册码计算出来的结果是否相等
006A97AB |. 75 19 jnz short Converte.006A97C6
006A97AD |. C645 F7 01 mov byte ptr ss:[ebp-0x9],0x1
006A97B1 |. B8 D0397600 mov eax,Converte.007639D0
006A97B6 |. 8B55 FC mov edx,[local.1]
006A97B9 |. E8 42DAD5FF call Converte.00407200
006A97BE |. 8935 D4397600 mov dword ptr ds:[0x7639D4],esi
006A97C4 |. EB 04 jmp short Converte.006A97CA
006A97C6 |> C645 F7 00 mov byte ptr ss:[ebp-0x9],0x0
006A97CA |> 33C0 xor eax,eax
006A97CC |. 5A pop edx ; Converte.006A936B
006A97CD |. 59 pop ecx ; Converte.006A936B
006A97CE |. 59 pop ecx ; Converte.006A936B
006A97CF |. 64:8910 mov dword ptr fs:[eax],edx
006A97D2 |. 68 F7976A00 push Converte.006A97F7
006A97D7 |> 8D45 E8 lea eax,[local.6]
006A97DA |. E8 11DAD5FF call Converte.004071F0
006A97DF |. 8D45 EC lea eax,[local.5]
006A97E2 |. E8 09DAD5FF call Converte.004071F0
006A97E7 |. 8D45 FC lea eax,[local.1]
006A97EA |. E8 01DAD5FF call Converte.004071F0
006A97EF \. C3 retn
上面先来了一个 用户名计算
总结下就是:
将用户名第一位与0x8FA05进行异或,结果加上用户名第二位再与ox8FA05进行异或,这样循环下去一直到用户名最后一位,相对应于xialuohun这个用户名对应的结果为 8F9CA
8F9CA再加上(0030FE6D左移4位后的值加上本身),结果再加上0x13A3D4,结果与0x59ED8D异或,结果为03396F56
现在进去那个假码计算call(我上面有写)
看到了吗,第一个call进去就是假码计算部分了
这里我把代码也复制了出来
00404A04 /$ 53 push ebx
00404A05 |. 56 push esi
00404A06 |. 57 push edi
00404A07 |. 89C6 mov esi,eax
00404A09 |. 50 push eax
00404A0A |. 85C0 test eax,eax
00404A0C |. 0F84 83000000 je Converte.00404A95
00404A12 |. 31C0 xor eax,eax ; 清空eax
00404A14 |. 31DB xor ebx,ebx ; 清空ebx
00404A16 |. BF CCCCCC0C mov edi,0xCCCCCCC ; edi赋值为 0xCCCCCCC
00404A1B |> 66:8B1E /mov bx,word ptr ds:[esi] ; 假码第一位给bx
00404A1E |. 83C6 02 |add esi,0x2
00404A21 |. 66:83FB 20 |cmp bx,0x20
00404A25 |.^ 74 F4 \je short Converte.00404A1B
00404A27 |. B5 00 mov ch,0x0
00404A29 |. 66:83FB 2D cmp bx,0x2D
00404A2D |. 74 76 je short Converte.00404AA5
00404A2F |. 66:83FB 2B cmp bx,0x2B
00404A33 |. 74 72 je short Converte.00404AA7
00404A35 |> 66:83FB 24 cmp bx,0x24
00404A39 |. 74 74 je short Converte.00404AAF
00404A3B |. 66:83FB 78 cmp bx,0x78
00404A3F |. 74 6E je short Converte.00404AAF
00404A41 |. 66:83FB 58 cmp bx,0x58
00404A45 |. 74 68 je short Converte.00404AAF
00404A47 |. 66:83FB 30 cmp bx,0x30
00404A4B |. 75 19 jnz short Converte.00404A66
00404A4D |. 66:8B1E mov bx,word ptr ds:[esi]
00404A50 |. 83C6 02 add esi,0x2
00404A53 |. 66:83FB 78 cmp bx,0x78
00404A57 |. 74 56 je short Converte.00404AAF
00404A59 |. 66:83FB 58 cmp bx,0x58
00404A5D |. 74 50 je short Converte.00404AAF
00404A5F |. 66:85DB test bx,bx
00404A62 |. 74 27 je short Converte.00404A8B
00404A64 |. EB 05 jmp short Converte.00404A6B
00404A66 |> 66:85DB test bx,bx
00404A69 |. 74 35 je short Converte.00404AA0
00404A6B |> 66:83EB 30 /sub bx,0x30
00404A6F |. 66:83FB 09 |cmp bx,0x9
00404A73 |. 77 2B |ja short Converte.00404AA0
00404A75 |. 39F8 |cmp eax,edi
00404A77 |. 77 27 |ja short Converte.00404AA0
00404A79 |. 8D0480 |lea eax,dword ptr ds:[eax+eax*4]
00404A7C |. 01C0 |add eax,eax
00404A7E |. 01D8 |add eax,ebx
00404A80 |. 66:8B1E |mov bx,word ptr ds:[esi]
00404A83 |. 83C6 02 |add esi,0x2
00404A86 |. 66:85DB |test bx,bx
00404A89 |.^ 75 E0 \jnz short Converte.00404A6B
00404A8B |> FECD dec ch
00404A8D |. 74 0B je short Converte.00404A9A
00404A8F |. 85C0 test eax,eax
00404A91 |. 7D 68 jge short Converte.00404AFB
00404A93 |. EB 0B jmp short Converte.00404AA0
00404A95 |> 83C6 02 add esi,0x2
00404A98 |. EB 06 jmp short Converte.00404AA0
00404A9A |> F7D8 neg eax
00404A9C |. 7E 5D jle short Converte.00404AFB
00404A9E |. 78 5B js short Converte.00404AFB
00404AA0 |> 5B pop ebx ; Converte.006A936B
00404AA1 |. 29DE sub esi,ebx
00404AA3 |. EB 59 jmp short Converte.00404AFE
00404AA5 |> FEC5 inc ch
00404AA7 |> 66:8B1E mov bx,word ptr ds:[esi]
00404AAA |. 83C6 02 add esi,0x2
00404AAD |.^ EB 86 jmp short Converte.00404A35
00404AAF |> BF FFFFFF0F mov edi,0xFFFFFFF ; edi赋值为 0xFFFFFFF
00404AB4 |. 66:8B1E mov bx,word ptr ds:[esi]
00404AB7 |. 83C6 02 add esi,0x2
00404ABA |. 66:85DB test bx,bx
00404ABD |.^ 74 D6 je short Converte.00404A95
00404ABF |> 66:83FB 61 /cmp bx,0x61
00404AC3 |. 72 04 |jb short Converte.00404AC9
00404AC5 |. 66:83EB 20 |sub bx,0x20
00404AC9 |> 66:83EB 30 |sub bx,0x30 ; 假码第二位减去30
00404ACD |. 66:83FB 09 |cmp bx,0x9
00404AD1 |. 76 0E |jbe short Converte.00404AE1
00404AD3 |. 66:83EB 11 |sub bx,0x11
00404AD7 |. 66:83FB 05 |cmp bx,0x5
00404ADB |.^ 77 C3 |ja short Converte.00404AA0
00404ADD |. 66:83C3 0A |add bx,0xA ; bx加上A
00404AE1 |> 39F8 |cmp eax,edi
00404AE3 |.^ 77 BB |ja short Converte.00404AA0
00404AE5 |. C1E0 04 |shl eax,0x4 ; eax左移4位
00404AE8 |. 01D8 |add eax,ebx ; eax加上ebx
00404AEA |. 66:8B1E |mov bx,word ptr ds:[esi]
00404AED |. 83C6 02 |add esi,0x2
00404AF0 |. 66:85DB |test bx,bx
00404AF3 |.^ 75 CA \jnz short Converte.00404ABF ; eax就是假码数字
00404AF5 |. FECD dec ch
00404AF7 |. 75 02 jnz short Converte.00404AFB
00404AF9 |. F7D8 neg eax
00404AFB |> 59 pop ecx ; 假码给ecx
00404AFC |. 31F6 xor esi,esi ; 清空esi
00404AFE |> D1EE shr esi,1
00404B00 |. 8932 mov dword ptr ds:[edx],esi
00404B02 |. 5F pop edi ; Converte.006A936B
00404B03 |. 5E pop esi ; Converte.006A936B
00404B04 |. 5B pop ebx ; Converte.006A936B
00404B05 \. C3 retn
总结下假码计算就是
假码第一位如果是x或X 那最后的值就是假码x或X后的内容,
假码和61进行比较 小于的话减去30 结果和9进行比较 小于等于的话就去和 edi(0FFFFFFF)进行比较
大于的话就再减去11,结果和5进行比较 大于就死
简单说下就是 假如假码是x666666 那最后和用户名计算出来的结果进行比较的就是666666
这里我贴出来一个1符合这个算法的用户名和假码
用户名 xialuohun
假码 x03FD1C72
但是很奇怪,提示成功了,但界面居然还是未注册。。。。。。。。。。。。。。。。
可能进了一个假的算法call
软件链接 :链接:http://pan.baidu.com/s/1eSaOFgY 密码:fr8p
来个大佬,帮我分析下,@Shark恒
|