用钩子突破内存保护
继上篇《用钩子实现内存数据读写修改》的文章,如果有爱实践的同学可能会发现这对VMP保护的程序没法进行修改与读写!其实是因为VMP的内存保护对程序的代码块内存的属性改变成了不可写,所以才会写就会崩溃。
可能有人会说为什么OD可以读写修改,我个人认为是因为OD使用了VirtualProtectEx跨进程对程序内存属性修改。
当然,我们也可以通过外部程序调用这个函数修改内存属性,但是我们不要这样,要在当前进程下修改呢。
调用VirtualProtect或者VirtualProtectEx修改?不行的,VMP在解码后会对ZwProtectVirutalMemory这个内核函数进行hook,不是驱动层,是应用层。ntdll下的函数!
所以当前进程是没法调用这两个函数进行属性的修改的。可能会有人说越过钩子调用呗,我拒绝的,整理参数太麻烦了。
根据分析,vmp的内存保护在程序解码前调用一次VirtualProtect函数对程序代码块进行内存的可读可写可执行修改。
图中可以看到未解码前的调用和内存块数据
解码后调用一次对程序代码块进行内存的可读可执行修改。
图中可以看到已经解码了的代码和内存属性被修改为可读可执行!
这也是用这个函数对vmp进行脱壳的由来。
介绍完毕,我们就上代码:
钩子的代码:
**** Hidden Message *****
可见,被vmp内存保护的代码段已经变成了可读可写可执行!
我就看看不说话 沙发。。哈哈哈哈,我终于比恒叔快了。{:5_119:} 本帖最后由 李沉舟 于 2018-2-28 22:53 编辑
我修正我这段话。
writeprocessmemory写其它进程内存是不用看属性的,只要hprocess。debug权限牛逼就在于open时无视描述符。
李沉舟 发表于 2018-2-28 21:24
od可以改是因为带了debug权限,直接无视属性。
debug为所欲为?那我也在dll里提升到debug权限是否可行啊 李沉舟 发表于 2018-2-28 21:24
od可以改是因为带了debug权限,直接无视属性。
debug为所欲为?那我也在dll里提升到debug权限是否可行啊 本帖最后由 李沉舟 于 2018-2-28 21:40 编辑
要开心 发表于 2018-2-28 21:36
debug为所欲为?那我也在dll里提升到debug权限是否可行啊
不对。不好说,试验看看。 李沉舟 发表于 2018-2-28 21:22
沙发。。哈哈哈哈,我终于比恒叔快了。
我擦,你竟然如此迅速。。。
感谢楼主分享!
支持一下!! {:6_221:}说的好 我使用补丁