首页
社区
课程
招聘
[原创]全逆一个CrackMe,BT指令的巧妙应用
发表于: 2011-12-31 22:50 9951

[原创]全逆一个CrackMe,BT指令的巧妙应用

2011-12-31 22:50
9951

【文章标题】: 全逆一个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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (7)
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
bt 什么时候变成“伪”指令了,汗
2011-12-31 23:06
0
雪    币: 93
活跃值: (41)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
坏习惯..已改 谢谢指出..
2011-12-31 23:21
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有点意思.................收藏鸟
2012-1-2 16:58
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
哦,顶一下,牛。。。a
2012-1-3 09:10
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏学习了
2012-1-4 08:52
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
献上注册机
上传的附件:
  • 1.jpg (15.10kb,368次下载)
2012-1-4 13:45
0
雪    币: 93
活跃值: (41)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
原版控件EDIT最多都只给输入33个字符..你这42个的怎么输进去..
2012-1-4 17:23
0
游客
登录 | 注册 方可回帖
返回
//