【文章标题】: 全逆一个CrackMe,BT伪指令的巧妙应用
【文章作者】: 黑箜
【作者邮箱】: kong@shadowkong.com
【软件名称】: simple1.exe
【加壳方式】: 无壳
【使用工具】: PEID+OD+IDA
【操作平台】: WIN-XP
【软件来源】: http://www.accessroot.com
【作者声明】: 只是感兴趣,没有其他目的。请各位多多指教,我是新手
[话外] 今天是2011年的最后1天,预祝各位新年快乐,万事如意,即将迎来的2012将是多变的2012,几个月的将来,我将真正走出社会~
Yous!Let `s Begin
[软件信息]
拿到这个CrackMe首先运行看能获取的信息有多少:
(1)载入PEID: TASM/MASM
无壳,非常棒 这个月去壳都去到想吐血了 今天能碰到一个无壳的 而且是用我喜欢的MASM编写的看来2011年的运气还没用完~
(2)使用PEID的[KryPto ANALyzer] 插件看是否使用了知名算法(我CrackMe主要用来练习算法和逆向,所以习惯了每次都用插件..)
结果如下:
除了BASE64之外还有大数操作等~还用到了BigLib 库
预测这个CrackMe可能有一点算法难度
(3)运行CrackMe 输入:
pediy
2011
在EDIT空间上很快就出现了Wrong Serial
猜测算法不太复杂
(4)载入IDA 主要查看代码内部调用情况 主意会不会有大的跳转等等
发现没有太婉转的调用...
(5)基本信息收集完毕 载入OD
映入眼帘的是非常熟悉的MASM调用流程 还有回调函数等,在过去的那么多PHI写的CrackMe折磨之后终于能看到喜欢的MASM了
把代码部分的DASM全部看了一遍 发现没有SMC,伪指令,多态变形,自校捡,防爆破处理,SEH处理安装 等等干扰~真是非常幸运
既然如此 那我想直接把整个CrackMe逆出来算了..也当温故下MASM编程 嗯说干就干~
其实MASM代码和OD的DASM差别不大 只要处理下局部变量 全局变量 还有逻辑关系
就非常容易逆向出来 当然是在没有各种反跟踪技术干扰的情况下`
经过半天的梳理逻辑和处理变量 总算把整个CrackMe逆出来了
逆出来的CrackMe基本和原来的一直 代码加起来700多行 作为一个CrackMe这是非常佩服作者编写它的认真,所以作为分析它的我
也应该认真的对待每一个CrackMe,这样才能不辜负作者苦思冥想而设置的各种陷阱
现在已经把CrackMe逆出来了 在分析算法之前 我一般是先找找整个DASM的亮点
在以前分析的所有CrackMe中 一般好的CrackMe都会是出自优秀的CODER手中
而优秀的Coder总会写出非常漂亮的代码
接下来给说说今天这个CrackMe的非常漂亮的地方:
首先看DASM:
片段1:
004021BC |> /57 /push edi ; a
004021BD |. |57 |push edi ; b
004021BE |. |57 |push edi ; a*b
004021BF |. |E8 40FAFFFF |call 00401C04 ; 乘...
004021C4 |. |57 |push edi
004021C5 |. |53 |push ebx
004021C6 |. |57 |push edi
004021C7 |. |E8 CAFDFFFF |call 00401F96 ; 再...
[COLOR="Red"]004021CC |. |0FA34E 04 |bt dword ptr [esi+4], ecx ; 10001[/COLOR]
004021D0 |. |73 12 |jnb short 004021E4 ; 0x10 0x00
004021D2 |. |57 |push edi
004021D3 |. |FF75 08 |push dword ptr [ebp+8]
004021D6 |. |57 |push edi
004021D7 |. |E8 28FAFFFF |call 00401C04
004021DC |. |57 |push edi
004021DD |. |53 |push ebx
004021DE |. |57 |push edi
004021DF |. |E8 B2FDFFFF |call 00401F96
004021E4 |> |49 |dec ecx
004021E5 |.^\79 D5 \jns short 004021BC
00401FD8 |. 8945 FC mov dword ptr [ebp-4], eax ; CE
00401FDB |. C1E1 05 shl ecx, 5 ; ecx==List/DWORD
00401FDE |. 49 dec ecx
00401FDF |. 8B7D FC mov edi, dword ptr [ebp-4]
00401FE2 |. C707 01000000 mov dword ptr [edi], 1
[COLOR="red"]00401FE8 |> 0FA34E 04 /bt dword ptr [esi+4], ecx ; 0x13F 319.[/COLOR]
00401FEC |. 72 03 |jb short 00401FF1
00401FEE |. 49 |dec ecx
00401FEF |.^ EB F7 \jmp short 00401FE8
00401FF1 |> 8B17 /mov edx, dword ptr [edi]
00401FF3 |. 8D5F 04 |lea ebx, dword ptr [edi+4]
00401FF6 |. F8 |clc
00401FF7 |. 90 |nop
00401FF8 |> D113 |/rcl dword ptr [ebx], 1
00401FFA |. 8D5B 04 ||lea ebx, dword ptr [ebx+4]
00401FFD |. 4A ||dec edx
00401FFE |.^ 75 F8 |\jnz short 00401FF8
00402000 |. 73 04 |jnb short 00402006 ; >=0
00402002 |. FF03 |inc dword ptr [ebx]
00402004 |. FF07 |inc dword ptr [edi]
[COLOR="red"]00402006 |> 0FA34E 04 |bt dword ptr [esi+4], ecx ; 测试位...[/COLOR]
0040200A |. 0F92C0 |setb al
0040200D |. 0847 04 |or byte ptr [edi+4], al
00402010 |. 8B55 0C |mov edx, dword ptr [ebp+C]
00402013 |. 8B1A |mov ebx, dword ptr [edx]
00402015 |. 391F |cmp dword ptr [edi], ebx
00402017 |. 72 67 |jb short 00402080
00402019 |. 77 1D |ja short 00402038
00401061 |. 6A 40 push 40 ; /Count = 40 (64.)
00401063 |. 68 8A404000 push 0040408A ; |Buffer = simple1.0040408A
00401068 |. 68 E9030000 push 3E9 ; |ControlID = 3E9 (1001.)
0040106D |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401070 |. E8 DB120000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401075 |. 83F8 00 cmp eax, 0 ; Name ASCII"pediy"
00401078 |. 0F84 ED000000 je 0040116B
0040107E |. A3 20454000 mov dword ptr [404520], eax ; NameLen
00401083 |. 8D05 8A404000 lea eax, dword ptr [40408A]
00401089 |. 33D2 xor edx, edx
0040108B |> 8B08 /mov ecx, dword ptr [eax]
0040108D |. 330D 20454000 |xor ecx, dword ptr [404520]
00401093 |. 03D1 |add edx, ecx
00401095 |. FF0D 20454000 |dec dword ptr [404520]
0040109B |.^ 75 EE \jnz short 0040108B;这段是用Name算出的一个值 非常重要
0040109D |. 8915 8A414000 mov dword ptr [40418A], edx ; 用于于后来Key算出的相比较
004010A3 |. 6A 40 push 40 ; /Count = 40 (64.)
004010A5 |. 68 CA404000 push 004040CA ; |Buffer = simple1.004040CA
004010AA |. 68 EA030000 push 3EA ; |ControlID = 3EA (1002.)
004010AF |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004010B2 |. E8 99120000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
004010B7 |. 83F8 00 cmp eax, 0 ; Key 获取输入的Key
004010BA |. 0F84 AB000000 je 0040116B
004010C0 |. A3 20454000 mov dword ptr [404520], eax
004010C5 |. 6A 00 push 0
004010C7 |. E8 14010000 call 004011E0
004010CC |. A3 8A424000 mov dword ptr [40428A], eax ; 申请内存
004010D1 |. 6A 00 push 0
004010D3 |. E8 08010000 call 004011E0
004010D8 |. A3 92424000 mov dword ptr [404292], eax ; 申请内存
004010DD |. 6A 00 push 0
004010DF |. E8 FC000000 call 004011E0
004010E4 |. A3 8E424000 mov dword ptr [40428E], eax ; 申请内存
004010E9 |. 6A 00 push 0
004010EB |. E8 F0000000 call 004011E0
004010F0 |. A3 96424000 mov dword ptr [404296], eax ; 申请内存
004010F5 |. FF35 92424000 push dword ptr [404292]
004010FB |. 6A 10 push 10
004010FD |. 68 61404000 push 00404061 ; ASCII "7E2BDC8ED8856EE745A9D6F93E143B7ACE202999"
00401102 |. E8 7C020000 call 00401383;把序列转换成十六进制
00401107 |. FF35 8E424000 push dword ptr [40428E]
0040110D |. 6A 10 push 10
0040110F |. 68 5B404000 push 0040405B ; ASCII "10001"
00401114 |. E8 6A020000 call 00401383;把10001标志转换成十六进制
00401119 |. FF35 8A424000 push dword ptr [40428A]
0040111F |. 6A 3C push 3C
00401121 |. 68 CA404000 push 004040CA ; ASCII "2011"
00401126 |. E8 58020000 call 00401383把Key转换成0x3C进制
0040112B |. FF35 96424000 push dword ptr [404296] ; 空余的内存
00401131 |. FF35 92424000 push dword ptr [404292] ; 明文序列所在的内存
00401137 |. FF35 8E424000 push dword ptr [40428E] ; 10001..标志所在的内存区
0040113D |. FF35 8A424000 push dword ptr [40428A] ; 输入的Key所在的内存区
[COLOR="red"]00401143 |. E8 4C100000 call 00402194[/COLOR]
00401148 |. 68 0A414000 push 0040410A
0040114D |. FF35 96424000 push dword ptr [404296]
00401153 |. E8 0A040000 call 00401562 ; 复制
00401158 |. 68 8A414000 push 0040418A ; /String2 = "?",0E,""
0040115D |. 68 0A414000 push 0040410A ; |String1 = ""
00401162 |. E8 CB110000 call <jmp.&KERNEL32.lstrcmpA> ; \lstrcmpA
00401167 |. 85C0 test eax, eax
00401169 |. 74 16 je short 00401181
0040116B |> 68 4E404000 push 0040404E ; /Text = "wrong serial"
00401170 |. 68 EA030000 push 3EA ; |ControlID = 3EA (1002.)
00401175 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401178 |. E8 DF110000 call <jmp.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
0040117D |. C9 leave
0040117E |. C2 1000 retn 10
00401181 |> 68 44404000 push 00404044 ; /Text = "well done"
00401186 |. 68 EA030000 push 3EA ; |ControlID = 3EA (1002.)
0040118B |. FF75 08 push dword ptr [ebp+8] ; |hWnd
0040118E |. E8 C9110000 call <jmp.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!