【文章标题】: 屏幕录像专家 V7.0 Build 20070328 算法分析
【文章作者】: 壹只老虎
【作者邮箱】: tiger..tiger@163.com
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
前言:
呵呵,大家好,很久没写文章了,感觉手都好生疏了,3月28号在天空找了个****专家(****专家 V7.0 Build 20070328),这东西不错,我有时候也用来做教程。既然有新版本,那我们就来分析一下吧。
废话:
下载下来,安装,OK,国际惯例,PEID 查壳,发现是这个:Borland C++ 1999 [Overlay],好像没有壳,大吃一惊,呵呵,不大相信,再FI一下,再次增加了我破解的信心。运行下看看。出现了欢迎界面,不喜欢这东西,发现有一个机器码的东西,我凭良心说,我怕这个机器码的东西,后来的经历,证明了我的这种恐惧是正确的,好了,我们“注册”,弹出来一个窗体,叫'注册'窗体,里面有3个输入的地方,其中机器码那里已经被填写好了(怎么算得我还不知道),用户名那里我们可以输入,我就写"tiger",试验码我输入:"12345678"(后来才发现这里需要是数据才行的),我们"确定",弹出提示框"注册失败,请检查你的输入是否有误。",非常好,正是我喜欢的,好了,C32ASM导入查找字符串; 输入"注册失败",找到一些有用的信息:如下:
00443495 注册成功,谢谢您的支持
00443D8D 注册失败,你输入的注册码不支持此新版本
00442FBC 注册失败,请检查你的输入是否有误
00442122 注册失败,请检查你的输入是否有误
00443E14 注册失败,请检查你的输入是否有误
好了,非常好,OD载入,进入在这几个地方下断点,然后写注释。
(说明,对于Borland C++或者Borland Delphi写的程序,可以使用dede来找到相关按钮的点击事件处理代码的偏移,这个软件也是可以的,这里我就不写了,后面会写到的,用dede可以发现"确定"按钮的事件处理代码开始位置是00442E88)
稍微分析一下:
刚才说到在注册提示信息的那几个地方下断点了,但是按钮点击事件处理是在他们上面的,所以我们往上面找,找到开始位置,是这里了:看下面
00442E88 55 push ebp ; 开始分析
00442E89 8BEC mov ebp,esp
00442E8B 81C4 A0FAFFFF add esp,-560
00442E91 53 push ebx
00442E92 56 push esi
00442E93 57 push edi
好了,断点下好了,我们运行起来吧,输入注册名:tiger,试验码:1234567890
"确定"。很好,程序断下来了,在00442E88 ,下面是一段分析过程,很简单。
00442E88 55 push ebp ; 开始分析
00442E89 8BEC mov ebp,esp
00442E8B 81C4 A0FAFFFF add esp,-560
00442E91 53 push ebx
00442E92 56 push esi
00442E93 57 push edi
00442E94 8985 30FFFFFF mov dword ptr ss:[ebp-D0],eax
00442E9A B8 506F5300 mov eax,**专家.00536F50
00442E9F E8 1CB10B00 call **专家.004FDFC0
00442EA4 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],8
00442EAD 8D45 FC lea eax,dword ptr ss:[ebp-4]
00442EB0 E8 B7E9FBFF call **专家.0040186C
00442EB5 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442EBB 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],14
00442EC4 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],20
00442ECD 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00442ED0 E8 97E9FBFF call **专家.0040186C
00442ED5 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442EDB 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],14
00442EE4 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],2C
00442EED 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442EF0 E8 77E9FBFF call **专家.0040186C
00442EF5 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442EFB 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00442EFE 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],14
00442F07 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],38
00442F10 8B95 30FFFFFF mov edx,dword ptr ss:[ebp-D0]
00442F16 8B9A F8020000 mov ebx,dword ptr ds:[edx+2F8]
00442F1C 81C3 08020000 add ebx,208
00442F22 E8 45E9FBFF call **专家.0040186C
00442F27 8BD0 mov edx,eax
00442F29 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442F2F 8B03 mov eax,dword ptr ds:[ebx]
00442F31 8B08 mov ecx,dword ptr ds:[eax]
00442F33 FF51 1C call dword ptr ds:[ecx+1C]
00442F36 8D55 F0 lea edx,dword ptr ss:[ebp-10]
00442F39 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442F3C E8 CF960C00 call **专家.0050C610
00442F41 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00442F47 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00442F4A BA 02000000 mov edx,2
00442F4F E8 8C960C00 call **专家.0050C5E0 ; 取试验码到EDX
00442F54 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],44
00442F5D 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442F60 E8 DFEBFBFF call **专家.00401B44 ; EAX=试验码
00442F65 50 push eax ; 试验码压栈
00442F66 8D45 EC lea eax,dword ptr ss:[ebp-14]
00442F69 8B95 30FFFFFF mov edx,dword ptr ss:[ebp-D0]
00442F6F 52 push edx
00442F70 E8 F7E8FBFF call **专家.0040186C
00442F75 50 push eax
00442F76 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442F7C E8 6F0F0000 call **专家.00443EF0
00442F81 83C4 0C add esp,0C
00442F84 8D55 EC lea edx,dword ptr ss:[ebp-14]
00442F87 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442F8A E8 81960C00 call **专家.0050C610
00442F8F FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00442F95 8D45 EC lea eax,dword ptr ss:[ebp-14]
00442F98 BA 02000000 mov edx,2
00442F9D E8 3E960C00 call **专家.0050C5E0
00442FA2 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442FA5 E8 BAAEFFFF call **专家.0043DE64 ; EAX=试验码长度
00442FAA 83F8 32 cmp eax,32 ; 试验码长度是否>=32H
00442FAD 0F8D 81000000 jge **专家.00443034 ; 这里必须跳走
00442FB3 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],50
00442FBC BA 046B5300 mov edx,**专家.00536B04 ; 注册失败,请检查注册码是否油误
看到了吧,注册码的长度必须要>=50的,不然就失败了。
好了,我们继续运行,输入注册信息:
注册名:tiger, 试验码:123456789012345678901234567890123456789012345678901234567890(一共60位)
"确定",程序到达
00442FAA 83F8 32 cmp eax,32 ; 试验码长度是否>=32H
00442FAD 0F8D 81000000 jge **专家.00443034 ; 这里必须跳走
好了,跳过去了。
接着分析吧:
我们来到第2个地方
00442FC1 8D45 E8 lea eax,dword ptr ss:[ebp-18]
00442FC4 E8 DF930C00 call **专家.0050C3A8
00442FC9 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00442FCF 8B00 mov eax,dword ptr ds:[eax]
00442FD1 E8 5A2A0800 call **专家.004C5A30
00442FD6 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00442FDC 8D45 E8 lea eax,dword ptr ss:[ebp-18]
00442FDF BA 02000000 mov edx,2
00442FE4 E8 F7950C00 call **专家.0050C5E0
00442FE9 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00442FEF 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00442FF2 BA 02000000 mov edx,2
00442FF7 E8 E4950C00 call **专家.0050C5E0
00442FFC FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00443002 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00443005 BA 02000000 mov edx,2
0044300A E8 D1950C00 call **专家.0050C5E0
0044300F FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00443015 8D45 FC lea eax,dword ptr ss:[ebp-4]
00443018 BA 02000000 mov edx,2
0044301D E8 BE950C00 call **专家.0050C5E0
00443022 8B8D 34FFFFFF mov ecx,dword ptr ss:[ebp-CC]
00443028 64:890D 00000000 mov dword ptr fs:[0],ecx
0044302F E9 A10E0000 jmp **专家.00443ED5
00443034 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00443037 E8 08EBFBFF call **专家.00401B44 ; EAX=试验码
0044303C 8BF8 mov edi,eax ; EDI=试验码
0044303E 33C0 xor eax,eax ; EAX=0
00443040 83C9 FF or ecx,FFFFFFFF
00443043 8DB5 ACFAFFFF lea esi,dword ptr ss:[ebp-554]
00443049 F2:AE repne scas byte ptr es:[edi]
0044304B F7D1 not ecx ; ECX=试验码长度+1
0044304D 2BF9 sub edi,ecx ; EDI=试验码
0044304F 8BD1 mov edx,ecx ; EDX=试验码长度+1
00443051 87F7 xchg edi,esi ; ESI=试验码
00443053 C1E9 02 shr ecx,2
00443056 8BC7 mov eax,edi
00443058 F3:A5 rep movs dword ptr es:[edi],dwor>
0044305A 8BCA mov ecx,edx
0044305C 8D85 ACFAFFFF lea eax,dword ptr ss:[ebp-554]
00443062 83E1 03 and ecx,3
00443065 F3:A4 rep movs byte ptr es:[edi],byte > ; 保存试验码到13D95C(堆栈)
00443067 50 push eax
00443068 E8 5FAC0B00 call **专家.004FDCCC
0044306D 8BF0 mov esi,eax
0044306F 59 pop ecx
00443070 8D5E FB lea ebx,dword ptr ds:[esi-5]
00443073 3BF3 cmp esi,ebx
00443075 8D841D ACFAFFFF lea eax,dword ptr ss:[ebp+ebx-55>
0044307C 8985 24FFFFFF mov dword ptr ss:[ebp-DC],eax
00443082 7E 21 jle short **专家.004430A5
00443084 8D56 FB lea edx,dword ptr ds:[esi-5]
00443087 8BCB mov ecx,ebx
00443089 2BCA sub ecx,edx
0044308B 8B85 24FFFFFF mov eax,dword ptr ss:[ebp-DC]
00443091 8A10 mov dl,byte ptr ds:[eax]
00443093 88940D 08FFFFFF mov byte ptr ss:[ebp+ecx-F8],dl
0044309A 43 inc ebx
0044309B FF85 24FFFFFF inc dword ptr ss:[ebp-DC]
004430A1 3BF3 cmp esi,ebx
004430A3 ^ 7F DF jg short **专家.00443084
004430A5 8D7E FB lea edi,dword ptr ds:[esi-5]
004430A8 8D95 08FFFFFF lea edx,dword ptr ss:[ebp-F8]
004430AE 2BDF sub ebx,edi
004430B0 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
004430B3 C6841D 08FFFFFF 0>mov byte ptr ss:[ebp+ebx-F8],0
004430BB 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],5C
004430C4 E8 DF920C00 call **专家.0050C3A8
004430C9 8BD0 mov edx,eax
004430CB FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
004430D1 8D45 F8 lea eax,dword ptr ss:[ebp-8]
004430D4 E8 37950C00 call **专家.0050C610
004430D9 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
004430DF 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
004430E2 BA 02000000 mov edx,2
004430E7 E8 F4940C00 call **专家.0050C5E0
004430EC 57 push edi
004430ED 8D8D ACFAFFFF lea ecx,dword ptr ss:[ebp-554] ; ECX=试验码
004430F3 51 push ecx ; 试验码压栈
004430F4 A1 F4265500 mov eax,dword ptr ds:[5526F4]
004430F9 8B10 mov edx,dword ptr ds:[eax]
004430FB 52 push edx ; 压栈
004430FC E8 6BB1FFFF call **专家.0043E26C ; 用试验码(最后5位不参与运算)计算得
;到一个数->EAX,这里我们需要跟入。
;
00443101 0FB7C8 movzx ecx,ax ; ECX=AX(这个数据有用)
00443104 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00443107 8BF1 mov esi,ecx ; ESI=ECX
00443109 83C4 0C add esp,0C
0044310C E8 2F970C00 call **专家.0050C840 ; EAX=试验码最后5位数据
00443111 3BF0 cmp esi,eax ; 比较ESI是否和EAX相等
00443113 0F84 81000000 je **专家.0044319A ; 这是第一关,必须跳走
00443119 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],68
00443122 BA 256B5300 mov edx,**专家.00536B25 ; 注册失败,请检查注册码是否油误
00443127 8D45 E0 lea eax,dword ptr ss:[ebp-20]
跟入0043E26C
第一个算法分析,的确不知道是怎么算得!我的注册机代码基本和这个汇编代码差不多,如果哪位兄弟能给他精简为循环实现,望指点。设试验码为N位,那么这里对其前N-5进行运算。得到一个数据,和试验码最后5位进行比较,第一个验证,必须相等。
0043E26C 55 push ebp
0043E26D 8BEC mov ebp,esp
0043E26F 56 push esi
0043E270 57 push edi
0043E271 8B75 0C mov esi,dword ptr ss:[ebp+C] ; ESI=试验码
0043E274 33C0 xor eax,eax ; EAX=0
0043E276 33C9 xor ecx,ecx ; ECX=0
0043E278 81F9 6DB20000 cmp ecx,0B26D ; ECX=0B26D?
0043E27E 75 30 jnz short **专家.0043E2B0 ; 不相等就跳
0043E280 33FF xor edi,edi ; EDI=0
0043E282 3B7D 10 cmp edi,dword ptr ss:[ebp+10] ; 试验码长度-5和edi比较
0043E285 7D 29 jge short **专家.0043E2B0 ; >=就跳
0043E287 41 inc ecx ; ecx+1
0043E288 B2 80 mov dl,80 ; dl=80H
0043E28A F6C4 80 test ah,80
0043E28D 74 09 je short **专家.0043E298
0043E28F 03C0 add eax,eax
0043E291 66:35 2110 xor ax,1021
0043E295 41 inc ecx
0043E296 EB 02 jmp short **专家.0043E29A
0043E298 03C0 add eax,eax
0043E29A 41 inc ecx
0043E29B 8416 test byte ptr ds:[esi],dl
0043E29D 74 04 je short **专家.0043E2A3
0043E29F 66:35 2110 xor ax,1021
0043E2A3 D0EA shr dl,1
0043E2A5 84D2 test dl,dl
0043E2A7 ^ 75 E1 jnz short **专家.0043E28A
0043E2A9 46 inc esi
0043E2AA 47 inc edi
0043E2AB 3B7D 10 cmp edi,dword ptr ss:[ebp+10]
0043E2AE ^ 7C D7 jl short **专家.0043E287
0043E2B0 41 inc ecx ; ECX+1
0043E2B1 81F9 A0860100 cmp ecx,186A0 ; ECX=186A0?
0043E2B7 ^ 7C BF jl short **专家.0043E278 ; <就跳
0043E2B9 5F pop edi
0043E2BA 5E pop esi
0043E2BB 5D pop ebp
0043E2BC C3 retn
这里需要说一下的是,怎么调试让这里不跳向失败,我不建议使用暴力手段,因为我怕后面可能会用到这些数据。
解决方法是:在次注册。把试验码的最后五位改掉,就改成这个比较的地方的esi的10进制数据,其他位不要变。
如果esi的10进制不足5位,那么在前面加0,补足5位。
比如试验码可以改为:
123456789012345678901234567890123456789012345678901234503616
0044310C E8 2F970C00 call **专家.0050C840 ; EAX=试验码最后5位数据
00443111 3BF0 cmp esi,eax ; 比较ESI是否和EAX相等
00443113 0F84 81000000 je **专家.0044319A ; 这是第一关,必须跳走
这段算法就不说了,我也说不清楚,反正就这样!嘿嘿!
继续吧:
看下一段:
00443127 8D45 E0 lea eax,dword ptr ss:[ebp-20]
0044312A E8 79920C00 call **专家.0050C3A8
0044312F FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
00443135 8B00 mov eax,dword ptr ds:[eax]
00443137 E8 F4280800 call **专家.004C5A30
0044313C FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00443142 8D45 E0 lea eax,dword ptr ss:[ebp-20]
00443145 BA 02000000 mov edx,2
0044314A E8 91940C00 call **专家.0050C5E0
0044314F FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00443155 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00443158 BA 02000000 mov edx,2
0044315D E8 7E940C00 call **专家.0050C5E0
00443162 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
00443168 8D45 F8 lea eax,dword ptr ss:[ebp-8]
0044316B BA 02000000 mov edx,2
00443170 E8 6B940C00 call **专家.0050C5E0
00443175 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
0044317B 8D45 FC lea eax,dword ptr ss:[ebp-4]
0044317E BA 02000000 mov edx,2
00443183 E8 58940C00 call **专家.0050C5E0
00443188 8B8D 34FFFFFF mov ecx,dword ptr ss:[ebp-CC]
0044318E 64:890D 00000000 mov dword ptr fs:[0],ecx
00443195 E9 3B0D0000 jmp **专家.00443ED5
0044319A 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],74
004431A3 8B15 F4265500 mov edx,dword ptr ds:[5526F4] ; **专家._MainForm
004431A9 8D85 ACFAFFFF lea eax,dword ptr ss:[ebp-554] ; EAX=试验码
004431AF 50 push eax
004431B0 8D45 DC lea eax,dword ptr ss:[ebp-24]
004431B3 8B0A mov ecx,dword ptr ds:[edx]
004431B5 51 push ecx
004431B6 E8 B1E6FBFF call **专家.0040186C
004431BB 50 push eax
004431BC FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
004431C2 E8 45B0FCFF call **专家.0040E20C ; 关键算法,跟进去(取得一个字符串)
004431C7 83C4 0C add esp,0C
004431CA 8D55 DC lea edx,dword ptr ss:[ebp-24]
004431CD 8D45 FC lea eax,dword ptr ss:[ebp-4]
004431D0 E8 3B940C00 call **专家.0050C610
004431D5 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
004431DB 8D45 DC lea eax,dword ptr ss:[ebp-24]
004431DE BA 02000000 mov edx,2
这一段就需要分析一个算法。
比较简单的,我们的进去。
跟入0040E20C:
0040E20C 55 push ebp
0040E20D 8BEC mov ebp,esp
0040E20F 81C4 08FFFFFF add esp,-0F8
0040E215 53 push ebx
0040E216 56 push esi ; 上一个算法的结果压栈
0040E217 B8 3C145300 mov eax,**专家.0053143C
0040E21C E8 9FFD0E00 call **专家.004FDFC0
0040E221 66:C745 E0 0800 mov word ptr ss:[ebp-20],8
0040E227 8D45 FC lea eax,dword ptr ss:[ebp-4]
0040E22A E8 3D36FFFF call **专家.0040186C
0040E22F FF45 EC inc dword ptr ss:[ebp-14]
0040E232 66:C745 E0 1400 mov word ptr ss:[ebp-20],14
0040E238 6A 28 push 28
0040E23A 8B55 10 mov edx,dword ptr ss:[ebp+10] ; EDX=试验码
0040E23D 52 push edx ; 试验码压栈
0040E23E 8D8D 6CFFFFFF lea ecx,dword ptr ss:[ebp-94]
0040E244 51 push ecx
0040E245 E8 DEF80E00 call **专家.004FDB28
0040E24A 8A85 6EFFFFFF mov al,byte ptr ss:[ebp-92] ; 下面这段在将试验码前40位的指定位互换
0040E250 8A55 92 mov dl,byte ptr ss:[ebp-6E]
0040E253 8895 6EFFFFFF mov byte ptr ss:[ebp-92],dl
0040E259 8845 92 mov byte ptr ss:[ebp-6E],al ; 第3位和第39位互换
0040E25C 8A85 70FFFFFF mov al,byte ptr ss:[ebp-90]
0040E262 8A55 85 mov dl,byte ptr ss:[ebp-7B]
0040E265 8895 70FFFFFF mov byte ptr ss:[ebp-90],dl
0040E26B 8845 85 mov byte ptr ss:[ebp-7B],al ; 第5位和第26位互换
0040E26E 8A85 75FFFFFF mov al,byte ptr ss:[ebp-8B] ; AL=试验码第10位
0040E274 8A55 8B mov dl,byte ptr ss:[ebp-75] ; DL=试验码第32位
0040E277 8895 75FFFFFF mov byte ptr ss:[ebp-8B],dl ; 试验码第10位=DL
0040E27D 83C4 0C add esp,0C
0040E280 33DB xor ebx,ebx ; EBX=0,循环的计数器
0040E282 8845 8B mov byte ptr ss:[ebp-75],al ; [EBP-75]=AL(交换前的第10位)
0040E285 8DB5 6CFFFFFF lea esi,dword ptr ss:[ebp-94] ; ESI=试验码第一位的地址
0040E28B 8A06 mov al,byte ptr ds:[esi] ; AL=逐位取试验码
0040E28D 43 inc ebx ; EBX=EBX+1
0040E28E 46 inc esi ; ESI=ESI+1
0040E28F 8885 08FFFFFF mov byte ptr ss:[ebp-F8],al ; [EBP-F8]=AL
0040E295 8D45 F8 lea eax,dword ptr ss:[ebp-8] ; EAX=[EBP-8]
0040E298 8A16 mov dl,byte ptr ds:[esi] ; dL=取下一位试验码
0040E29A 8895 09FFFFFF mov byte ptr ss:[ebp-F7],dl ; [EBP-F7]=DL
0040E2A0 8D95 08FFFFFF lea edx,dword ptr ss:[ebp-F8] ; EDX=[EBP-F8]=上面取得这两个字符
0040E2A6 C685 0AFFFFFF 00 mov byte ptr ss:[ebp-F6],0
0040E2AD 66:C745 E0 2000 mov word ptr ss:[ebp-20],20
0040E2B3 E8 F0E00F00 call **专家.0050C3A8
0040E2B8 8BD0 mov edx,eax
0040E2BA FF45 EC inc dword ptr ss:[ebp-14]
0040E2BD 8D45 FC lea eax,dword ptr ss:[ebp-4]
0040E2C0 E8 4BE30F00 call **专家.0050C610
0040E2C5 FF4D EC dec dword ptr ss:[ebp-14]
0040E2C8 8D45 F8 lea eax,dword ptr ss:[ebp-8]
0040E2CB BA 02000000 mov edx,2 ; EDX=2
0040E2D0 E8 0BE30F00 call **专家.0050C5E0
0040E2D5 8D45 FC lea eax,dword ptr ss:[ebp-4]
0040E2D8 E8 63E50F00 call **专家.0050C840 ; 将EDX的字符串转换为数据保存到EAX
0040E2DD 8BD3 mov edx,ebx ; EDX=EBX
0040E2DF D1FA sar edx,1 ; EDX DIV 2
0040E2E1 79 03 jns short **专家.0040E2E6 ; EDX=0就跳
0040E2E3 83D2 00 adc edx,0
0040E2E6 03C2 add eax,edx ; EAX=EAX+EDX
0040E2E8 43 inc ebx ; EBX+1
0040E2E9 83C0 09 add eax,9 ; EAX+9
0040E2EC 46 inc esi ; ESI+1
0040E2ED 83FB 28 cmp ebx,28 ; 是否遍历结束
0040E2F0 888415 6CFFFFFF mov byte ptr ss:[ebp+edx-94],a>; 交换后的字符串从第1位开始用AL覆盖
0040E2F7 ^ 7C 92 jl short **专家.0040E28B ;
0040E2F9 C645 80 00 mov byte ptr ss:[ebp-80],0 ; 上面结果的下一位=0
0040E2FD 66:C745 E0 2C00 mov word ptr ss:[ebp-20],2C
0040E303 8D95 6CFFFFFF lea edx,dword ptr ss:[ebp-94] ; EDX=上面的结果字符串的首指针
0040E309 8D45 F4 lea eax,dword ptr ss:[ebp-C]
0040E30C E8 97E00F00 call **专家.0050C3A8
0040E311 8BD0 mov edx,eax
0040E313 FF45 EC inc dword ptr ss:[ebp-14]
0040E316 8B45 08 mov eax,dword ptr ss:[ebp+8]
0040E319 E8 F2E20F00 call **专家.0050C610
0040E31E 8B45 08 mov eax,dword ptr ss:[ebp+8]
0040E321 BA 02000000 mov edx,2
0040E326 66:C745 E0 3800 mov word ptr ss:[ebp-20],38
0040E32C 50 push eax
0040E32D 8D45 F4 lea eax,dword ptr ss:[ebp-C]
0040E330 FF4D EC dec dword ptr ss:[ebp-14]
0040E333 E8 A8E20F00 call **专家.0050C5E0
0040E338 FF4D EC dec dword ptr ss:[ebp-14]
0040E33B 8D45 FC lea eax,dword ptr ss:[ebp-4]
0040E33E BA 02000000 mov edx,2
0040E343 E8 98E20F00 call **专家.0050C5E0
0040E348 58 pop eax
0040E349 66:C745 E0 2C00 mov word ptr ss:[ebp-20],2C
0040E34F FF45 EC inc dword ptr ss:[ebp-14]
0040E352 8B55 D0 mov edx,dword ptr ss:[ebp-30]
0040E355 64:8915 00000000 mov dword ptr fs:[0],edx
0040E35C 5E pop esi
0040E35D 5B pop ebx
0040E35E 8BE5 mov esp,ebp
0040E360 5D pop ebp
0040E361 C3 retn
总结一下上面这个循环的作用是:对已经做过位交换处理的试验码,对其前20位重新计算覆盖,生成新的字符串,设他为str
具体算法看注册机。
我们继续分析下一段:
004431C7 83C4 0C add esp,0C
004431CA 8D55 DC lea edx,dword ptr ss:[ebp-24]
004431CD 8D45 FC lea eax,dword ptr ss:[ebp-4]
004431D0 E8 3B940C00 call **专家.0050C610
004431D5 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
004431DB 8D45 DC lea eax,dword ptr ss:[ebp-24]
004431DE BA 02000000 mov edx,2
004431E3 E8 F8930C00 call **专家.0050C5E0
004431E8 6A 14 push 14
004431EA 6A 00 push 0
004431EC 8D8D F0FEFFFF lea ecx,dword ptr ss:[ebp-110]
004431F2 51 push ecx
004431F3 E8 A0A90B00 call **专家.004FDB98
004431F8 83C4 0C add esp,0C
004431FB 33FF xor edi,edi
004431FD 6A 14 push 14
004431FF 6A 00 push 0
00443201 8D85 08FFFFFF lea eax,dword ptr ss:[ebp-F8]
00443207 50 push eax
00443208 E8 8BA90B00 call **专家.004FDB98
0044320D 83C4 0C add esp,0C
00443210 8D95 C4FEFFFF lea edx,dword ptr ss:[ebp-13C]
00443216 6A 14 push 14
00443218 6A 00 push 0
0044321A 52 push edx
0044321B E8 78A90B00 call **专家.004FDB98
00443220 83C4 0C add esp,0C
00443223 66:C785 44FFFFFF >mov word ptr ss:[ebp-BC],80
0044322C 8D45 D8 lea eax,dword ptr ss:[ebp-28]
0044322F E8 38E6FBFF call **专家.0040186C
00443234 8BD0 mov edx,eax
00443236 FF85 50FFFFFF inc dword ptr ss:[ebp-B0]
0044323C 8B8D 30FFFFFF mov ecx,dword ptr ss:[ebp-D0]
00443242 8B81 DC020000 mov eax,dword ptr ds:[ecx+2DC]
00443248 E8 FB7B0800 call **专家.004CAE48
0044324D 8D45 D8 lea eax,dword ptr ss:[ebp-28]
00443250 E8 EFE8FBFF call **专家.00401B44 ; 取用户名
00443255 57 push edi
00443256 8BF8 mov edi,eax ; EDI=用户名
00443258 33C0 xor eax,eax
0044325A 83C9 FF or ecx,FFFFFFFF
0044325D F2:AE repne scas byte ptr es:[edi]
0044325F F7D1 not ecx ; ECX=注册名长度+1
00443261 2BF9 sub edi,ecx
00443263 8DB5 C4FEFFFF lea esi,dword ptr ss:[ebp-13C]
00443269 87F7 xchg edi,esi ; ESI=用户名
0044326B 8BD1 mov edx,ecx ; EDX=ECX
0044326D 8BC7 mov eax,edi
0044326F C1E9 02 shr ecx,2 ; ECX=ECX DIV 4
00443272 8D45 D8 lea eax,dword ptr ss:[ebp-28]
00443275 F3:A5 rep movs dword ptr es:[edi],dw>
00443277 8BCA mov ecx,edx ; ECX=EDX
00443279 BA 02000000 mov edx,2 ; EDX=2
0044327E 83E1 03 and ecx,3 ; ECX=ECX AND 3
00443281 F3:A4 rep movs byte ptr es:[edi],byt>; 用户名保存
00443283 5F pop edi
00443284 FF8D 50FFFFFF dec dword ptr ss:[ebp-B0]
0044328A E8 51930C00 call **专家.0050C5E0
0044328F C685 D7FEFFFF 00 mov byte ptr ss:[ebp-129],0
00443296 8B85 30FFFFFF mov eax,dword ptr ss:[ebp-D0]
0044329C 05 00030000 add eax,300
这一段没什么好说的,略过,
继续下一段:
0044329C 05 00030000 add eax,300
004432A1 E8 9EE8FBFF call **专家.00401B44 ; 注意这里EAX里面出来一组数据(后来发现 ;这组数据是很早以前就算好了的,
;怎么算出来的,马上讨论)
004432A6 57 push edi ; 设这组数据为s1(字符串数据)
004432A7 8BF8 mov edi,eax ; EDI=s1
004432A9 33C0 xor eax,eax ; EAX=0
004432AB 83C9 FF or ecx,FFFFFFFF
004432AE F2:AE repne scas byte ptr es:[edi]
004432B0 F7D1 not ecx ; ECX=s1长度+1
004432B2 2BF9 sub edi,ecx
004432B4 8DB5 F0FEFFFF lea esi,dword ptr ss:[ebp-110]
004432BA 87F7 xchg edi,esi ; ESI=s1
004432BC 8BD1 mov edx,ecx ; EDX=ECX
004432BE 8BC7 mov eax,edi ; EAX=EDI
004432C0 C1E9 02 shr ecx,2 ; ECX=ECX DIV 4
004432C3 8D85 F0FEFFFF lea eax,dword ptr ss:[ebp-110]
004432C9 F3:A5 rep movs dword ptr es:[edi],dword >; EAX=s1
004432CB 8BCA mov ecx,edx ; ECX=EDX
004432CD 8D95 C4FEFFFF lea edx,dword ptr ss:[ebp-13C] ; EDX=用户名
004432D3 83E1 03 and ecx,3 ; ECX=ECX AND 3
004432D6 F3:A4 rep movs byte ptr es:[edi],byte pt>
004432D8 5F pop edi
004432D9 8985 20FFFFFF mov dword ptr ss:[ebp-E0],eax ; 保存s1到[EBP-E0]
004432DF 8995 24FFFFFF mov dword ptr ss:[ebp-DC],edx ; 保存用户名到[EBP-DC]
004432E5 8DB5 08FFFFFF lea esi,dword ptr ss:[ebp-F8]
004432EB 33DB xor ebx,ebx ; EBX=0,下面循环的计数器
004432ED 8B8D 24FFFFFF mov ecx,dword ptr ss:[ebp-DC] ; ECX=注册名
004432F3 8B95 20FFFFFF mov edx,dword ptr ss:[ebp-E0] ; EDX=s1
004432F9 8A01 mov al,byte ptr ds:[ecx] ; AL=按位取注册名
004432FB 3202 xor al,byte ptr ds:[edx] ; AL=AL XOR s1的指定位
004432FD 83C4 F8 add esp,-8
00443300 8806 mov byte ptr ds:[esi],al ; 把al写入以esi开始的内存地址
00443302 0FBE0E movsx ecx,byte ptr ds:[esi] ; ECX=AL
00443305 898D A8FAFFFF mov dword ptr ss:[ebp-558],ecx ; [EBP-558]=ECX
0044330B DB85 A8FAFFFF fild dword ptr ss:[ebp-558] ; 装载ECX到ST0
00443311 DD1C24 fstp qword ptr ss:[esp]
00443314 E8 97190C00 call **专家.00504CB0
00443319 83C4 08 add esp,8
0044331C 899D A4FAFFFF mov dword ptr ss:[ebp-55C],ebx
00443322 DB85 A4FAFFFF fild dword ptr ss:[ebp-55C] ; 压入计数器
00443328 DEC9 fmulp st(1),st ; ST0=ST0*ST1=ECX*计数器
0044332A 89BD A0FAFFFF mov dword ptr ss:[ebp-560],edi ; [EBP-560]=EDI
00443330 DB85 A0FAFFFF fild dword ptr ss:[ebp-560] ; 压入[EBP-560]
00443336 DEC1 faddp st(1),st ; ST1=ST1+ST0
00443338 E8 9B190C00 call **专家.00504CD8 ; 保存ST0的16进制到EAX
0044333D 8BF8 mov edi,eax ; EDI=EAX
0044333F 43 inc ebx ; EBX+1
00443340 46 inc esi ; ESI+1
00443341 FF85 20FFFFFF inc dword ptr ss:[ebp-E0] ; 字符串指针后移一位
00443347 FF85 24FFFFFF inc dword ptr ss:[ebp-DC] ; 用户名字符串指针后移一位
0044334D 83FB 14 cmp ebx,14 ; 是否结束?
00443350 ^ 7C 9B jl short **专家.004432ED
00443352 81C7 39300000 add edi,3039 ; X=edi=edi+3039H
00443358 8D95 08FFFFFF lea edx,dword ptr ss:[ebp-F8] ; edx=s1经处理后的字符串
0044335E 57 push edi
0044335F 68 466B5300 push **专家.00536B46 ; ASCII "%d"
00443364 52 push edx
00443365 E8 7ADF0B00 call **专家.005012E4
0044336A 83C4 0C add esp,0C
0044336D 8D45 FC lea eax,dword ptr ss:[ebp-4]
00443370 E8 CFE7FBFF call **专家.00401B44
- 标 题: ****专家 V7.0 算法分析
- 作 者:壹只老虎
- 时 间:2007-04-06 15:48
- 链 接:http://bbs.pediy.com/showthread.php?t=42250