[反汇编练习] 160个CrackMe之018.
本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第18个Brad Soblesky.1.exe,保存下来。运行程序,程序界面如下:
3、思路分析和破解流程
又见信息框,哈哈哈!
PEID查看: Microsoft Visual C++ 6.0
和以前的一样,直接上步骤:
1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。
2、在exe中输入伪码:123123。点击OK按钮,弹出错误信息框,不要关闭。
3、在OD中点击暂停按钮(Ctrl+F12),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。堆栈区很长,我们从底部开始看:
由于大量地使用了mfc42模块,基本100%可断定使用的是C++的MFC框架写的。下面的那部分属于消息派遣,在最后的一个调用的地方,我们右键跟进去看看:
00401C73 |. 50 push eax ; /pStartupinfo
00401C74 |. FF15 0C204000 call dword ptr ds:[<&KERNEL32.GetStartup>; \GetStartupInfoA
00401C7A |. F645 D0 01 test byte ptr ss:[ebp-0x30],0x1
00401C7E |. 74 11 je short 00401C91
00401C80 |. 0FB745 D4 movzx eax,word ptr ss:[ebp-0x2C]
00401C84 |. EB 0E jmp short 00401C94
00401C86 |> 803E 20 /cmp byte ptr ds:[esi],0x20
00401C89 |.^ 76 D8 |jbe short 00401C63
00401C8B |. 46 |inc esi
00401C8C |. 8975 8C |mov [local.29],esi
00401C8F |.^ EB F5 \jmp short 00401C86
00401C91 |> 6A 0A push 0xA
00401C93 |. 58 pop eax
00401C94 |> 50 push eax
00401C95 |. 56 push esi
00401C96 |. 53 push ebx
00401C97 |. 53 push ebx ; /pModule
00401C98 |. FF15 08204000 call dword ptr ds:[<&KERNEL32.GetModuleH>; \GetModuleHandleA
00401C9E |. 50 push eax
00401C9F |. E8 5E000000 call 00401D02
00401CA4 |. 8945 98 mov [local.26],eax
00401CA7 |. 50 push eax ; /status
00401CA8 |. FF15 AC214000 call dword ptr ds:[<&MSVCRT.exit>] ; \exit
00401CAE |. 8B45 EC mov eax,[local.5]
00401CB1 |. 8B08 mov ecx,dword ptr ds:[eax]
00401CB3 |. 8B09 mov ecx,dword ptr ds:[ecx]
00401CB5 |. 894D 88 mov [local.30],ecx
00401CB8 |. 50 push eax
00401CB9 |. 51 push ecx
00401CBA |. E8 15000000 call <jmp.&MSVCRT._XcptFilter>
00401CBF |. 59 pop ecx
00401CC0 |. 59 pop ecx
00401CC1 \. C3 retn
根据GetStartUp,GetModuleHandleA很容易判断出不是进行注册码处理的,所以,我们还要继续向上看信息框部分:
这里就很容易地发现了信息框部分!并且注意到在信息框被调用之前有一个exe模块调用的函数,<jmp.&MFC42.#4224>被调用的函数为Brad_sob.004015BC,我们选中这一句,右键->Show call。
4、在反汇编窗口向上浏览相关代码,发现两处很明显的提示内容:
0040155F |. 50 push eax ; /String
00401560 |. FF15 04204000 call dword ptr ds:[<&KERNEL32.lstrlenA>] ; \lstrlenA
00401566 |. 8945 F0 mov [local.4],eax
00401569 |. 837D F0 01 cmp [local.4],0x1
0040156D |. 73 16 jnb short 00401585
0040156F |. 6A 40 push 0x40
00401571 |. 68 2C304000 push 0040302C ; ASCII "CrackMe"
00401576 |. 68 34304000 push 00403034 ; ASCII "Enter Registration Number"
0040157B |. 8B4D E0 mov ecx,[local.8]
0040157E |. E8 7B050000 call <jmp.&MFC42.#4224>
00401583 |. EB 3C jmp short 004015C1
00401585 |> 8D4D E4 lea ecx,[local.7]
00401588 |. 51 push ecx ; /String2 = "<BrD-SoB>"
00401589 |. 8D55 F4 lea edx,[local.3] ; |
0040158C |. 52 push edx ; |String1 = "123123"
0040158D |. FF15 00204000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA
00401593 |. 85C0 test eax,eax
00401595 |. 75 16 jnz short 004015AD
00401597 |. 6A 40 push 0x40
00401599 |. 68 50304000 push 00403050 ; ASCII "CrackMe"
0040159E |. 68 58304000 push 00403058 ; ASCII "Correct way to go!!"
004015A3 |. 8B4D E0 mov ecx,[local.8]
004015A6 |. E8 53050000 call <jmp.&MFC42.#4224>
004015AB |. EB 14 jmp short 004015C1
004015AD |> 6A 40 push 0x40
004015AF |. 68 6C304000 push 0040306C ; ASCII "CrackMe"
004015B4 |. 68 74304000 push 00403074 ; ASCII "Incorrect try again!!"
004015B9 |. 8B4D E0 mov ecx,[local.8]
004015BC |. E8 3D050000 call <jmp.&MFC42.#4224>
C++代码就是好啊,汇编代码及其干净!lstrcmp这个函数进行了文本比较,然后就根据比较结果判断成功还是失败!jnz 004015AD就是关键跳转啦!我们选中这一行,右键->Binary->Fill with NOPs。试试看,哈哈,是不是成功啦!
4、注册机的探索
我们已经知道了注册码比较的位置,先直接看看注册码是什么样的?在 lstrcmp 这个函数上下断F2,然后就如同上面那个汇编注释的内容一样,他竟然是固定的!!
<BrD-SoB>
或许我们猜错了,试一试,OK!确实是固定的!
BY 笨笨D幸福
[反汇编练习] 160个CrackMe之018的更多相关文章
-
[反汇编练习] 160个CrackMe之019
[反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之024
[反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之022
[反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之021
[反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之020
[反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
-
[反汇编练习] 160个CrackMe之017
[反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
-
python之浅拷贝和深拷贝
1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...
-
使用 VS Code 来编辑 markdown 文章
一开始我就用 VS Code 来编辑 markdown 文本,只是因为 VS Code 用起来感觉很好,然后我又去寻找其他的能够预览 markdown 的编辑器,看了好多都不是很方便.突然我发现 VS ...
-
ios 屏幕概况
转:http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
-
shell 使用for循环 启动后台任务
为了统计多天的数据并按照天为文件名输出,写了脚本,脚本可以统计单天的数据.为了实现多天的同时进行采用 启动多个进程后台执行形式: 但是直接 执行的参数后面加上& 并不能解决,采用 echo & ...
-
动态树 Link-Cut Trees
动态树 动态树问题, 即要求我们维护一个由若干棵子结点无序的有根树组成的森林. 要求这个数据结构支持对树的分割.合并,对某个点到它的根的路径的某些操作,以及对某个点的子树进行的某些操作. 在这里我们考 ...
-
仿Google首页搜索自动补全
仿Google自动补全,实现细节: 后台是简单的servlet(其实就是负责后台处理数据交互的,没必要非跌用个struts...什么的) 传输介质:xml 使用jQuery js框架 功能实现: 如果 ...
-
Foursquare 8.0 :聪明人给互联网公司上的流量转化课
今年 5 月上线的 Swarm 虽然应用制作精良,但不免让人怀疑是 Foursquare一次失败的互联网公司服务越界和用户忠诚度试水.但非常快这群聪明人让我们发现事情并没有这么简单:他们给互联网公司们 ...
-
openwrt 添加 802.1x客户端njit
1.修改feed的配置文件 feeds.conf.default 添加下面两句: src-svn njit https://github.com/liuqun/openwrt-clients/trun ...
-
经典SQL语句大全(转)
SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...
-
mongoDB 删除集合后,空间不释放
mongoDB 删除集合后,空间不释放,添加新集合,没有重新利用之前删除集合所空出来的空间,也就是数据库大小只增不减. 方法有: 1.导出导入 dump & restore 2.修复数据库 r ...