首页
社区
课程
招聘
CRACKME算法分析之绝对陷阱
发表于: 2006-5-13 23:06 8659

CRACKME算法分析之绝对陷阱

2006-5-13 23:06
8659

【破文标题】CRACKME算法分析
【破文作者】逍遥风
【破解工具】OD PEID
【破解平台】WINXP
【原版下载】www.crackmes.de
【软件简介】Difficulty: 3 - Getting harder
            Platform: Windows 2000/XP only
            anguage: Assembler
【破解声明】一次郁闷的算法分析,差点砸掉机子。。。。。。菜鸟注意啊
----------------------------------------------------------------------
1)PEID检查,MASM32 / TASM32。无壳
2)直接OD载入,字符串查找, BP GetDlgItemTextA。。。。。。开始分析。
0040142F  |.  6A 15         PUSH 15                                  ; /在这里下断点
00401431  |.  68 F8304000   PUSH asm_cm01.004030F8                   ; |Buffer = asm_cm01.004030F8
00401436  |.  68 E9030000   PUSH 3E9                                 ; |ControlID = 3E9 (1001.)
0040143B  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
0040143E  |.  E8 4F010000   CALL <JMP.&user32.GetDlgItemTextA>       ; \取注册名位数
00401443  |.  83F8 05       CMP EAX,5                                ;  注册名位数与5比较
00401446  |.  73 1F         JNB SHORT asm_cm01.00401467              ;  小于就出错
00401448  |.  6A 00         PUSH 0                                   ; /LanguageID = 0 (LANG_NEUTRAL)
0040144A  |.  6A 00         PUSH 0                                   ; |Style = MB_OK|MB_APPLMODAL
0040144C  |.  68 76304000   PUSH asm_cm01.00403076                   ; |lesco's first assembler crackme
00401451  |.  68 C1304000   PUSH asm_cm01.004030C1                   ; |your name is too short
00401456  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
00401459  |.  E8 46010000   CALL <JMP.&user32.MessageBoxExA>         ; \MessageBoxExA
0040145E  |.  B8 01000000   MOV EAX,1
00401463  |.  C9            LEAVE
00401464  |.  C2 1000       RETN 10
00401467  |>  A3 FC384000   MOV DWORD PTR DS:[4038FC],EAX
0040146C  |.  33C9          XOR ECX,ECX
0040146E  |>  8D15 F8304000 /LEA EDX,DWORD PTR DS:[4030F8]
00401474  |.  0FB61C11      |MOVZX EBX,BYTE PTR DS:[ECX+EDX]         ;  取注册名每一位的ASCII码
00401478  |.  881D 04394000 |MOV BYTE PTR DS:[403904],BL             ;  储存当前注册码的ASCII值,设为A(n)
0040147E  |.  41            |INC ECX                                 ;  每计算一次ECX+1(使ECX=当前计算的次数)
0040147F  |.  51            |PUSH ECX
00401480  |.  0FAF0D FC3840>|IMUL ECX,DWORD PTR DS:[4038FC]          ;  当前计算次数与注册名位数相乘,结果设为B(n)
00401487  |.  83C1 17       |ADD ECX,17                              ;  B(n)+0x17=C(n)
0040148A  |.  83F1 0F       |XOR ECX,0F                              ;  xor[C(n),0x0F],结果设为D(n)
0040148D  |.  33D9          |XOR EBX,ECX                             ;  xor[A(n),D(n)],结果设为E(n)
0040148F  |.  8BC1          |MOV EAX,ECX
00401491  |.  8D0D F8324000 |LEA ECX,DWORD PTR DS:[4032F8]
00401497  |.  030D 00394000 |ADD ECX,DWORD PTR DS:[403900]
0040149D  |.  51            |PUSH ECX
0040149E  |.  50            |PUSH EAX                                ; /<%u>
0040149F  |.  68 12304000   |PUSH asm_cm01.00403012                  ; |%u
004014A4  |.  51            |PUSH ECX                                ; |s
004014A5  |.  E8 D0000000   |CALL <JMP.&user32.wsprintfA>            ; \将D(n)转换成对应的10进制数
004014AA  |.  83C4 0C       |ADD ESP,0C
004014AD  |.  59            |POP ECX
004014AE  |.  51            |PUSH ECX                                ; /String
004014AF  |.  E8 2C010000   |CALL <JMP.&kernel32.lstrlenA>           ; \lstrlenA
004014B4  |.  0105 00394000 |ADD DWORD PTR DS:[403900],EAX
004014BA  |.  59            |POP ECX
004014BB  |.  803D 04394000>|CMP BYTE PTR DS:[403904],0              ;  计算完了吗?
004014C2  |.^ 75 AA         \JNZ SHORT asm_cm01.0040146E             ;  没有就继续
004014C4  |.  68 F4010000   PUSH 1F4                                 ; /Count = 1F4 (500.)
004014C9  |.  68 F8344000   PUSH asm_cm01.004034F8                   ; |Buffer = asm_cm01.004034F8
004014CE  |.  68 EA030000   PUSH 3EA                                 ; |ControlID = 3EA (1002.)
004014D3  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004014D6  |.  E8 B7000000   CALL <JMP.&user32.GetDlgItemTextA>       ; \取输入的注册码的位数
004014DB  |.  66:0BC0       OR AX,AX
004014DE  |.  75 1E         JNZ SHORT asm_cm01.004014FE
004014E0  |.  6A 00         PUSH 0                                   ; /LanguageID = 0 (LANG_NEUTRAL)
004014E2  |.  6A 00         PUSH 0                                   ; |Style = MB_OK|MB_APPLMODAL
004014E4  |.  68 76304000   PUSH asm_cm01.00403076                   ; |lesco's first assembler crackme
004014E9  |.  68 D8304000   PUSH asm_cm01.004030D8                   ; |enter a serial
004014EE  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004014F0  |.  E8 AF000000   CALL <JMP.&user32.MessageBoxExA>         ; \MessageBoxExA
004014F5  |.  B8 01000000   MOV EAX,1
004014FA  |.  C9            LEAVE
004014FB  |.  C2 1000       RETN 10
004014FE  |>  68 F8324000   PUSH asm_cm01.004032F8                   ; /String2 = "18443832585278"(计算得出的字符串)
00401503  |.  68 F8344000   PUSH asm_cm01.004034F8                   ; |String1 = "1234567"(我输入的注册码)
00401508  |.  E8 CD000000   CALL <JMP.&kernel32.lstrcmpA>            ; \好象是真假注册码在比较
0040150D  |.  0BC0          OR EAX,EAX
0040150F  |.  75 15         JNZ SHORT asm_cm01.00401526              ;  不相等就出现错误
00401511  |.  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401513  |.  68 76304000   PUSH asm_cm01.00403076                   ; |lesco's first assembler crackme
00401518  |.  68 96304000   PUSH asm_cm01.00403096                   ; |congrats, u did it!!!
0040151D  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
0040151F  |.  E8 7A000000   CALL <JMP.&user32.MessageBoxA>           ; \成功的提示
00401524  |.  EB 13         JMP SHORT asm_cm01.00401539
00401526  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401528  |.  68 76304000   PUSH asm_cm01.00403076                   ; |lesco's first assembler crackme
0040152D  |.  68 AC304000   PUSH asm_cm01.004030AC                   ; |this serial sucks!!!
00401532  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00401534  |.  E8 65000000   CALL <JMP.&user32.MessageBoxA>           ; \错误提示(注意这里)
00401539  |>  6A 00         PUSH 0                                   ; /ExitCode = 0
0040153B  |.  E8 76000000   CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess

多么经典又完美的过程,为了检验成果把得到那个18443832585278,输入了一便又一便。居然不成功?
(我的注册名是lovetc)。
于是把18443832585278这一串数字变来变去,转换成16进制,MD5计算,SHA,CRC。。。。。总之手头有的都用上了
折腾了好一阵还是没一点头绪,郁闷。

于是继续下跟。当步过00401534 处的CALL时,跳出了错误提示。习惯性的向上翻了一下
突然发现
004014FE  |>  68 F8324000   PUSH asm_cm01.004032F8                   ; /String2 = "18443832585278"(计算得出的字符串)
00401503  |.  68 F8344000   PUSH asm_cm01.004034F8                   ; |String1 = "1234567"(我输入的注册码)
变成了
004014FE  |> \68 F8324000   PUSH asm_cm01.004032F8                   ; /String2 = "b484C8646ea16E429507962"
00401503  |.  68 F8344000   PUSH asm_cm01.004034F8                   ; |String1 = "This serial sucks!!!"
把这个b484C8646ea16E429507962拿去一试,居然成功了。难道算法出错了?????

又跟了一次又一次,没发现一点异常。也没什么可疑的地方,就干脆跟进了00401534  处的CALL(跳出错误提示窗口)
来到这里
0040159E   $- FF25 38204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ;  user32.MessageBoxA
004015A4   $- FF25 34204000 JMP DWORD PTR DS:[<&user32.MessageBoxExA>;  user32.MessageBoxExA
省略一些。。。。。。
004015E0   $- FF25 08204000 JMP DWORD PTR DS:[<&kernel32.lstrlenA>]  ;  kernel32.lstrlenA
004015E6   $- FF25 00204000 JMP DWORD PTR DS:[<&gdi32.CreateFontA>]  ;  GDI32.CreateFontA
正常的不能再正常了。随手点了一下F8,来到这里
77D504EA >- E9 4E0B6B88     JMP asm_cm01.0040103D
77D504EF    833D BC04D777 0>CMP DWORD PTR DS:[77D704BC],0
77D504F6    74 24           JE SHORT user32.77D5051C
77D504F8    64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
77D504FE    6A 00           PUSH 0
77D50500    FF70 24         PUSH DWORD PTR DS:[EAX+24]
77D50503    68 240BD777     PUSH user32.77D70B24
77D50508    FF15 C812D177   CALL DWORD PTR DS:[<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange
都跑到这里了,更没什么搞头了。

乱点两下F8,居然。。。。。。
0040103D  /.  55            PUSH EBP                                 
0040103E  |.  8BEC          MOV EBP,ESP
00401040  |.  8D1D F8304000 LEA EBX,DWORD PTR DS:[4030F8]            ;  使EBX=注册名
00401046  |.  33C0          XOR EAX,EAX                              ;  EAX清零
00401048  |.  66:A1 F830400>MOV AX,WORD PTR DS:[4030F8]              ;  取注册名第2第1位的ASCII码,设为F
0040104E  |.  66:35 2FE3    XOR AX,0E32F                             ;  注册名第2第1位的ASCII码与0xE32F做XOR运算,结果设为F
00401052  |.  66:0FAFC0     IMUL AX,AX                               ;  F*F=G
00401056  |.  66:35 6CAB    XOR AX,0AB6C                             ;  XOR(G,0x0AB6C)=H
0040105A  |.  33C9          XOR ECX,ECX                              ;  ECX清零
0040105C  |.  890D 00394000 MOV DWORD PTR DS:[403900],ECX
00401062  |>  50            /PUSH EAX                                ;  H开始计算
00401063  |.  8D1D F8304000 |LEA EBX,DWORD PTR DS:[4030F8]           ;  使EBX=注册名
00401069  |.  0FB61419      |MOVZX EDX,BYTE PTR DS:[ECX+EBX]         ;  取注册名每一位的ASCII码
0040106D  |.  51            |PUSH ECX
0040106E  |.  66:0FB6C8     |MOVZX CX,AL
00401072  |.  66:0FAFD1     |IMUL DX,CX                              ;  H后两位乘以注册名的ASCII码,得到W(n)
00401076  |.  66:0FB6CC     |MOVZX CX,AH
0040107A  |.  66:0FAFD1     |IMUL DX,CX                              ;  H前两位乘以W(n),得到X(n)
0040107E  |.  59            |POP ECX
0040107F  |.  66:81F2 EB45  |XOR DX,45EB                             ;  XOR(X(n),0x45EB),得到Y(n)
00401084  |.  51            |PUSH ECX
00401085  |.  C1EA 02       |SHR EDX,2                               ;  Y(n)除以,2的平方4
00401088  |.  66:03D2       |ADD DX,DX                               ;  结果乘以2,得到最终结果Z(n)
0040108B  |.  41            |INC ECX                                 ;  每计算一次ECX+1
0040108C  |.  52            |PUSH EDX
0040108D  |.  50            |PUSH EAX
0040108E  |.  53            |PUSH EBX
0040108F  |.  8BC1          |MOV EAX,ECX
00401091  |.  BB 02000000   |MOV EBX,2
00401096  |.  99            |CDQ
00401097  |.  F7FB          |IDIV EBX
00401099  |.  5B            |POP EBX
0040109A  |.  58            |POP EAX
0040109B  |.  0AD2          |OR DL,DL
0040109D  |.  75 08         |JNZ SHORT asm_cm01.004010A7
0040109F  |.  8D35 0C304000 |LEA ESI,DWORD PTR DS:[40300C]
004010A5  |.  EB 06         |JMP SHORT asm_cm01.004010AD
004010A7  |>  8D35 0F304000 |LEA ESI,DWORD PTR DS:[40300F]
004010AD  |>  5A            |POP EDX
004010AE  |.  8D3D F8324000 |LEA EDI,DWORD PTR DS:[4032F8]
004010B4  |.  033D 00394000 |ADD EDI,DWORD PTR DS:[403900]
004010BA  |.  52            |PUSH EDX
004010BB  |.  56            |PUSH ESI                                ; |Format
004010BC  |.  57            |PUSH EDI                                ; |s
004010BD  |.  E8 B8040000   |CALL <JMP.&user32.wsprintfA>            ;
004010C2  |.  83C4 0C       |ADD ESP,0C                              ;  将计算的Z(n),输出
004010C5  |.  57            |PUSH EDI                                ; /String
004010C6  |.  E8 15050000   |CALL <JMP.&kernel32.lstrlenA>           ; \lstrlenA
004010CB  |.  0105 00394000 |ADD DWORD PTR DS:[403900],EAX
004010D1  |.  59            |POP ECX
004010D2  |.  41            |INC ECX
004010D3  |.  58            |POP EAX
004010D4  |.  3B0D FC384000 |CMP ECX,DWORD PTR DS:[4038FC]  
004010DA  |.^ 7C 86         \JL SHORT asm_cm01.00401062
004010DC  |.  8D1D F8324000 LEA EBX,DWORD PTR DS:[4032F8]
004010E2  |.  031D 00394000 ADD EBX,DWORD PTR DS:[403900]
004010E8  |.  C603 00       MOV BYTE PTR DS:[EBX],0
004010EB  |.  68 F8324000   PUSH asm_cm01.004032F8                   ; /String = "b484C8646ea16E429507962"
004010F0  |.  E8 EB040000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
004010F5  |.  50            PUSH EAX
004010F6  |.  68 F8344000   PUSH asm_cm01.004034F8                   ; /String = "1234567"
004010FB  |.  E8 E0040000   CALL <JMP.&kernel32.lstrlenA>            ; \lstrlenA
晕!这才是真正的算法啊。。。。。。
佩服作者的智慧
佩服自己的耐心
----------------------------------------------------------------------
简单对算法总结一下:
1)取注册名前两位的ASCII值,进行计算得到H(双字)
2)H后两位(分析到这里头晕,低位高位什么的也分不清了。。。)乘以注册名每一位的ASII码,得到W(n)
3)H前两位乘以W(n)得到X(n)
4) XOR(X(n),0x45EB),得到Y(n)
5)Y(n)除以4,再乘以2得到Z(n)
6)将每一次计算得到Z(n)合并就得到最后的注册码。
例:
注册名lovetc
注册码b484C8646ea16E429507962
----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整性


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了~~~
2006-5-13 23:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请教下楼主,在分析算法时,进入注册码提取时,是不是每个call都要进入去看啊?
2006-5-14 02:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢!学习
2006-5-14 11:07
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
5
最初由 SeaHome 发布
请教下楼主,在分析算法时,进入注册码提取时,是不是每个call都要进入去看啊?


不用的,最好记住你输入的注册码和注册名的位数.
注意寄存器的值,有的CALL就是取注册信息的位数.就没必要跟进去看了.
当步过有的CALL时,寄存器和堆栈的内容会发生很大的变化,这时最好跟进去看看
呵呵~只是我的一点心得,
最重要的还是多多练习
2006-5-14 12:52
0
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
6
其实这个程序也没有什么很大的陷阱,只是程序在启动的时候,HOOK了MessageBoxA这个API,把它改到了0x0040103D,用到了最常见的5BYTE的JMP跳转的小把戏。
HOOK API的地方:
00401281  |.  68 F8364000   push    004036F8                             ; /FileName = "user32.dll"
00401286  |.  E8 3D030000   call    <jmp.&kernel32.LoadLibraryA>         ; \LoadLibraryA
0040128B  |.  A3 0D394000   mov     [40390D], eax
00401290  |.  8D1D F8364000 lea     ebx, [4036F8]
00401296  |.  B8 7373654D   mov     eax, 4D657373
0040129B  |.  50            push    eax
0040129C  |.  E8 BC020000   call    0040155D
004012A1  |.  8903          mov     [ebx], eax
004012A3  |.  83C3 04       add     ebx, 4
004012A6  |.  B8 42656761   mov     eax, 61676542
004012AB  |.  50            push    eax
004012AC  |.  E8 AC020000   call    0040155D
004012B1  |.  8903          mov     [ebx], eax
004012B3  |.  83C3 04       add     ebx, 4
004012B6  |.  B8 0041786F   mov     eax, 6F784100
004012BB  |.  50            push    eax
004012BC  |.  E8 9C020000   call    0040155D
004012C1  |.  8903          mov     [ebx], eax
004012C3  |.  68 F8364000   push    004036F8                             ; /ProcNameOrOrdinal = "MessageBoxA"
004012C8  |.  FF35 0D394000 push    dword ptr [40390D]                   ; |hModule = 77D10000 (user32)
004012CE  |.  E8 EF020000   call    <jmp.&kernel32.GetProcAddress>       ; \GetProcAddress  ;得到MessageBoxA的地址
004012D3  |.  A3 11394000   mov     [403911], eax ;保存MessageBoxA这个地址
004012D8  |.  8B1D 09394000 mov     ebx, [403909]                        ;  asm_cm01.0040103D
004012DE  |.  83C0 05       add     eax, 5
004012E1  |.  2BD8          sub     ebx, eax
004012E3  |.  8D0D 15394000 lea     ecx, [403915]
004012E9  |.  C601 E9       mov     byte ptr [ecx], 0E9 //以上是做JMP的5 BYTES的跳转,跳转地址是asm_cm01.0040103D
004012EC  |.  41            inc     ecx                                  ;  asm_cm01.00403915
004012ED  |.  8919          mov     [ecx], ebx
004012EF  |.  6A 00         push    0                                    ; /pBytesWritten = NULL
004012F1  |.  6A 05         push    5                                    ; |BytesToWrite = 5
004012F3  |.  68 15394000   push    00403915                             ; |Buffer = asm_cm01.00403915
004012F8  |.  FF35 11394000 push    dword ptr [403911]                   ; |Address = 77D5050B
004012FE  |.  FF35 1A394000 push    dword ptr [40391A]                   ; |hProcess = 0000005C (window)
00401304  |.  E8 CB020000   call    <jmp.&kernel32.WriteProcessMemory>   ; \WriteProcessMemory
//通过修改MessageBoxA的入口,修改成5BYTE的JMP,达到Hook这个API到自己代码的目的。
00401309  |.  C9            leave
0040130A  \.  C2 0400       retn    4

调用部分:
00401467  |> \A3 FC384000   mov     [4038FC], eax
0040146C  |.  33C9          xor     ecx, ecx
0040146E  |>  8D15 F8304000 /lea     edx, [4030F8]
00401474  |.  0FB61C11      |movzx   ebx, byte ptr [ecx+edx]
00401478  |.  881D 04394000 |mov     [403904], bl
0040147E  |.  41            |inc     ecx
0040147F  |.  51            |push    ecx
00401480  |.  0FAF0D FC3840>|imul    ecx, [4038FC]
00401487  |.  83C1 17       |add     ecx, 17
0040148A  |.  83F1 0F       |xor     ecx, 0F
0040148D  |.  33D9          |xor     ebx, ecx
0040148F  |.  8BC1          |mov     eax, ecx
00401491  |.  8D0D F8324000 |lea     ecx, [4032F8]
00401497  |.  030D 00394000 |add     ecx, [403900]
0040149D  |.  51            |push    ecx
0040149E  |.  50            |push    eax                                 ; /<%u>
0040149F  |.  68 12304000   |push    00403012                            ; |Format = "%u"
004014A4  |.  51            |push    ecx                                 ; |s
004014A5  |.  E8 D0000000   |call    <jmp.&user32.wsprintfA>             ; \wsprintfA
004014AA  |.  83C4 0C       |add     esp, 0C
004014AD  |.  59            |pop     ecx
004014AE  |.  51            |push    ecx                                 ; /String
004014AF  |.  E8 2C010000   |call    <jmp.&kernel32.lstrlenA>            ; \lstrlenA
004014B4  |.  0105 00394000 |add     [403900], eax
004014BA  |.  59            |pop     ecx
004014BB  |.  803D 04394000>|cmp     byte ptr [403904], 0
004014C2  |.^ 75 AA         \jnz     short 0040146E
004014C4  |.  68 F4010000   push    1F4                                  ; /Count = 1F4 (500.)
004014C9  |.  68 F8344000   push    004034F8                             ; |Buffer = asm_cm01.004034F8
004014CE  |.  68 EA030000   push    3EA                                  ; |ControlID = 3EA (1002.)
004014D3  |.  FF75 08       push    dword ptr [ebp+8]                    ; |hWnd
004014D6  |.  E8 B7000000   call    <jmp.&user32.GetDlgItemTextA>        ; \GetDlgItemTextA
004014DB  |.  66:0BC0       or      ax, ax
004014DE  |.  75 1E         jnz     short 004014FE
004014E0  |.  6A 00         push    0                                    ; /LanguageID = 0 (LANG_NEUTRAL)
004014E2  |.  6A 00         push    0                                    ; |Style = MB_OK|MB_APPLMODAL
004014E4  |.  68 76304000   push    00403076                             ; |Title = "Lesco's first assembler crackme"
004014E9  |.  68 D8304000   push    004030D8                             ; |Text = "Enter a serial"
004014EE  |.  6A 00         push    0                                    ; |hOwner = NULL
004014F0  |.  E8 AF000000   call    <jmp.&user32.MessageBoxExA>          ; \MessageBoxExA
004014F5  |.  B8 01000000   mov     eax, 1
004014FA  |.  C9            leave
004014FB  |.  C2 1000       retn    10
004014FE  |>  68 F8324000   push    004032F8                             ; /String2 = ""
00401503  |.  68 F8344000   push    004034F8                             ; |String1 = ""
00401508  |.  E8 CD000000   call    <jmp.&kernel32.lstrcmpA>             ; \lstrcmpA
0040150D  |.  0BC0          or      eax, eax
0040150F  |.  75 15         jnz     short 00401526
00401511  |.  6A 00         push    0                                    ; /Style = MB_OK|MB_APPLMODAL
00401513  |.  68 76304000   push    00403076                             ; |Title = "Lesco's first assembler crackme"
00401518  |.  68 96304000   push    00403096                             ; |Text = "Congrats, u did it!!!"
0040151D  |.  6A 00         push    0                                    ; |hOwner = NULL
0040151F  |.  E8 7A000000   call    <jmp.&user32.MessageBoxA>            ; \MessageBoxA ;这里全都Hook到asm_cm01.0040103D
00401524  |.  EB 13         jmp     short 00401539
00401526  |>  6A 00         push    0                                    ; /Style = MB_OK|MB_APPLMODAL
00401528  |.  68 76304000   push    00403076                             ; |Title = "Lesco's first assembler crackme"
0040152D  |.  68 AC304000   push    004030AC                             ; |Text = "This serial sucks!!!"
00401532  |.  6A 00         push    0                                    ; |hOwner = NULL
00401534  |.  E8 65000000   call    <jmp.&user32.MessageBoxA>            ; \MessageBoxA ;这里全都Hook到asm_cm01.0040103D
00401539  |>  6A 00         push    0                                    ; /ExitCode = 0
0040153B  |.  E8 76000000   call    <jmp.&kernel32.ExitProcess>          ; \ExitProcess
00401540  |>  837D 14 00    cmp     dword ptr [ebp+14], 0
00401544  |.  74 0E         je      short 00401554
00401546  |.  8B55 10       mov     edx, [ebp+10]
00401549  |.  C1EA 10       shr     edx, 10
0040154C  |.  EB 06         jmp     short 00401554
0040154E  |>  33C0          xor     eax, eax
00401550  |.  C9            leave
00401551  |.  C2 1000       retn    10

真正的比较是在asm_cm01.0040103D里面进行的,这里我只是说一下这个程序中用到的小把戏。
2006-5-14 13:45
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
7
恩!太好了,认真学习了。。。
对于我这样的菜鸟可就是大陷阱了
2006-5-14 15:45
0
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
8
最初由 逍遥风 发布
恩!太好了,认真学习了。。。
对于我这样的菜鸟可就是大陷阱了

呵呵,你太谦虚了
2006-5-14 16:48
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
9
等我玩加密算法的时候
还得多多指教呢。。。
2006-5-14 17:21
0
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
10
最初由 逍遥风 发布
等我玩加密算法的时候
还得多多指教呢。。。

欢迎交流,QQ 448089717
2006-5-14 17:48
0
雪    币: 424
活跃值: (3353)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
此CRACKME与操作系统有关,且算法不一样:

           在Win98下可运行     name: lovetc    code: 18443832585278
           在Win2000下不能运行
           在WinXP下可运行    name: lovetc   code: b484C8646ea16E429507962
2006-5-14 17:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
支持 & 学习了```
2006-5-14 18:50
0
雪    币: 237
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
强啊。以前我自己还有这个思路来着,原来高手早用过啦~
2006-5-14 21:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢楼主啊。。。
2006-5-20 12:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看晕了 还得从基础开始了
2006-5-21 18:52
0
雪    币: 241
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持 & 学习了```
支持 & 学习了```
2006-5-22 02:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
又总结了一下思路.
2006-5-22 05:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tdk
18
天啊~! 佩服
我这两天刚学,随便找了一个足彩软件,跟踪了半天
居然还找不到自己输入的注册信息 晕阿
我对照这od入门1,2看了半天 也看不懂问题在哪儿:(
2006-5-23 18:57
0
游客
登录 | 注册 方可回帖
返回
//