[反汇编练习] 160个CrackMe之005.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

 

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第5个ajj,保存下来。运行程序,程序界面如下:

 

这个程序和上一个类似,但是只有一个输入框,下面的“注册按钮”其实就是个摆设,没有什么效果。不管了,先扔进OD探探路。

3、思路分析和破解流程:

既然之前的也是Delphi,我们就不用再做无谓的尝试了,直接Ctrl+E(E图标),选中CKme002.exe模块,右键->Follow entry,这样我们就在主程序模块,然后右键->中文搜索引擎->智能搜索,拉到最后发现有一个很明显的中文字符串【恭喜恭喜!注册成功】,二话不说,跟进去。

00447465    BA 8C744400     mov edx,0044748C                         ; 厉害厉害真厉害!佩服佩服真佩服!!
0044746A E8 EDC4FBFF call 0040395C
0044746F BA B8744400 mov edx,004474B8 ; 注册了
00447474 8B83 EC020000 mov eax,dword ptr ds:[ebx+0x2EC]
0044747A E8 3DCCFDFF call 004240BC
0044747F 5B pop ebx
00447480 C3 retn
00447481 0000 add byte ptr ds:[eax],al
00447483 00FF add bh,bh
00447485 FFFF ??? ; Unknown command
00447487 FF22 jmp dword ptr ds:[edx]
00447489 0000 add byte ptr ds:[eax],al
0044748B 00C0 add al,al
0044748D F7BA A6C0F7BA idiv dword ptr ds:[edx+0xBAF7C0A6]
00447493 A6 cmps byte ptr ds:[esi],byte ptr es:[edi]
00447494 D5 E6 aad 0xE6
00447496 C0F7 BA sal bh,0xBA
00447499 A6 cmps byte ptr ds:[esi],byte ptr es:[edi]
0044749A A3 A1C5E5B7 mov dword ptr ds:[0xB7E5C5A1],eax
0044749F FEC5 inc ch
004474A1 E5 B7 in eax,0xB7
004474A3 FE ??? ; Unknown command
004474A4 D5 E6 aad 0xE6
004474A6 C5E5 lds esp,ebp ; Illegal use of register
004474A8 B7 FE mov bh,0xFE
004474AA A3 A1A3A100 mov dword ptr ds:[0xA1A3A1],eax

纳尼,竟然有各种无法识别的命令,没办法,先用PEID查查壳吧。

 

TNND,竟然UPX加壳了,幸好是UPX,找个专门的工具就能搞定。我使用的是论坛里找的UPX GUI工具,脱掉后,继续查看:和上次一样,Deiphi的。

继续Ctrl+E,选中模块进去,右键,查找中文,智能搜索,拉到最后,双击进去,哦这个世界终于清静了!稍微手工分析下代码:

004473E4   .  53            push ebx
004473E5 . 8BD8 mov ebx,eax
004473E7 . 81BB 04030000>cmp dword ptr ds:[ebx+0x304],0xC34
004473F1 . 0F84 88000000 je 0044747F ; // 一直在这里主动断下,应该有周期性调用的函数
004473F7 . 81BB 08030000>cmp dword ptr ds:[ebx+0x308],0x230D
00447401 . 74 7C je short 0044747F ; // 判断2
00447403 . 81BB 10030000>cmp dword ptr ds:[ebx+0x310],0xF94
0044740D . 75 70 jnz short 0044747F ; // 判断3
0044740F . 8B83 18030000 mov eax,dword ptr ds:[ebx+0x318]
00447415 . 3B83 14030000 cmp eax,dword ptr ds:[ebx+0x314]
0044741B . 75 62 jnz short 0044747F ; // 判断4
0044741D . 81BB 1C030000>cmp dword ptr ds:[ebx+0x31C],0x3E7
00447427 . 74 56 je short 0044747F ; // 判断5
00447429 . 33D2 xor edx,edx ; // 以下不知道干什么用的,不管它
0044742B . 8B83 D8020000 mov eax,dword ptr ds:[ebx+0x2D8]
00447431 . 8B08 mov ecx,dword ptr ds:[eax]
00447433 . FF51 5C call dword ptr ds:[ecx+0x5C]
00447436 . 33D2 xor edx,edx
00447438 . 8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
0044743E . 8B08 mov ecx,dword ptr ds:[eax]
00447440 . FF51 5C call dword ptr ds:[ecx+0x5C]
00447443 . 33D2 xor edx,edx
00447445 . 8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
0044744B . 8B08 mov ecx,dword ptr ds:[eax]
0044744D . FF51 5C call dword ptr ds:[ecx+0x5C]
00447450 . 33D2 xor edx,edx
00447452 . 8B83 E4020000 mov eax,dword ptr ds:[ebx+0x2E4]
00447458 . 8B08 mov ecx,dword ptr ds:[eax]
0044745A . FF51 5C call dword ptr ds:[ecx+0x5C]
0044745D . A1 A8984400 mov eax,dword ptr ds:[0x4498A8]
00447462 . 83C0 70 add eax,0x70
00447465 . BA 8C744400 mov edx,0044748C ; 厉害厉害真厉害!佩服佩服真佩服!!
0044746A . E8 EDC4FBFF call 0040395C
0044746F . BA B8744400 mov edx,004474B8 ; 注册了
00447474 . 8B83 EC020000 mov eax,dword ptr ds:[ebx+0x2EC]
0044747A . E8 3DCCFDFF call 004240BC
0044747F > 5B pop ebx ; // 上面的所有跳转都跳到这里
00447480 . C3 retn

找到代码头,下断!??怎么就段下了???我什么也没点击啊!!可恶的地球人!

观察下断下的位置,是第一个JE跳转,然后依次将所有的JE和JMP都下断,发现仍然是在第一个JE断下,冥冥之中我想到了最开始的鼠标提示:如果你能不用暴力注册成功,你就知道“层层设防”的意思了!坑啊,大坑!难道就是这几个CMP和JE判断吗??!!

没办法,观察下CMP的参数,都是[ebx+0x3xx],但是我们无法找到给ebx和ebx+0x3xx赋值的地方!太坑了!

 

冷静!我们的初衷是破解它,提示成功的代码就在这几个跳转判断的下面,虽然我们无法知道这些判断的条件能在哪里修改,但是只要我们能让判断的流程走向成功注册就可以了。所以,我想到了JMP,简单,粗暴,但是很有效。既然每次都在第一个JE处断下,我们就可以将第一个JE改为JMP,JMP的目的地肯定是成功注册的位置,看看代码,在“注册了”提示的上面有很多CALL,但是不知道是干什么的,一直到xor edx,edx地方都是不知道干什么的代码,我们先尝试一下,选中je 0044747F,按下空格键,内容改为JMP 00447443,选中左下角的使用nop填充选项,assemble。OD自动将jmp语句修改为jmp short 00447443,不用管他。我们为什么要jmp到00447443,而不是其他地方呢?因为xor edx,edx的地址就是00447443啊!

 

好了,现在再试试程序.....什么!程序已经自动变成了“注册了”!!

 

4、注册机探索:

我只想说,上神器吧!我也没办法!

Dede分析一下:

看到这里,不知你有什么感想!Timer1Timer:interval=200,Timer2Timer:interval=8000。。。我敢说这完全是在使用时钟定时判断注册码啊!

赶快将timer事件的RVA记下来,OD跟踪......

事实证明我错了!继续跟踪其他事件....

好吧,我承认,我放弃了,请原谅我放荡不羁的爱情!!!这位大爷太难伺候了。以后有好方法了再说吧!

后记:我是真的被这位兄台的CrackMe整疯了,还是连续俩个的。太捉弄人了,鸡肋啊!

 

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之005的更多相关文章

  1. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之019

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. 【转载】Spring中DispatcherServlet与ContextLoaderListener的区别

    昨天在写springmvc的时候,在web.xml中配置了DispatcherServlet,如下: <servlet> <servlet-name>DispatcherSer ...

  2. Matlab中mat2cell的使用

    怎样用mat2cell将一个100*100的矩阵分成10个10*100的矩阵? 根据帮助中 c = mat2cell(x,m,n)应该这样写 mat2cell(x,[10 10 10 10 10 10 ...

  3. Taxi Trip Time Winners' Interview: 3rd place, BlueTaxi

    Taxi Trip Time Winners' Interview: 3rd place, BlueTaxi This spring, Kaggle hosted two competitions w ...

  4. Win 7怎样拒绝所有可移动存储设备的所有权限

    在Windows 7中,我们可拒绝对任何可移动存储类的权限.下面让我来教大家怎样在组策略中启用“所有可移动存储类:拒绝所有权限”策略,具体操作步骤如下所述: 步骤/方法 在开始搜索框中键入“gpedi ...

  5. 提交jar作业到spark上运行

    1.引入spark包:spark-assembly-1.4.0-hadoop2.6.0,在spark的lib目录下 File-->project structure 2.用IDEA建立一个sca ...

  6. React vs Angular 2: 冰与火之歌

    黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...

  7. hdu 4588 Count The Carries

    思路:容易发现二进制表示的数的最低位规律是01010101……:接着是001100110011……:接着是:0000111100001111…… 这样我们发现每一位的循环节是2^(i+1),前2^i是 ...

  8. 系统学习sqlserver2012 一

    一:使用管理服务器和脚本 在试图菜单中选族已注册的服务器,可以直接切换登录服务器 在试图菜单中选择解决方案资源管理器,可以直接打开之前保存的脚本,方便管理和执行 这两种保存时,都可以分组保存,见下图

  9. lintcode:Flip Bits 将整数A转换为B

    题目: 将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 样例 如把31转换为14,需要改变2个bit位. ()10=()2 ()10=()2 挑战 你能想出几种方法? 解题: A- ...

  10. Hibernate逍遥游记-第5章映射一对多-01单向<many-to-one>、cascade="save-update"、lazy、TransientObjectException

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...