fonge 发表于 2007-2-6 12:45:55

【算法追踪】crackme1.5.一只老虎.c

【文章标题】: 算法追踪之壹只老虎 crackme1.5
【文章作者】: fonge
【作者邮箱】: [email protected]
【作者QQ号】: 170247260
【编写语言】: C
【使用工具】: OllyICE1.10修改版
【操作平台】: WXP+SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
00401000/$55            push    ebp
00401001|.8BEC          mov   ebp, esp
00401003|.83EC 58       sub   esp, 58
00401006|.68 30704000   push    00407030                         ;======================================================\n
0040100B|.E8 55040000   call    00401465
00401010|.83C4 04       add   esp, 4
00401013|.68 68704000   push    00407068                         ;==============壹只老虎crackme1.5--(c语言)=============\n
00401018|.E8 48040000   call    00401465
0040101D|.83C4 04       add   esp, 4
00401020|.68 A0704000   push    004070A0                         ;======================2007-2-3========================\n
00401025|.E8 3B040000   call    00401465
0040102A|.83C4 04       add   esp, 4
0040102D|.68 D8704000   push    004070D8                         ;请输入注册名:
00401032|.E8 2E040000   call    00401465
00401037|.83C4 04       add   esp, 4
0040103A|.8D45 A8       lea   eax, dword ptr
0040103D|.50            push    eax
0040103E|.E8 D8030000   call    0040141B
00401043|.83C4 04       add   esp, 4
00401046|.68 E8704000   push    004070E8                         ;请输入注册码:
0040104B|.E8 15040000   call    00401465
00401050|.83C4 04       add   esp, 4
00401053|.8D4D C4       lea   ecx, dword ptr           ;爆破点,改为jmp 00401208即成功爆破!:)
00401056|.51            push    ecx
00401057|.E8 BF030000   call    0040141B
0040105C|.83C4 04       add   esp, 4
0040105F|.8D55 A8       lea   edx, dword ptr           ;我们输入的注册名
00401062|.52            push    edx
00401063|.E8 38030000   call    004013A0                         ;返回长度
00401068|.83C4 04       add   esp, 4
0040106B|.83F8 64       cmp   eax, 64
0040106E      77 11         ja      short 00401081                   ;X>64时跳向失败
00401070|.8D45 C4       lea   eax, dword ptr           ;注册码
00401073|.50            push    eax
00401074|.E8 27030000   call    004013A0                         ;返回长度
00401079|.83C4 04       add   esp, 4
0040107C      83F8 64       cmp   eax, 64
0040107F|.76 14         jbe   short 00401095                   ;X>64时跳向失败
00401081|>68 F8704000   push    004070F8                         ;注册失败!\n
00401086|.E8 DA030000   call    00401465
0040108B|.83C4 04       add   esp, 4
0040108E|.33C0          xor   eax, eax
00401090|.E9 82010000   jmp   00401217
00401095|>8D4D A8       lea   ecx, dword ptr
00401098|.51            push    ecx
00401099|.E8 02030000   call    004013A0
0040109E|.83C4 04       add   esp, 4
004010A1      83F8 08       cmp   eax, 8
004010A4|.72 11         jb      short 004010B7                   ;输入的注册名小于8时跳向失败
004010A6|.8D55 C4       lea   edx, dword ptr
004010A9|.52            push    edx
004010AA|.E8 F1020000   call    004013A0
004010AF|.83C4 04       add   esp, 4
004010B2      83F8 0A       cmp   eax, 0A
004010B5      73 14         jnb   short 004010CB                   ;输入的注册码>=10时跳走(成功方向)
004010B7      68 04714000   push    00407104                         ;注册失败!\n
004010BC      E8 A4030000   call    00401465
004010C1|.83C4 04       add   esp, 4
004010C4|.33C0          xor   eax, eax
004010C6|.E9 4C010000   jmp   00401217
004010CB|>8D45 A8       lea   eax, dword ptr
004010CE|.50            push    eax
004010CF|.E8 CC020000   call    004013A0
004010D4|.83C4 04       add   esp, 4
004010D7      83F8 10       cmp   eax, 10
004010DA|.77 11         ja      short 004010ED                   ;输入的注册名>10时跳向失败
004010DC|.8D4D C4       lea   ecx, dword ptr
004010DF|.51            push    ecx
004010E0|.E8 BB020000   call    004013A0
004010E5|.83C4 04       add   esp, 4
004010E8|.83F8 14       cmp   eax, 14
004010EB      76 14         jbe   short 00401101                   ;输入的注册码小于14H时跳向成功方向
004010ED      68 10714000   push    00407110                         ;注册失败!\n
004010F2      E8 6E030000   call    00401465
004010F7|.83C4 04       add   esp, 4
004010FA|.33C0          xor   eax, eax
004010FC|.E9 16010000   jmp   00401217
00401101|>68 1C714000   push    0040711C                         ;我用汉字来,看你怎么办!
00401106|.8D55 E0       lea   edx, dword ptr
00401109|.52            push    edx
0040110A|.E8 A1010000   call    004012B0
0040110F|.83C4 08       add   esp, 8
00401112|.8D45 A8       lea   eax, dword ptr
00401115|.50            push    eax
00401116|.E8 85020000   call    004013A0
0040111B|.83C4 04       add   esp, 4
0040111E|.8945 FC       mov   dword ptr , eax
00401121|.EB 09         jmp   short 0040112C                   ;进入第一个循环,是填充数据的!第二个和第三个是运算!
00401123|>8B4D FC       /mov   ecx, dword ptr
00401126|.83C1 01       |add   ecx, 1
00401129|.894D FC       |mov   dword ptr , ecx
0040112C|>837D FC 18   cmp   dword ptr , 18
00401130|.7D 1E         |jge   short 00401150
00401132|.8B55 FC       |mov   edx, dword ptr
00401135|.8D04D5 090000>|lea   eax, dword ptr
0040113C|.99            |cdq
0040113D|.B9 1A000000   |mov   ecx, 1A
00401142|.F7F9          |idiv    ecx
00401144|.83C2 41       |add   edx, 41
00401147|.8B45 FC       |mov   eax, dword ptr
0040114A|.885405 A8   |mov   byte ptr , dl       ;第一道关口,是填充数据!用户名是fonge,那结果就是fongeXFNVDLTBJRZHPXFNVDL!当然,这样是不行的,因为crme中要求是8-10位,so我用fonge5201,在这里结果就是fonge5201DLTBJRZHPXFNVDL!
0040114E|.^ EB D3         \jmp   short 00401123
00401150|>C645 C0 00    mov   byte ptr , 0
00401154|.C745 FC 00000>mov   dword ptr , 0
0040115B|.EB 09         jmp   short 00401166
0040115D|>8B4D FC       /mov   ecx, dword ptr
00401160|.83C1 01       |add   ecx, 1
00401163|.894D FC       |mov   dword ptr , ecx
00401166|>8D55 A8      lea   edx, dword ptr          ;指向第一轮计算出来的结果
00401169|.52            |push    edx                           ;入栈
0040116A|.E8 31020000   |call    004013A0                        ;返回长度
0040116F|.83C4 04       |add   esp, 4                        ;C语言平衡堆栈
00401172|.3945 FC       |cmp   dword ptr , eax          ;比较是否为返回长度,T就跳
00401175|.7D 1B         |jge   short 00401192
00401177|.8B45 FC       |mov   eax, dword ptr
0040117A|.0FBE4C05 E0   |movsx   ecx, byte ptr       ;这里就在取表(我用汉字来,看你怎么办!),是的,我不怎么办!
0040117F|.8B55 FC       |mov   edx, dword ptr
00401182|.0FBE4415 A8   |movsx   eax, byte ptr       ;一个一个地取第一轮计算出来的结果
00401187|.33C8          |xor   ecx, eax                        ;与表中相应取值异或
00401189|.8B55 FC       |mov   edx, dword ptr
0040118C|.884C15 E0   |mov   byte ptr , cl       ;取CL拼加
00401190|.^ EB CB         \jmp   short 0040115D
00401192|>C745 FC 00000>mov   dword ptr , 0
00401199|.EB 09         jmp   short 004011A4
0040119B|>8B45 FC       /mov   eax, dword ptr
0040119E|.83C0 01       |add   eax, 1
004011A1|.8945 FC       |mov   dword ptr , eax
004011A4|>837D FC 18   cmp   dword ptr , 18
004011A8|.7D 2C         |jge   short 004011D6
004011AA|.8B4D FC       |mov   ecx, dword ptr
004011AD|.0FBE540D E0   |movsx   edx, byte ptr       ;上面拼出来的结果抽出来参与计算
004011B2|.81F2 D7070000 |xor   edx, 7D7                        ;xor 7d7
004011B8|.8B45 FC       |mov   eax, dword ptr
004011BB|.885405 E0   |mov   byte ptr , dl       ;DL值放回去
004011BF|.8B4D FC       |mov   ecx, dword ptr
004011C2|.0FBE540D E0   |movsx   edx, byte ptr
004011C7|.81F2 CB000000 |xor   edx, 0CB                        ;放回去的DL值参与xor 0CB运算
004011CD|.8B45 FC       |mov   eax, dword ptr
004011D0|.885405 E0   |mov   byte ptr , dl       ;最终值放回去,参与最后的比较
004011D4|.^ EB C5         \jmp   short 0040119B
004011D6|>8D4D C4       lea   ecx, dword ptr           ;输入的注册码,在这里出现
004011D9|.51            push    ecx
004011DA|.E8 C1010000   call    004013A0                         ;这个函数太熟了,返回长度的,上面出现了N次
004011DF|.83C4 04       add   esp, 4                           ;平衡堆栈,C语言的特性
004011E2|.C64405 E0 00mov   byte ptr , 0
004011E7|.8D55 E0       lea   edx, dword ptr           ;指向计算出来的结果
004011EA|.52            push    edx                              ;压进去
004011EB|.8D45 C4       lea   eax, dword ptr           ;我们输入的注册码
004011EE|.50            push    eax                              ;也压进去!
004011EF|.E8 2C000000   call    00401220                         ;标准的比较函数,压两个值进去
004011F4|.83C4 08       add   esp, 8
004011F7|.85C0          test    eax, eax
004011F9      74 0D         je      short 00401208
004011FB|.68 38714000   push    00407138                         ;注册失败!\n
00401200|.E8 60020000   call    00401465
00401205|.83C4 04       add   esp, 4
00401208|>68 44714000   push    00407144                         ;ok!\n
0040120D|.E8 53020000   call    00401465
00401212|.83C4 04       add   esp, 4
00401215|.33C0          xor   eax, eax
00401217|>8BE5          mov   esp, ebp
00401219|.5D            pop   ebp
0040121A\.C3            retn


--------------------------------------------------------------------------------
【经验总结】
逆向不难,但好像要正确的注册码倒是有问题了,很想看看老虎的注册码源码是什么样的!

--------------------------------------------------------------------------------

wan 发表于 2007-2-6 13:12:26

厲害~~~

水中花 发表于 2007-2-6 13:36:56

学习了!!!

月之精灵 发表于 2007-2-6 17:34:08

向您学习 ̄ ̄ ̄

glts 发表于 2007-2-6 17:51:32

拿来搞一下~~:handshake

avel 发表于 2007-2-6 20:30:36

;P ;P
不错,学习了 嘻嘻

fonge 发表于 2007-2-7 12:34:05

我也来学习一下/fad

fonge 发表于 2007-2-7 12:40:43

咋没看到老虎的身影!:L

杜杜哎哟 发表于 2007-2-7 22:01:51

算法学习中,向你学习!

无所谓 发表于 2007-2-22 16:42:37

学习中,看不太懂~!
页: [1] 2
查看完整版本: 【算法追踪】crackme1.5.一只老虎.c