我在破解时,以下一段代码我不知道有何具体作用,请高手给看一下.
ESI为我输入的假密码地址
* Referenced by a CALL at Addresses:
|:00405169 , :004071A6
|
:00402CAC 53 push ebx
:00402CAD 56 push esi
:00402CAE 57 push edi
:00402CAF 89C6 mov esi, eax
:00402CB1 50 push eax
:00402CB2 85C0 test eax, eax
:00402CB4 7451 je 00402D07
:00402CB6 31C0 xor eax, eax
:00402CB8 31DB xor ebx, ebx
:00402CBA BFCCCCCC0C mov edi, 0CCCCCCC
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CC5(C)
|
:00402CBF 8A1E mov bl, byte ptr [esi]
:00402CC1 46 inc esi
:00402CC2 80FB20 cmp bl, 20
:00402CC5 74F8 je 00402CBF
:00402CC7 B500 mov ch, 00
:00402CC9 80FB2D cmp bl, 2D
:00402CCC 7445 je 00402D13
:00402CCE 80FB2B cmp bl, 2B
:00402CD1 7442 je 00402D15
:00402CD3 80FB24 cmp bl, 24
:00402CD6 7442 je 00402D1A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D18(U)
|
:00402CD8 84DB test bl, bl
:00402CDA 7432 je 00402D0E
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CF4(C)
|
:00402CDC 80EB30 sub bl, 30
:00402CDF 80FB09 cmp bl, 09
:00402CE2 772A ja 00402D0E
:00402CE4 39F8 cmp eax, edi
:00402CE6 7726 ja 00402D0E
:00402CE8 8D0480 lea eax, dword ptr [eax+4*eax]
:00402CEB 01C0 add eax, eax
:00402CED 01D8 add eax, ebx
:00402CEF 8A1E mov bl, byte ptr [esi]
:00402CF1 46 inc esi
:00402CF2 84DB test bl, bl
:00402CF4 75E6 jne 00402CDC
:00402CF6 FECD dec ch
:00402CF8 7410 je 00402D0A
:00402CFA 85C0 test eax, eax
:00402CFC 7C10 jl 00402D0E
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D0C(C), :00402D51(U)
|
:00402CFE 59 pop ecx
:00402CFF 31F6 xor esi, esi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D11(U)
|
:00402D01 8932 mov dword ptr [edx], esi
:00402D03 5F pop edi
:00402D04 5E pop esi
:00402D05 5B pop ebx
:00402D06 C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402CB4(C), :00402D24(C)
|
:00402D07 46 inc esi
:00402D08 EB04 jmp 00402D0E
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CF8(C)
|
:00402D0A F7D8 neg eax
:00402D0C 7EF0 jle 00402CFE
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402CDA(C), :00402CE2(C), :00402CE6(C), :00402CFC(C), :00402D08(U)
|:00402D3C(C), :00402D43(C)
|
:00402D0E 5B pop ebx
:00402D0F 29DE sub esi, ebx
:00402D11 EBEE jmp 00402D01
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CCC(C)
|
:00402D13 FEC5 inc ch
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CD1(C)
|
:00402D15 8A1E mov bl, byte ptr [esi]
:00402D17 46 inc esi
:00402D18 EBBE jmp 00402CD8
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CD6(C)
|
:00402D1A BFFFFFFF0F mov edi, 0FFFFFFF
:00402D1F 8A1E mov bl, byte ptr [esi]
:00402D21 46 inc esi
:00402D22 84DB test bl, bl
:00402D24 74E1 je 00402D07
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D4F(C)
|
:00402D26 80FB61 cmp bl, 61
:00402D29 7203 jb 00402D2E
:00402D2B 80EB20 sub bl, 20
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D29(C)
|
:00402D2E 80EB30 sub bl, 30
:00402D31 80FB09 cmp bl, 09
:00402D34 760B jbe 00402D41
:00402D36 80EB11 sub bl, 11
:00402D39 80FB05 cmp bl, 05
:00402D3C 77D0 ja 00402D0E
:00402D3E 80C30A add bl, 0A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D34(C)
|
:00402D41 39F8 cmp eax, edi
:00402D43 77C9 ja 00402D0E
:00402D45 C1E004 shl eax, 04
:00402D48 01D8 add eax, ebx
:00402D4A 8A1E mov bl, byte ptr [esi]
:00402D4C 46 inc esi
:00402D4D 84DB test bl, bl
:00402D4F 75D5 jne 00402D26
:00402D51 EBAB jmp 00402CFE
:00402D53 C3 ret
标 题:这是一个很典型的函数,相当于C语言中的atoi( )、atol(
)函数 (939字)
发信人:dr0
时 间:2000-8-18 10:56:35
详细信息:
就是把字符串转换成对应的整数,比如将串“123456”转换成整数123456,“-787878”转换成-787878。破解注册码的时候会经常碰到,不用在这个函数中单步跟踪,直接按一下F12返回,这时在EAX寄存器中存放的就是转换结果,看它如何处理这个转换结果即可。
这个函数可能会有变形,即在不同的编译器中的具体实现代码稍有不同,可以用下面的特征代码识别,即只要看到这段代码基本上可以断定是个atol( )函数,因为这是在判断正负号(若为负数则返回前有个求补操作,即neg eax):
cmp bl, 2D
je 00402D13
..........
cmp bl, 2B
je 00402D15
转换用的是秦九韶多项式算法,因为任何十进制数均可以展开成10的多项式的形式。不停地乘以10,然后再加上当前位即可,用下面的指令实现的:
:00402CE8 8D0480 lea eax, dword ptr [eax+4*eax] //乘以5
:00402CEB 01C0 add eax, eax //再乘以2
:00402CED 01D8 add eax, ebx //加上当前位