• 标 题:请高手给看一下这段代码有何作用? (5千字)
  • 作 者:1212
  • 时 间:2000-8-18 10:28:33
  • 链 接:http://bbs.pediy.com

我在破解时,以下一段代码我不知道有何具体作用,请高手给看一下.


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                  //加上当前位