160个Crackme之041学习笔记
本帖最后由 海天一色001 于 2020-7-24 19:05 编辑第41个CM程序,难度“?”,说明是“Patch(Delphi)”,打补丁啊!解压后有两个文件,defiler.1.exe和rules.txt。
先打开rules.txt,要先查看rules(规则):很多单词不认识,不要紧,现场翻译,存入rules翻译后.txt。
整个文件翻译后发现是要求给这个程序添加一些代码,实现新的功能。一时有些不知从何下手,但再一想,也不能说自己没见过这类内容,以前CrackMe时的nop、jmp之类不也算是无源码修改了程序吗?而且自己将CM程序汉化时还插入过图片,改变过窗口大小等,多少算是有点基础吧。上!
第一步、查壳:
无壳,Delphi 3.0编程。
第二步、分析:打开defiler.1.exe:Ficken主菜单下有两个子项,点击About,弹出信息框,点击Exit,没有任何反应。
初步思路,在程序尾部新加一段代码(ExitClick事件),实现Exit菜单弹出信息框的功能;然后找到程序中点击Exit的代码,修改或者增加调用地址到新增代码处,这样大概就可以了。新加的代码功能也是要弹出信息框,应该与AboutClick事件大致一样,只是内容及按钮不一样,所以可以先照抄AboutClick的内容,再修改成要求的格式就行了。利用DarkDe4来看看程序相应控件及事件:
可以看到About2Click的内存地址是0043E270,先记下来,再点击“导出”,创建defiler.1.map:
用OD载入defiler.1.exe,看到程序入口处的代码不是很长,下面从0043E4BC处开始就全是0了。
先用mapimp插件将defiler.1.map导入OD中,再按Ctrl+G键,输入“0043E270”, 此时从DarkDe4导入的map文件已经为OD加载了相应的标签及注释,可以看到从0043E270到0043E288处是About2Click事件的代码段,在0043E283处调用了MessageBox函数弹出信息框。
将0043E270到0043E288处About2Click事件的代码原样添加到0043E510至0043E523处,作为ExitClick的代码,并保存为defiler.2.exe,运行了一下,一切正常。
将defiler.2.exe载入OD中,此时看到从程序入口的0043E474处开始到0043E528处被OD分析成了一个代码段,原因是添加的ExitClick事件最后一句是retn,被OD误认了。
Ctrl+G到0043E270处下断,F9运行,点击“Ficken”-“About”,程序中断:
F8单步向下,运行完0043E283,OD左上方显示“运行”状态,切换到defiler.2.exe窗口,弹出了信息框。点掉,切回OD中,程序暂停到0043E288处的retn。
继续单步,来到0042F42E处。首先看到有一个跳转来的红箭头,在下方信息栏中看到了4个跳转源的地址,向上下查看代码,找到了这4个地址,离0042F42E都很近。
向上点击了一下0042F428行的指令,注释是“defiler_.0043E270”,信息窗口中显示“ds:=0043E270 (defiler_.0043E270)”,说明ds:存入的是About2Click事件的地址。
要检测刚添加的ExitClick代码,将0042F428处指令改成call 0043E510并下断,可以看到OD自动将0042F42D处用nop填充了。F9运行,点掉程序信息框,继续F9运行,程序中断于此,F7跟入,F8单步,程序顺利运行至返回到0042F42D处。
再将ExitClick的事件代码修改成rule.txt要求的的内容:
点击0042F428处,按“Enter”键到0043E510处,向上来到0043E4BC处,点右键选“在数据窗口中跟随”命令,然后在数据窗口的ASCII栏中选中这一行,点右键选“二进制--编辑”命令,在上方的ASCII编辑框中输入自己的标题“Haitian”,点击确定;同样选中0043E4CC至0043E4FB处进行二进制编辑,输入“Do you fickbirne really want to quit?”这段话,确定后OD中界面如下:
此时反汇编窗口中显示一大堆乱七八糟的代码,但内存地址中是正确的,是因为OD没有在反汇编窗口正确识别ASCII字符,不影响程序运行。
再来到0043E510处,修改相应代码如下图所示:
因为要求点“是”按钮时要退出整个程序,所以在程序中查找到退出函数ExitProcess的地址为00403859:(选中OD浮动工具条中的“BP ExitProcess”选项,在OD下方的状态栏中出现了“BP ExitProcess”命令。F9运行程序,点击右上方的关闭按钮,OD中断于kernel32.dll的7C81BFA2处,堆栈窗口第一条显示来自00403859,这个地址就是调用退出程序命令的地址。)
选中0043E4BC至0043E532处的代码段,保存到defiler.3.exe中。
再加载defiler.3.exe到OD中,先查看一下0043E4BC至0043E532处的代码,然后Ctrl+G到0042F428处,下断,F9运行,点击About菜单后中断,F9运行,弹出About的信息框,点掉;再次修改0042F428处代码为call 0043E510,再点击About菜单,这次弹出Exit的信息框:
点否退出信息框,点是则退出整个CM程序,OD左上方状态为“已终止”。这说明ExitClick代码段是正确的。
接下来是找到判断哪一句是About/Exit按钮点击的代码,再来修改调试:
Ctrl+F2重载程序,此时的修改因未保存已被OD撤消了,导致弹出提示框说断点不正常。
不管它,点掉,按Alt+B键进入断点查看窗口,双击0042F428这一行代码进入CPU窗口:
上下查看代码,从0042F2BD到0042F42E这么一大堆代码OD没有认为它是一段程序,一时也不知道它有什么用。
此时又想起了IDR这个专用反编译工具来,据说和IDA相似,先用了再说:
点击“形式”-“窗体”标签,弹出两个信息框,一个是CM的窗体,一个是窗体的控件树:
再点击“单位”,选中0042BA98这一行双击,在下方窗口中出现了Menus中包含的所有控件、事件及函数的代码;再双击0042F3C0,IDR右侧窗口显示了优化后的TmenuItem.Click事件反汇编代码:
用IDR生成defiler.3.map文件,并在OD中导入:
此时反汇编窗口中看到从0042F3C0而不是0042F2BD处开始,到0042F42E处,是TmenuItem.Click事件的代码。所以在段首处0042F3C0下断点:
F9运行,点击菜单“Ficken”时程序就中断。
F8向下,一直到0042F41E处的跳转指令,跳过了0042F428处的调用About2Click事件,来到0042F42E处,下一句指令返回到0043056E。
而0043056E位于00430544至004305B7处Menus.TMenu.DispatchPopup代码段中。
查了一下DispatchPopup,分派弹出菜单的命令:“调用DispatchPopup模拟菜单项的click动作,如DispatcPopup定位了一个匹配菜单句柄的菜单项,它调用click方法,并返回真,否则,返回假。”
不太理解这段话,我自己的理解猜测是这段代码是弹出子菜单用的,估计点击菜单栏各项目都会调用这个段。
F9运行,又到点击菜单“Ficken”时中断,所以点击About和Exit,说明断点下得不对,取消掉它。
由于在测试ExitClick代码的过程中用到了0042F428这里的call,所以还要来到这里下断。
F9运行,点击about,程序中断于0042F428处。
F8单步向下,retn到0043053E处,它处于00430528到0043543处这个段中,段首注释是Menus.TMenu.DispatchCommand,这是菜单分发调度命令消息的函数,说明了从这里调用子菜单项“About”和“Exit”的点击事件。
所以就要看在00430528这个DispatchCommand段中找到“About”和“Exit”项运行时有何不同之处。
在段首00430528处下断,删掉0042F428处断点,然后Ctrl+F2重载程序,F9运行,弹出CM窗口,点击到“About”菜单项时程序中断:
F8单步向下,至00430530处调用查找菜单项函数FindItem(TmenuItem=ecx=0,Integer=edx=2,TfindItemKind=ebx=0)时,只有edx=2有实际意义,另外两个寄存器中的0说明函数参数使用默认值0;
运行后查看eax=009334D8、ecx=0012FA2C;
F8到00430539处,此时edx=ptr ds:=0042BE04;
F8继续向下,来到0043053B处调用Tmenu.Click事件,来到了0042F428处;
F8运行后弹出信息框,点掉后暂停于0042F42E处;
F8继续到返回0043053E处,此时eax=1。
9运行,点击“Exit”时程序再次中断于段首00430528处:
F8向下,到00430530处时FindItem函数的三个参数是ecx=0,edx=3,eax=0,运行后eax=00933608、ecx=0012FA2C;
F8到00430539处,此时edx=ptr ds:=0042BE04;
F8继续,到0043053B时不再跳到0042F428去弹出信息框而是直接到了下一句;
F8到0043053E处,此时eax=0。
可以得出结论,因为edx寄存器里的值不同(2和3),最终导致了调用Tmenu.Click事件后结果一个是弹信息框,一个不弹信息框,使eax值不同(1和0)。
所以还是要进入到Tmenu.Click事件中反复调试查看:
F9运行程序,点击“About”,程序中断于00430528处,点击0043053B处指令,F4使程序运行到此处,F7跟入:
反复运行这段程序,为减少操作步骤,禁用0042F428和00430528断点,在0043053B处下断,而不是0042F3C0处下断(如果在此处下断,点“Ficken”菜单时就会中断,无法点击“About”和“Exit”)。
运行程序,点击点击“About”和“Exit”时均会中断于0043053B处,然后F7跟入0042F3C0处,F8向下单步。
每运行一条指令,都认真地观察寄存器、堆栈、内存窗口,希望能发现点什么:
0042F3C1处指令执行完成后,只有ebx发生了改变,成了009334D8,右键点击ebx,选择“数据窗口中跟随”,马上看到了“About2”、“&About”这两个菜单名称,0093351C处的数值是2,应该是上面edx的值了;
一直到0042F428处调用About2Click事件的地址,弹出信息框,点掉,OD又暂停于0042F42E处;
F9运行,这次点击“Exit”,同样的过程再走一遍,ebx的值变成00933608,数据窗口中看到了“Exit1”和“&Exit”,0093364C处数值为3,应该是edx=3存入这里(DS:):
程序运行到0042F41E处,About没有跳,Exit跳过了About2Click事件。
(同样的方法,断点不同,于段首0042F3C0下断来检查Ficken的情况,结果是ebx=009333A4,数据窗口中看到“About1”和“&Ficken”,ds:009333A4+0x44]=1。)
反复点击About和Exit,运行N遍,终于决定,从0042F416处修改程序代码,加上判断,Ficken菜单跳到0042F42E处,About菜单跳到0043E270处,Exit菜单跳到0043510处:
F9运行程序,点击About菜单,中断于0043053B处,再F9运行,弹出About信息框,点掉,出现一个错误提示框,点掉;
再点击Exit菜单,弹出Exit信息框,点否,也弹出和About信息框错误相同的提示,再点掉:
同样错误的代码出现,说明这两个事件中肯定有一个相同的地方出错了,OD中继续调试:
再次点击About菜单,程序中断于0043053B处,取消此处断点;
然后F7跟入0042F3C0处,F8向下单步至0042F41D处,在此下断;
继续F8向下一句,F7跟入About2Click事件代码中:
F8向下,一切正常,直到最后一句retn,信息窗口中看到“返回到 00000000”的字样,错误就在这里了!
F8继续,果然弹出错误提示,地址00000000处错误!
Retn是返回上一级用的,而我用的跳转命令“je”而不是调用指令“call”!
点掉错误提示,再点击About菜单,程序中断于0042F41D处:
再次修改代码如下:
然后点击0042F421处的代码,回车键来到0043E510处,将最后一句的retn改为 jmp 0042F42E。
重新F9运行,此时直接弹出About信息框,点掉,不弹出错误提示,正常了;
再点击Exit,又中断于0042F41D处,F9继续,弹出Exit信息框,点否,正常退回到主窗口。这次应该完成任务了。
将所有修改保存到defiler.4.exe中,运行defiler.4.exe检查一下,点About菜单正常,点Exit菜单也正常,否退回到CM主窗口,是退出CM程序。
Patch程序算是成功了。
这只是其中一种Patch的方法,还有其他几个可以修改的地方,已生成不同的文件,也存入了附件中,有兴趣的请自行查看。
附件,含CM源程序及每步生成的文件、调试文件等。
百度链接是:https://pan.baidu.com/s/1NEpyyUefbKcoJvMGG_9OmQ,提取码:p8dk。160个CM、我已练习过的前41个crackme程序(不含012)都在里面。 绝无神 发表于 2020-7-24 18:42
大佬,这个格式看的好难受啊!
编辑一次多么的痛苦!
为什么不能将word文档编好的格式一起复制过来呢?
还得再编辑一次!
还有一些图片错误!!!!
海天一色001 发表于 2020-7-24 18:54
编辑一次多么的痛苦!
为什么不能将word文档编好的格式一起复制过来呢?
还得再编辑一次!
大佬用用md编辑器吧,真的很好使{:301_974:} 享受Crackme的乐趣,谢谢分享! 大佬,这个格式看的好难受啊! 学习到了 谢谢楼主分享 绝无神 发表于 2020-7-24 18:55
大佬用用md编辑器吧,真的很好使
好的,下次试一试!!! 学习学习 看看怎么样 谢谢大佬的分享 收到了
感谢楼主分享,支持一下!