我的第一个CrackMe
本帖最后由 xj1992628 于 2018-8-26 00:05 编辑程序采用 易语言(5.1)黑月编译器(3.3)版本编译,
密码正确 或 密码错误 在弹出信息框之后,程序就会内存崩溃掉,提前声明..
程序无壳,加了点垃圾代码混淆阅读,有一些反调试的手段..没有任何恶意代码,不释放任何文件.
欢迎各位大牛来爆破或者获取真实密码都行~
小萌新,其他方法也不会,只能用最笨的方法,将程序载入OD,单步调试,看看弹框在哪里触发。
载入OD后,程序OEP在ra:00401000
00401000 >/$E8 3B810200 call CrackMe.00429140
F8单步
00401005|.E8 EA7D0200 call CrackMe.00428DF4
继续F8单步
此时,弹出对话框,证明弹框在00401005|.E8 EA7D0200 call CrackMe.00428DF4处执行了。
点击退出,Ctrl+F2重新加载程序。在ra:00401005处F7进入程序中,继续采用此方法逐步调试……(先F8过程序,有弹框了就F7进入被调用函数中调试)
调试记录路径如下:
00401000 >/$E8 3B810200 call CrackMe.00429140 F8过
00401005|.E8 EA7D0200 call CrackMe.00428DF4 F7进入
00428DF4/$FC cld F8过
00428DF5|.DBE3 finit F8过
00428DF7|.E8 F7FFFFFF call CrackMe.00428DF3 F8过
00428DFC|.68 BAD44100 push CrackMe.0041D4BA F8过
00428E01|.B8 03000000 mov eax,0x3 F8过
00428E06|.E8 25050000 call CrackMe.00429330 F8过
00428E0B|.83C4 04 add esp,0x4 F8过
00428E0E|.E8 8A46FFFF call CrackMe.0041D49D F8过
00428E13|.E8 F881FDFF call CrackMe.00401010 F7进入
中间一直在跳来跳去……………………………..(太多了,就不列举了)
此时可以嗯Ctrl+F8,让程序自动一直F8单步步过,一直到有弹窗
最后程序停在00401FDA .E8 6C6E0200 call CrackMe.00428E4B
往上翻几行代码看到
00401FC6 .FF15 ECC04200 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
根据提示,应该是调用DialogBoxParamA函数(Windows API)进行弹窗。程序有弹框之后,应该调用新线程后就直接结束了吧(猜的哈)最后的那个
00401FDA .E8 6C6E0200 call CrackMe.00428E4B根据很有可能是让内存崩溃的,这里我先nop掉试试。
将文件保存为CrackMe1.exe
重新将CrackMe1.exe载入OD,提示
WTF,这难道是反调试的验证吗?现在也不明白这个机制是啥,先确定看看我修改的生效了吗?
Ctrl+G调转到va:00401FD0
应该是修改成功了,但是测试了一下,MessageboxA下断运行之后,内存崩溃依旧在,艹,认怂,等老子了解相关机制后再来搞你。
现在灰溜溜的分析00401FC6 .FF15 ECC04200 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA函数吧
可以看到调用函数前先PUSH了5个参数,分别是IPargm,DlgProc,HOwner,pTemplate,hInst。下面百度一下dialogboxParama函数。
备注:因为堆栈是后进先出,所以PUSH的参数是倒叙排的
DialogBoxParam函数根据对话框模板资源创建一个模态的对话框。在显示对话框之前,函数将一个应用程序定义的值传到对话框过程中 WM_INITDIALOG 消息的 lParam 参数,应用程序可用此值来初始化对话框。
参数:
hlnstance:标识一个模块的实例,该模块的可执行文件含有对话框模板。
IpTemplateName:标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标识符,则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE宏指令创建此值。
hWndParent:指定拥有对话框的窗口。
IpDialogFunc:指向对话框过程的指针。有关更详细的关于对话框过程的信息,请参见DialogProc。
dwInitParam:指定传递到对话框过程中的 WM_INITDIALOG 消息 IParam 参数的值。
返回值:如果函数调用成功则返回值为在对函数EndDialog的调用中的nResult参数,该EndDialog函数用于中止对话框。如果函数调用失败,则返回值为-1。若想获得错误信息,请调用GetLastError函数。
--------------------------------------------华丽的分割线----------------------------------------------------
也不知道分析的对不对,有没有大神给指点一下。@Kido @xj1992628@灰灰。
有时间继续学习,分析 小白破解,逐步记录破解过程,大牛们轻喷~
1.载入OD,使用“智能搜索”搜索字符串,Ctrl+F查找“密码”关键字
提示未找到关键字。
那么很大可能就是采用MessageBoxA/W 系统API进行弹窗。
Ctrl+G输入MessageBoxA和MessageBoxW定位两个函数位置。
(MessageBoxA)摁F2下断点,ra为77D507EA
(MessageBoxW)摁F2下断点,ra为77D66534
2.摁F9跑一下程序
程序断下来了,ra在77D66534,也就是采用MessageBoxW进行弹窗。随机输入123,点击login
此时,堆栈中查看到“密码错误”提示,此时程序也“内存崩溃掉”。
---------------------------------华丽的分割线-----------------------------------------
继续分析,下个回复
水平不到家。。。
技术不到家 去虚拟机试试... blawhickte 发表于 2018-8-26 01:14
去虚拟机试试...
结果如何?我是没有搞定 云在天 发表于 2018-8-26 01:07
技术不到家
大牛厉害 请问大牛是爆破的还是跟出密码了 1764275866 发表于 2018-8-26 00:59
水平不到家。。。
这是破了还是没破呀 没破,可以改掉“密码错误”变“密码正确”。 新手,不太懂易语言是啥,但是网上偶尔能碰到这个语言编写的程序
骚