首页
社区
课程
招聘
[原创]逆向工程日记--WINDOWS优化大师
发表于: 2009-7-24 13:31 5162

[原创]逆向工程日记--WINDOWS优化大师

2009-7-24 13:31
5162

前一段时间破解了WINDOWS优化大师,并写BLOG文在qq空间里。但是这篇文章总的来说算是暴力破解——修改原程序绕过序列号校验的代码,达到注册的目的。最近为了锻炼功力决定把它的注册算法逆向出来。说干就干。 我逆向的版本号是7.86.8.1105。
    WINDOWS优化大师是用DEPHI写的,用DEDE分析可以得到注册按钮的入口地址0062196C,在OD里下断点。结合DEDE进行分析一路跟踪到这里
00621C33   E8F077FAFF             call    005C9428
00621C38   3DB2000000             cmp     eax, $000000B2
这里调用一个函数,然后让EAX和0xB2进行比较,如果相等则注册成功。进入函数005C9428查看,DEDE的分析结果是:
005C9428   8BC8                   mov     ecx, eax
005C942A   B201                   mov     dl, $01
* Reference to class TBig5RegChkThread
|
005C942C   A1488F5C00             mov     eax, dword ptr [$005C8F48]
|
005C9431   E8C60A0000             call    005C9EFC
005C9436   8B15406F7500           mov     edx, [$00756F40]
005C943C   8B12                   mov     edx, [edx]
* Reference to field TBig5RegChkThread.OFFS_001C
|
005C943E   89501C                 mov     [eax+$1C], edx
* Reference to field TBig5RegChkThread.OFFS_0018
|
005C9441   C7401814EB6F00         mov     dword ptr [eax+$18], $006FEB14
005C9448   C605BCC2760001         mov     byte ptr [$0076C2BC], $01
* Reference to: Classes.TThread.Resume(TThread);
|
005C944F   E8E81AE6FF             call    0042AF3C
005C9454   B8E8030000             mov     eax, $000003E8
|
005C9459   E8EEA5E3FF             call    00403A4C
005C945E   A10C6F7500             mov     eax, dword ptr [$00756F0C]
005C9463   8B00                   mov     eax, [eax]
* Reference to: ActnMenus.TCustomActionMenuBar.ProcessMessages(TCustomActionMenuBar);
|           or: Forms.TApplication.ProcessMessages(TApplication);
|
005C9465   E88ECFECFF             call    004963F8
005C946A   803DBCC2760000         cmp     byte ptr [$0076C2BC], $00
005C9471   75E1                   jnz     005C9454
005C9473   A1C0C27600             mov     eax, dword ptr [$0076C2C0]
005C9478   C3                     ret
该函数启动一个线程计算注册码,然后把结果放在地址0076C2C0处,也就是说,如果最后的计算结果是0XB2的话,则注册成功。
    继续逆流而上。在0076C2C0下内存写入断点,竟然断不了?那就是注册不成功,则不执行对该地址的写入操作。想点别的办法。查找命令MOV DWORD PTR DS:[76C2C0],0B2, 找到下列地址中有该函数
5CA312
5CA383
5CA3F4
5CA474
5CA4F8
5CA544
(这里还有个小技巧,也不知道是我笨,还是OD的功能所限,查找MOV DWORD PTR DS:[76C2C0],0B2指令时,查找到的总是第一个指令,无法查找下一条指令, 没办法,只能先把找到的指令改成别的,比如MOV DWORD PTR DS:[76C2C0],0B1,然后继续查找,就会找到下一条MOV DWORD PTR DS:[76C2C0],0B2。)
发现它们统统在一个函数调用里面。那十之八九就是计算注册码的线程函数了。该函数的起始地址是5C9F88 , 用OD跟踪上几遍就会发现起运行步骤:
1. 这个函数是先把注册字符串转换成十六进制16字节,即取注册字符串的前32有效字符字符。(把非0-9,A-F的字符全部滤去)。
2. 通过一定的运算计算出16个字节的数据,再把该16字节数据转换成长度为32的字符串。
3. 取该字符串后16位与一个固定字符串进行比较,如果相等,则注册成功,否则注册失败。
    如果要用暴力破解的话,直接把判断是否注册成功的语句改掉就ok了。其实很简单。但我现在的目的是不改动原来的持续,而要把它正确的注册码算出来。接下来的关键就是看步骤2中的加密算法了。
005CA219   > \8D4D C0       LEA ECX,DWORD PTR SS:[EBP-40]
005CA21C   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
005CA21F   .  8D85 F0FEFFFF LEA EAX,DWORD PTR SS:[EBP-110]
005CA225   .  E8 3ED9FCFF   CALL WoptiUti.00597B68
在此调用了该加密算法,即函数00597B68。ECX是输入参数,EDX是输出参数,EAX可以认为是加密密钥,每次都是不变。进入函数体内,可以看到
00597B68  /$  53            PUSH EBX
00597B69  |.  56            PUSH ESI
00597B6A  |.  57            PUSH EDI
00597B6B  |.  55            PUSH EBP
00597B6C  |.  83C4 EC       ADD ESP,-14
00597B6F  |.  890C24        MOV DWORD PTR SS:[ESP],ECX
00597B72  |.  8BDA          MOV EBX,EDX
00597B74  |.  8BF8          MOV EDI,EAX
00597B76  |.  8D5424 04     LEA EDX,DWORD PTR SS:[ESP+4]
00597B7A  |.  8BC3          MOV EAX,EBX
00597B7C  |.  B9 04000000   MOV ECX,4
00597B81  |.  E8 C6B5E6FF   CALL WoptiUti.0040314C
00597B86  |.  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]
00597B8A  |.  8BF3          MOV ESI,EBX
00597B8C  |.  8BC6          MOV EAX,ESI
00597B8E  |.  83C0 04       ADD EAX,4
00597B91  |.  B9 04000000   MOV ECX,4
00597B96  |.  E8 B1B5E6FF   CALL WoptiUti.0040314C
00597B9B  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
00597B9F  |.  8BC6          MOV EAX,ESI
00597BA1  |.  83C0 08       ADD EAX,8
00597BA4  |.  B9 04000000   MOV ECX,4
00597BA9  |.  E8 9EB5E6FF   CALL WoptiUti.0040314C
00597BAE  |.  8D5424 10     LEA EDX,DWORD PTR SS:[ESP+10]
00597BB2  |.  8BC6          MOV EAX,ESI
00597BB4  |.  83C0 0C       ADD EAX,0C
00597BB7  |.  B9 04000000   MOV ECX,4
00597BBC  |.  E8 8BB5E6FF   CALL WoptiUti.0040314C
00597BC1  |.  8B87 CC000000 MOV EAX,DWORD PTR DS:[EDI+CC]
00597BC7  |.  294424 0C     SUB DWORD PTR SS:[ESP+C],EAX
00597BCB  |.  8B87 C8000000 MOV EAX,DWORD PTR DS:[EDI+C8]
00597BD1  |.  294424 04     SUB DWORD PTR SS:[ESP+4],EAX
00597BD5  |.  BE 14000000   MOV ESI,14
00597BDA  |>  8B5C24 04     /MOV EBX,DWORD PTR SS:[ESP+4]
00597BDE  |.  8B4424 10     |MOV EAX,DWORD PTR SS:[ESP+10]
00597BE2  |.  894424 04     |MOV DWORD PTR SS:[ESP+4],EAX
00597BE6  |.  8B4424 0C     |MOV EAX,DWORD PTR SS:[ESP+C]
00597BEA  |.  894424 10     |MOV DWORD PTR SS:[ESP+10],EAX
00597BEE  |.  8B4424 08     |MOV EAX,DWORD PTR SS:[ESP+8]
00597BF2  |.  894424 0C     |MOV DWORD PTR SS:[ESP+C],EAX
00597BF6  |.  895C24 08     |MOV DWORD PTR SS:[ESP+8],EBX
00597BFA  |.  8B4424 10     |MOV EAX,DWORD PTR SS:[ESP+10]
00597BFE  |.  03C0          |ADD EAX,EAX
00597C00  |.  40            |INC EAX
00597C01  |.  F76C24 10     |IMUL DWORD PTR SS:[ESP+10]
00597C05  |.  BA 05000000   |MOV EDX,5
00597C0A  |.  E8 D5FBFFFF   |CALL WoptiUti.005977E4
00597C0F  |.  8BE8          |MOV EBP,EAX
00597C11  |.  8B4424 08     |MOV EAX,DWORD PTR SS:[ESP+8]
00597C15  |.  03C0          |ADD EAX,EAX
00597C17  |.  40            |INC EAX
00597C18  |.  F76C24 08     |IMUL DWORD PTR SS:[ESP+8]
00597C1C  |.  BA 05000000   |MOV EDX,5
00597C21  |.  E8 BEFBFFFF   |CALL WoptiUti.005977E4
00597C26  |.  8BD8          |MOV EBX,EAX
00597C28  |.  8BC6          |MOV EAX,ESI
00597C2A  |.  03C0          |ADD EAX,EAX
00597C2C  |.  FF7487 24     |PUSH DWORD PTR DS:[EDI+EAX*4+24]
00597C30  |.  8B4424 10     |MOV EAX,DWORD PTR SS:[ESP+10]
00597C34  |.  5A            |POP EDX
00597C35  |.  2BC2          |SUB EAX,EDX
00597C37  |.  8BD3          |MOV EDX,EBX
00597C39  |.  E8 BAFBFFFF   |CALL WoptiUti.005977F8
00597C3E  |.  33C5          |XOR EAX,EBP
00597C40  |.  894424 0C     |MOV DWORD PTR SS:[ESP+C],EAX
00597C44  |.  8BC6          |MOV EAX,ESI
00597C46  |.  03C0          |ADD EAX,EAX
00597C48  |.  FF7487 20     |PUSH DWORD PTR DS:[EDI+EAX*4+20]
00597C4C  |.  8B4424 08     |MOV EAX,DWORD PTR SS:[ESP+8]
00597C50  |.  5A            |POP EDX
00597C51  |.  2BC2          |SUB EAX,EDX
00597C53  |.  8BD5          |MOV EDX,EBP
00597C55  |.  E8 9EFBFFFF   |CALL WoptiUti.005977F8
00597C5A  |.  33D8          |XOR EBX,EAX
00597C5C  |.  895C24 04     |MOV DWORD PTR SS:[ESP+4],EBX
00597C60  |.  4E            |DEC ESI
00597C61  |.  85F6          |TEST ESI,ESI
00597C63  |.^ 0F85 71FFFFFF \JNZ WoptiUti.00597BDA
00597C69  |.  8B47 24       MOV EAX,DWORD PTR DS:[EDI+24]
00597C6C  |.  294424 10     SUB DWORD PTR SS:[ESP+10],EAX
00597C70  |.  8B47 20       MOV EAX,DWORD PTR DS:[EDI+20]
00597C73  |.  294424 08     SUB DWORD PTR SS:[ESP+8],EAX
00597C77  |.  8B1424        MOV EDX,DWORD PTR SS:[ESP]
00597C7A  |.  8D4424 04     LEA EAX,DWORD PTR SS:[ESP+4]
00597C7E  |.  B9 04000000   MOV ECX,4
00597C83  |.  E8 C4B4E6FF   CALL WoptiUti.0040314C
00597C88  |.  8B1C24        MOV EBX,DWORD PTR SS:[ESP]
00597C8B  |.  8BD3          MOV EDX,EBX
00597C8D  |.  83C2 04       ADD EDX,4
00597C90  |.  8D4424 08     LEA EAX,DWORD PTR SS:[ESP+8]
00597C94  |.  B9 04000000   MOV ECX,4
00597C99  |.  E8 AEB4E6FF   CALL WoptiUti.0040314C
00597C9E  |.  8BD3          MOV EDX,EBX
00597CA0  |.  83C2 08       ADD EDX,8
00597CA3  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00597CA7  |.  B9 04000000   MOV ECX,4
00597CAC  |.  E8 9BB4E6FF   CALL WoptiUti.0040314C
00597CB1  |.  8BD3          MOV EDX,EBX
00597CB3  |.  83C2 0C       ADD EDX,0C
00597CB6  |.  8D4424 10     LEA EAX,DWORD PTR SS:[ESP+10]
00597CBA  |.  B9 04000000   MOV ECX,4
00597CBF  |.  E8 88B4E6FF   CALL WoptiUti.0040314C
00597CC4  |.  83C4 14       ADD ESP,14
00597CC7  |.  5D            POP EBP
00597CC8  |.  5F            POP EDI
00597CC9  |.  5E            POP ESI
00597CCA  |.  5B            POP EBX
00597CCB  \.  C3            RETN
这就是WINDOWS优化大师核心的注册算法。其中里面调用了一些函数,点进去看看,其实很简单。
CALL 0040314C是内存copy函数。
CALL 005977E4是循环左移位,完全可以用ROL指令替换。
CALL 005977F8是循环右移位,完全可以用ROR指令替换。
OK,用OD把上面函数的反汇编结果转换成汇编代码并把用到的内存数据copy出来,经过调试就是得到一段内嵌汇编的c代码(一开始还想用高级语言重写一下的,后来一想还是直接来汇编的方便。)
运行一下,再和OD中的加密算法出来的结果对比,一样样的,OK。下面开始写逆运算,为了验证逆运算的有效性,我把逆向运算的代码写在注册运算代码之后,也就是说运行完注册算法后立刻运行逆注册运算,看结果和注册之前一样不一样。记过了几番调试,最终的代码如下:
int PassWord[4]  = {0x78563412, 0xEFCDAB90, 0x78563412, 0xEFCDAB90};
BYTE data[] =
{
0xA9, 0x8E, 0xA2, 0x84, 0x5B, 0x08, 0x78, 0x5F, 0xE6, 0xD9, 0x9E, 0x1A, 0x69, 0xD0, 0xBC, 0x4D,
0xCE, 0xEA, 0xA1, 0xD3, 0xEF, 0x63, 0x2D, 0x4A, 0x20, 0x0A, 0x4E, 0xCF, 0xAF, 0xFC, 0xB2, 0xA6,
0x88, 0xA1, 0xB0, 0xC9, 0xA3, 0xB9, 0xC3, 0xE1, 0x7B, 0xBB, 0x96, 0x8B, 0x2F, 0x4F, 0xC4, 0xE6,
0x60, 0x7B, 0xCE, 0x8A, 0x11, 0xB4, 0x11, 0x4F, 0xC3, 0xB8, 0x26, 0x72, 0x25, 0x06, 0x35, 0xB1,
0x33, 0x61, 0x41, 0x00, 0x64, 0xD4, 0x4E, 0xD5, 0x9A, 0x42, 0x43, 0xDD, 0x7B, 0xD3, 0x25, 0xF7,
0x8F, 0x38, 0x85, 0x67, 0xDA, 0x41, 0xFB, 0x84, 0xA7, 0x15, 0x5A, 0x62, 0x7A, 0x6F, 0x14, 0x99,
0x36, 0x46, 0x90, 0x90, 0x23, 0xAC, 0x1C, 0x1B, 0x46, 0x81, 0x22, 0xC6, 0x7D, 0xE9, 0x0B, 0x6B,
0x37, 0x67, 0x5B, 0x4B, 0x4C, 0x69, 0xC1, 0x7D, 0xD4, 0x2C, 0x34, 0x1B, 0x6E, 0xC3, 0x17, 0xFD,
0xEF, 0x04, 0x55, 0x86, 0x6C, 0x31, 0xE5, 0x36, 0x3A, 0xA5, 0x63, 0x62, 0x13, 0xA3, 0xDE, 0x73,
0xFA, 0x9A, 0x6E, 0x28, 0x77, 0xF2, 0x69, 0xD3, 0x5C, 0x0E, 0xA4, 0x8D, 0x33, 0xE9, 0x9F, 0xEE,
0xB1, 0xEB, 0xA7, 0xC6, 0xE9, 0x2C, 0x91, 0x30, 0x14, 0xD8, 0xC6, 0x7F, 0x29, 0xE1, 0xD7, 0xB1,
};
void main()
{
__asm
{
      push ebp
   sub  esp, 20
   mov  edi, offset data
   mov     eax, 0x78563412
   mov  [esp+4], eax
   mov     eax, 0xEFCDAB90
   mov  [esp+8], eax
   mov     eax, 0x78563412
   mov  [esp+0xc], eax
   mov     eax, 0xEFCDAB90
   mov  [esp+0x10], eax
   
   mov     eax, 0xB1D7E129
   sub     dword ptr [esp+0xc], eax
   mov     eax, 0x7FC6D814;
   sub     dword ptr [esp+4], eax
   mov     esi, 0x14
L005:
   mov     ebx, dword ptr [esp+4]
   mov     eax, dword ptr [esp+0x10]
   mov     dword ptr [esp+4], eax
   mov     eax, dword ptr [esp+0xc]
   mov     dword ptr [esp+0x10], eax
   mov     eax, dword ptr [esp+8]
   mov     dword ptr [esp+0xc], eax
   mov     dword ptr [esp+8], ebx
   mov     eax, dword ptr [esp+0x10]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+0x10]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebp, eax
   mov     eax, dword ptr [esp+8]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+8]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebx, eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4+0x4]
   mov     eax, dword ptr [esp+0x10]
   pop     edx
   sub     eax, edx
   mov     edx, ebx
   mov  ecx, edx
   ror     eax, cl
   xor     eax, ebp
   mov     dword ptr [esp+0xc], eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4]
   mov     eax, dword ptr [esp+8]
   pop     edx
   sub     eax, edx
   mov     edx, ebp
   mov  ecx, edx
   ror     eax, cl
   xor     ebx, eax
   mov     dword ptr [esp+4], ebx
   dec     esi
   test    esi, esi
   jnz L005
   mov eax, dword ptr[edi + 4]
   sub dword ptr[esp + 0x10], eax
   mov eax, dword ptr[edi]
   sub dword ptr[esp + 8], eax
   ;reverse
   mov eax, dword ptr[edi]
   add dword ptr[esp + 8], eax
   mov eax, dword ptr[edi + 4]
   add dword ptr[esp + 0x10], eax
   mov esi, 0
L006:
   inc esi
   mov     eax, dword ptr [esp+0x10]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+0x10]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebp, eax
   mov     eax, dword ptr [esp+8]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+8]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebx, eax
-
   mov     eax, dword ptr [esp+0xc]
   xor     eax, ebp
   mov     edx, ebx
   mov  ecx, edx
   rol     eax, cl
   push     eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4+0x4]
   pop     edx
   pop     eax
   add     eax, edx
   mov     dword ptr [esp+0xc], eax
   mov     eax, dword ptr [esp+4]
   xor     eax, ebx
   mov     edx, ebp
   mov  ecx, edx
   rol     eax, cl
   push    eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4]
   pop     edx
   pop     eax
   add     eax, edx
   mov     dword ptr [esp+4], eax
   mov     ebx, dword ptr [esp+4]
   mov  eax, dword ptr [esp+8]
   mov  dword ptr [esp+4], eax
   mov eax, dword ptr [esp+0x0c]
   mov dword ptr [esp+8], eax
   mov eax, dword ptr [esp+0x10]
   mov dword ptr [esp+0xc], eax
   mov dword ptr [esp+0x10], ebx
   cmp esi, 0x14
   jnz L006
   mov     eax, 0xB1D7E129
   add     dword ptr [esp+0xc], eax
   mov     eax, 0x7FC6D814;
   add     dword ptr [esp+4], eax
   mov eax, dword ptr [esp+4]
   mov PassWord[0], eax
   mov eax, dword ptr [esp+8]
   mov PassWord[0] + 4, eax
   
   mov eax, dword ptr [esp+0x0c]
   mov PassWord[0] + 8, eax
   
   mov eax, dword ptr [esp+0x10]
   mov PassWord[0] + 0x0c, eax
   add esp, 20
   pop ebp
  }
}
;reverse 之后的即为逆向算法,最终的注册机代码如下:
int PassWord[4]  = {0};
BYTE data[] =
{
0xA9, 0x8E, 0xA2, 0x84, 0x5B, 0x08, 0x78, 0x5F, 0xE6, 0xD9, 0x9E, 0x1A, 0x69, 0xD0, 0xBC, 0x4D,
0xCE, 0xEA, 0xA1, 0xD3, 0xEF, 0x63, 0x2D, 0x4A, 0x20, 0x0A, 0x4E, 0xCF, 0xAF, 0xFC, 0xB2, 0xA6,
0x88, 0xA1, 0xB0, 0xC9, 0xA3, 0xB9, 0xC3, 0xE1, 0x7B, 0xBB, 0x96, 0x8B, 0x2F, 0x4F, 0xC4, 0xE6,
0x60, 0x7B, 0xCE, 0x8A, 0x11, 0xB4, 0x11, 0x4F, 0xC3, 0xB8, 0x26, 0x72, 0x25, 0x06, 0x35, 0xB1,
0x33, 0x61, 0x41, 0x00, 0x64, 0xD4, 0x4E, 0xD5, 0x9A, 0x42, 0x43, 0xDD, 0x7B, 0xD3, 0x25, 0xF7,
0x8F, 0x38, 0x85, 0x67, 0xDA, 0x41, 0xFB, 0x84, 0xA7, 0x15, 0x5A, 0x62, 0x7A, 0x6F, 0x14, 0x99,
0x36, 0x46, 0x90, 0x90, 0x23, 0xAC, 0x1C, 0x1B, 0x46, 0x81, 0x22, 0xC6, 0x7D, 0xE9, 0x0B, 0x6B,
0x37, 0x67, 0x5B, 0x4B, 0x4C, 0x69, 0xC1, 0x7D, 0xD4, 0x2C, 0x34, 0x1B, 0x6E, 0xC3, 0x17, 0xFD,
0xEF, 0x04, 0x55, 0x86, 0x6C, 0x31, 0xE5, 0x36, 0x3A, 0xA5, 0x63, 0x62, 0x13, 0xA3, 0xDE, 0x73,
0xFA, 0x9A, 0x6E, 0x28, 0x77, 0xF2, 0x69, 0xD3, 0x5C, 0x0E, 0xA4, 0x8D, 0x33, 0xE9, 0x9F, 0xEE,
0xB1, 0xEB, 0xA7, 0xC6, 0xE9, 0x2C, 0x91, 0x30, 0x14, 0xD8, 0xC6, 0x7F, 0x29, 0xE1, 0xD7, 0xB1,
};
void main()
{
__asm
{
      push ebp
   sub  esp, 20
   mov  edi, offset data
   mov  dword ptr[esp+4], 0x78563412   ;这个值可以随便填
   mov  dword ptr[esp+8], 0xEFCDAB90   ;这个值ye  可以随便填
   mov  dword ptr[esp+0x0c], 0x12d762c3
   mov  dword ptr[esp+0x010], 0x35a6b629
   ;reverse
   mov eax, dword ptr[edi]
   add dword ptr[esp + 8], eax
   mov eax, dword ptr[edi + 4]
   add dword ptr[esp + 0x10], eax
   mov esi, 0
L006:
   inc esi
   mov     eax, dword ptr [esp+0x10]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+0x10]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebp, eax
   mov     eax, dword ptr [esp+8]
   add     eax, eax
   inc     eax
   imul    dword ptr [esp+8]
   mov     edx, 5
   mov  ecx, edx
   rol     eax, cl
   mov     ebx, eax
   mov     eax, dword ptr [esp+0xc]
   xor     eax, ebp
   mov     edx, ebx
   mov  ecx, edx
   rol     eax, cl
   push     eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4+0x4]
   pop     edx
   pop     eax
   add     eax, edx
   mov     dword ptr [esp+0xc], eax
   mov     eax, dword ptr [esp+4]
   xor     eax, ebx
   mov     edx, ebp
   mov  ecx, edx
   rol     eax, cl
   push    eax
   mov     eax, esi
   add     eax, eax
   push    dword ptr [edi+eax*4]
   pop     edx
   pop     eax
   add     eax, edx
   mov     dword ptr [esp+4], eax
   mov     ebx, dword ptr [esp+4]
   mov  eax, dword ptr [esp+8]
   mov  dword ptr [esp+4], eax
   mov eax, dword ptr [esp+0x0c]
   mov dword ptr [esp+8], eax
   mov eax, dword ptr [esp+0x10]
   mov dword ptr [esp+0xc], eax
   mov dword ptr [esp+0x10], ebx
   cmp esi, 0x14
   jnz L006
   mov     eax, 0xB1D7E129
   add     dword ptr [esp+0xc], eax
   mov     eax, 0x7FC6D814;
   add     dword ptr [esp+4], eax
   mov eax, dword ptr [esp+4]
   mov PassWord[0], eax
   mov eax, dword ptr [esp+8]
   mov PassWord[0] + 4, eax
   
   mov eax, dword ptr [esp+0x0c]
   mov PassWord[0] + 8, eax
   
   mov eax, dword ptr [esp+0x10]
   mov PassWord[0] + 0x0c, eax
   add esp, 20
   pop ebp
   
  }
  //运算得到的注册码为A282E03E56BB032CC418D93126F525C9
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好贴,楼主辛苦了,
虽然我看不懂,但我会努力的。
2009-7-25 06:19
0
雪    币: 324
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
好久不见有人逆向优化大师了.还以为是逆向功能模块呢....辛苦了.学习~
2009-7-25 09:41
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
我今天也看了看,弄了个爆破:

Windows优化大师(专业版)V7.97 Build 9.706

该版本有个免费注册,点免费注册,会把浏览器主页设置为930网址之家,以后大师每次启动会检测浏览器主页是否为930,如果是,则转换为注册状态,否则为未注册。

因此,修改一下启动时候的检测,就可以每次都注册了,具体如下:

0065E43F   . E8 DCF21500   call    007BD720                                    ; 读取默认浏览器主页
0065E444   . 8D55 DC       lea     edx, dword ptr [ebp-24]
0065E447   . 8B45 F4       mov     eax, dword ptr [ebp-C]
0065E44A   . E8 79E9DAFF   call    0040CDC8
0065E44F   . 8B45 DC       mov     eax, dword ptr [ebp-24]
0065E452   . 50            push    eax
0065E453   . 8D55 D8       lea     edx, dword ptr [ebp-28]
0065E456   . A1 78457F00   mov     eax, dword ptr [7F4578]
0065E45B   . 8B00          mov     eax, dword ptr [eax]
0065E45D   . E8 66E9DAFF   call    0040CDC8
0065E462   . 8B45 D8       mov     eax, dword ptr [ebp-28]
0065E465   . 5A            pop     edx
0065E466   . E8 5D76DAFF   call    00405AC8                                    ; 比较默认主页与 www.930930.com 是否一样
0065E46B   . 85C0          test    eax, eax
0065E46D      7E 0D         jle     short 0065E47C                              ; 不一样,则跳
0065E46F   . 56            push    esi
0065E470   . 68 C8EA6500   push    0065EAC8
0065E475   . 8BC6          mov     eax, esi
0065E477   . E8 60F3DCFF   call    0042D7DC                                    ; 一样,则注册

总之就是修改

0065E46D      7E 0D         jle     short 0065E47C                              ; 不一样,则跳
2009-7-25 10:11
0
雪    币: 324
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
LS的方法比较取巧了。学习一下!
2009-7-26 14:38
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂,学习学习!
2009-7-26 15:11
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
以前也弄过一个。。
呵呵。。
2009-10-11 13:12
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
过来看看~~学习~~
2011-5-5 23:39
0
游客
登录 | 注册 方可回帖
返回
//