44018723 发表于 2014-7-12 21:43

[反汇编练习] 160个CrackMe之033


[反汇编练习] 160个CrackMe之033.本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。其中,文章中按照如下逻辑编排(解决如下问题):1、使用什么环境和工具2、程序分析3、思路分析和破解流程4、注册机的探索----------------------------------提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!----------------------------------1、工具和环境:WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。160个CrackMe的打包文件。下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq注:1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。http://images.cnitblog.com/blog/573547/201406/192147191763366.png2、程序分析:想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。和上一节一样,打开CHM,选择第33个Cruehead.1.exe,保存下来。运行程序,程序界面如下:http://images.cnitblog.com/blog/573547/201407/121940102852589.pnghttp://images.cnitblog.com/blog/573547/201407/121940115679332.png有信息框,很好。PEID:MASM32 / TASM32 [覆盖]汇编写的程序啊!哎!要么很简单,要么就很坑啦!
3、思路分析和破解流程1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。2、点击About->Register,随意输入伪码:bbdxf123123。点击OK按钮,弹出信息框,不要关闭,回到OD。3、Ctrl+K查看堆栈信息:http://images.cnitblog.com/blog/573547/201407/121940132077329.png
选中Cruehead.0040137E,右键->Show calls
0040137E/$8B7424 04   mov esi,dword ptr ss:
00401382|.56            push esi                                 ;// "bbdxf"
00401383|>8A06          /mov al,byte ptr ds:
00401385|.84C0          |test al,al
00401387|.74 13         |je short 0040139C
00401389|.3C 41         |cmp al,0x41                           ;"A"
0040138B|.72 1F         |jb short 004013AC
0040138D|.3C 5A         |cmp al,0x5A                           ;"Z"
0040138F|.73 03         |jnb short 00401394
00401391|.46            |inc esi
00401392|.^ EB EF         |jmp short 00401383
00401394|>E8 39000000   |call 004013D2                           ;// 如果在A-Z之间,则处理(+0x20)
00401399|.46            |inc esi
0040139A|.^ EB E7         \jmp short 00401383
0040139C|>5E            pop esi
0040139D|.E8 20000000   call 004013C2                            ;// 处理完成在这里处理
004013A2|.81F7 78560000 xor edi,0x5678                           ;// 在这里进行比较
004013A8|.8BC7          mov eax,edi
004013AA|.EB 15         jmp short 004013C1
004013AC|>5E            pop esi
004013AD|.6A 30         push 0x30                              ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF|.68 60214000   push 00402160                            ; |Title = "No luck!"
004013B4|.68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
004013B9|.FF75 08       push                            ; |hOwner
004013BC|.E8 79000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
004013C1\>C3            retn
这段代码只是将name分析处理了一下,如果不合格则跳转到失败。我们选中这段代码头部,即0040137E地址处,OD提示:Local call from 0040122D
我们转到地址 0040122D,附近代码如下:
00401228   .68 8E214000   push 0040218E                            ;ASCII "BBDXF"
0040122D   .E8 4C010000   call 0040137E
00401232   .50            push eax                                 ;// 比较之后来到这里
00401233   .68 7E214000   push 0040217E                            ;ASCII "123123"
00401238   .E8 9B010000   call 004013D8
0040123D   .83C4 04       add esp,0x4                              ;// 再次处理之后
00401240   .58            pop eax
00401241   .3BC3          cmp eax,ebx
00401243   .74 07         je short 0040124C
00401245   .E8 18010000   call 00401362
0040124A   .^ EB 9A         jmp short 004011E6
0040124C   >E8 FC000000   call 0040134D                            ;// 这个跳转到正确的提示
00401251   .^ EB 93         jmp short 004011E6
发现,这里调用了大量的Call,我们一个个分析一下(注释里已经分析好了):
call 0040137E 内容:

0040137E/$8B7424 04   mov esi,dword ptr ss:
00401382|.56            push esi                                 ;// "bbdxf"
00401383|>8A06          /mov al,byte ptr ds:
00401385|.84C0          |test al,al
00401387|.74 13         |je short 0040139C
00401389|.3C 41         |cmp al,0x41                           ;"A"
0040138B|.72 1F         |jb short 004013AC
0040138D|.3C 5A         |cmp al,0x5A                           ;"Z"
0040138F|.73 03         |jnb short 00401394
00401391|.46            |inc esi
00401392|.^ EB EF         |jmp short 00401383
00401394|>E8 39000000   |call 004013D2                           ;// 如果在A-Z之间,则处理(+0x20)
00401399|.46            |inc esi
0040139A|.^ EB E7         \jmp short 00401383
0040139C|>5E            pop esi
0040139D|.E8 20000000   call 004013C2                            ;// 处理完成在这里处理
004013A2|.81F7 78560000 xor edi,0x5678                           ;// 在这里进行比较
004013A8|.8BC7          mov eax,edi
004013AA|.EB 15         jmp short 004013C1
004013AC|>5E            pop esi
004013AD|.6A 30         push 0x30                              ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF|.68 60214000   push 00402160                            ; |Title = "No luck!"
004013B4|.68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
004013B9|.FF75 08       push                            ; |hOwner
004013BC|.E8 79000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
004013C1\>C3            retn

其中,call 004013D2 内容:
004013D2/$2C 20         sub al,0x20
004013D4|.8806          mov byte ptr ds:,al
004013D6\.C3            retn

其中,call 004013C2 内容:
004013C2/$33FF          xor edi,edi
004013C4|.33DB          xor ebx,ebx
004013C6|>8A1E          /mov bl,byte ptr ds:
004013C8|.84DB          |test bl,bl
004013CA|.74 05         |je short 004013D1
004013CC|.03FB          |add edi,ebx                           ;// edi=循环求和
004013CE|.46            |inc esi
004013CF|.^ EB F5         \jmp short 004013C6
004013D1\>C3            retn

Call 004013D8 内容:
004013D8/$33C0          xor eax,eax
004013DA|.33FF          xor edi,edi
004013DC|.33DB          xor ebx,ebx
004013DE|.8B7424 04   mov esi,dword ptr ss:
004013E2|>B0 0A         /mov al,0xA
004013E4|.8A1E          |mov bl,byte ptr ds:                ;// "123123"
004013E6|.84DB          |test bl,bl
004013E8|.74 0B         |je short 004013F5
004013EA|.80EB 30       |sub bl,0x30                           ;// +0x30
004013ED|.0FAFF8      |imul edi,eax                            ;// edi/10
004013F0|.03FB          |add edi,ebx                           ;// edi+ebx
004013F2|.46            |inc esi
004013F3|.^ EB ED         \jmp short 004013E2
004013F5|>81F7 34120000 xor edi,0x1234
004013FB|.8BDF          mov ebx,edi
004013FD\.C3            retn


call 0040134D 的内容:
0040134D/$6A 30         push 0x30                              ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040134F|.68 29214000   push 00402129                            ; |Title = "Good work!"
00401354|.68 34214000   push 00402134                            ; |Text = "Great work, mate!
Now try the next CrackMe!"
00401359|.FF75 08       push                            ; |hOwner
0040135C|.E8 D9000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
00401361\.C3            retn
哈哈,大概流程是这样的,地址00401228开始,将Name和Serial分别经过call运算,通过00401241   .3BC3          cmp eax,ebx 比较,然后根据结果跳转到不同的处理,其中,0040124C   >E8 FC000000   call 0040134D是提示正确的处理流程。所以,我们只要00401243   .74 07         je short 0040124C改为jmp 0040124C,试一试:http://images.cnitblog.com/blog/573547/201407/121940143642345.png
4、注册机的探索算法处理如下:1、Name字符串,先判断是否在A-Z之间,然后每个字符ANSII值加上0x20,然后对计算后的值求和,最后与0x5678异或。2、Serial字符串,每个字符ANSII值加上0x30,然后加上上一次的和除以10的值,存到一个变量中,继续下一个,最后与0x1234异或。3、比较最后的结果。…..我想想不出来这样的两个字符串,我也没办法反计算,所以,这有作罢!
BYBBDXF

蕏蕏渧夢 发表于 2014-7-12 22:18

小白一个 就是过来看看 学习

SaberMason 发表于 2014-7-13 10:24

顶顶,不容易

梦游枪手 发表于 2014-7-13 07:58

我来学习下

骑乌龟的帅蜗牛 发表于 2014-7-12 22:45

学习了,还处在入门

SaberMason 发表于 2014-7-13 10:24

顶顶,不容易

纵横、叼蛮意 发表于 2014-7-13 10:48

shuguang 发表于 2014-7-20 22:34

这个注册码确实不好算

52101523413 发表于 2014-7-20 23:11

这个注册码确实不好算

shuguang 发表于 2014-7-21 13:19

本帖最后由 shuguang 于 2014-7-21 13:21 编辑

无意间发现了真码,只要对用户名计算后的结果异或1234就是真码.
下面是用delphi 7编写的注册机的代码.

procedure TForm1.Button1Click(Sender: TObject);
var name:string;
    i,temp1i:integer;
begin
name:=edit1.Text;
temp1:=0;
for i:=1 to length(name) do
begin
    temp1:=temp1+ord(upcase(name));
end;
temp1:=temp1 xor $5678;
temp1:=temp1 xor $1234;
edit2.Text:=inttostr(temp1);
end;

end.
页: [1] 2
查看完整版本: [反汇编练习] 160个CrackMe之033