吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6797|回复: 15
收起左侧

[原创] 【静态Patch】160个CrackMe之041

[复制链接]
whklhh 发表于 2017-10-31 19:37
本帖最后由 whklhh 于 2018-9-11 16:42 编辑

之前看到@zbnysjwsnd8 做了PatchMe类型的41,正好最近书上看到了Dll注入、API钩取的相关内容,于是就也来试试啦

由于估计篇幅可能会太长,所以分成两篇吧_(:з」∠)_
本篇是利用静态Patch方法来热身、熟悉程序的,下一篇利用动态Dll注入。


解压有一个Rules文件和EXE
说明显示EXE是Delphi写的
Rules说明需要为EXE的菜单栏的Exit添加确认弹窗,当点击Yes的时候才退出,否则无效

试运行,发现一级菜单Ficken下有两个二级菜单项,分别是About和Exit
点击About将会弹出看规则的提示,点击Exit毫无反应

于是先用DeDe反编译一下看看:


可以看到,About有一个OnClick事件,很明显就是那个弹窗了;
而Exit连事件都没有……这个添加的就麻烦啦,如果有事件只是做别的事情那么很好Hook,然而没有事件就意味着还要给他加个事件咯

IDA反编译一下,跟着字符串找到了About2Click事件:

很明显调用方法应该是把事件作为Callback设置到Windows消息处理函数中,是个动态过程,因此查看交叉引用当然是找不到的

只好在OD中的43E270处下断,然后查看调用堆栈啦:

可以看到是从42F42E调用过来的,它应该就是消息处理函数咯
在IDA中分析42F42E:
  

根据反汇编可以发现,函数地址和参数等等都是依靠v2=result,即eax/ebx的
那么这个地址大概率就是控件结构体的指针了

重新在42F42E所在函数的第一行下断,再次点击,可以发现ebx中的确存放着很多信息,包含Caption和onClick的字符串

那么最简单的方法就是手动为Exit控件增加callBack啦:
首先找CallBack放置的地址,OD拖到最后发现0x43E4BC往后都是00,我们就把函数放这儿吧
直接写汇编或者自己手动写C函数然后反汇编都可以
C语言就是:
[C++] 纯文本查看 复制代码
if(MessageBoxA(NULL, "Do you fickbirne really want to quit?", "Exit", MB_YESNO))
    Exit(0);
else
    return 0;

汇编就push上述4个参数后
通过eax接收YES/NO的结果,然后跳转决定ret还是执行ExitProcess咯

注意汇编语言中ExitProcess的地址都需要自己去查IAT,而C语言中由于动态链接库实际上存在于同一个内存空间中,因此其他程序调用的ExitProcess地址与该程序的ExitProcess地址是相同的,所以原样复制即可

本程序中由于有加载ExitProcess,直接在IDA中查找IAT即可:
  
那么我们在最后结尾处写入对应汇编:
  
PS:call地址的用法:只能用call [地址],因此必须将IAT-0040122C放在一个地址中作为入口地址,也就是最后的那两个玩意儿啦

手动在sub_42F3C0中将结构体的函数地址修改为这个函数地址(0043E4EC),测试无误,YES和NO都能正常退出/返回

下一步就是怎么修改代码使其自动将onClick事件加载到结构体中咯

向上追溯发现,结构体的地址来自于430525函数:

IDA检索发现硬编码字符串和onClick事件都硬编码在这里:

但是下访问断点只找到了有关长度的指针,没有找到赋值……有可能是整体复制过去,而不是单独处理?


用DeDe查了一下,02DC是Exit1的控件ID,02D8是About2的控件ID


从代码装载来看,似乎是整块整块(6字节+Name字符串)读入,而不是我想象的那样将事件地址存入结构体内存中对应的地方


另一方面,Exit1和About2的存储除了控件ID和字符串以外没有区别,这说明onClick事件不依靠控件的属性来装载,因此我只能在About2Click后再添加一个事件组;然而内存已经挤得满满的了,根本没有给我留位置_(:з」∠)_
于是只好放弃这个最原装的思路,转而决定hook事件判断:
最简单的识别就是通过控件ID,在调试过程中我发现这里:

call 00430488以后可以通过edx中存储的控件下标来获得结构体指针,进而判断是否执行事件
于是可以hook这里,通过判断edx是否为Exit1的ID从而决定弹窗或者写入函数地址


因为函数体已经写好,所以懒得完全hook
干脆当识别到Exit1的时候将onClick事件写入eax+0x80的地址,即onClick事件地址好了


代码如下:

本来想hook一次,即检测到edx=3以后就将hook的代码恢复的,但是运行过程中会报内存写入错误,应该是由于该位置内存没有开启可写属性。
如果需要写入代码段的内存,需要更改节区头中的可写属性。


改动太麻烦,干脆一直hook着咯~
代码的位置同样位于最后的大段00中
hook函数写好以后,就在刚才得到函数结构体指针的函数之后进行劫持,使用jmp 0043e51d即可令流程走向hook函数,另一方面5字节也不会干扰到正常的call


复制出来以后可以正常执行,静态patch完成


最后提一下:最后的大段00称之为NULL-Padding,是由于Alignment,即最小单位导致的。
即虽然内存只花费一定量,但为了方便起见,要求取整,这个整的单位就是Alignment。


附件中包含了原题和Patch后的程序

defiler.1.rar

252.4 KB, 下载次数: 42, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 5威望 +1 吾爱币 +19 热心值 +4 收起 理由
pk8900 -1 + 1 写的很好。看来IDA有时间得好好研究研究了。
qaz003 + 1 + 1 用心讨论,共获提升!
netle8 + 2 + 1 用心讨论,共获提升!
Poner + 1 + 15 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zbnysjwsnd8 + 2 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| whklhh 发表于 2018-9-11 16:45
撸达湿 发表于 2018-9-5 09:40
想学习下如何注入的    图片看不见了

https://blog.csdn.net/whklhhhh/article/details/78398812
狗比csdn不仅改图片域名,现在直接禁止外源访问了……去博客看吧 太多图懒得弄了orz
 楼主| whklhh 发表于 2017-10-31 19:43
zbnysjwsnd8 发表于 2017-10-31 19:40
厉害,建议重新拍一下版

正在排呢 你回的太快了
每次博客复制过来都会被吃掉所有格式,编辑习惯了都
zbnysjwsnd8 发表于 2017-10-31 19:40
swx1993 发表于 2017-10-31 20:34
真厉害,楼主我支持你
xiawan 发表于 2017-11-1 08:56
刚看论坛就看到好文了~支持~
netle8 发表于 2017-11-1 09:26
谢谢分享!学习了!
xinxing124 发表于 2017-11-1 13:21
可以好好学习下了,不知道能不能仿照进行操作
SourceWater 发表于 2017-11-1 15:05
谢谢,非常感谢,好东西啊!
sd3970566 发表于 2017-11-2 16:41
这个是用易语言写的吗。不错。
 楼主| whklhh 发表于 2017-11-2 17:36
sd3970566 发表于 2017-11-2 16:41
这个是用易语言写的吗。不错。

目标程序Delphi,Patch语言是汇编哦。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 05:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表