171027 逆向-Patch(CrackMe之041)(下)

来源:互联网 发布:php源码加密授权 编辑:程序博客网 时间:2024/06/09 14:06

1625-5 王子昂 总结《2017年10月27日》 【连续第392天总结】
A. CrackMe41–patch(下)
B.
上次说到把弹窗函数写好了,只等找到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。

明天试一下dll注入,正好在书上刚学过,练习一下

C. 明日计划
dll注入

原创粉丝点击