关于反射 dll 修补
最近开源了一个小工具反射 dll 修补工具,其原理类似 msf 和 cs 分段 payload 加载,我就算便写写,写的不好勿喷。
废话不多说开始
关于反射 dll 的原理我实在是懒得写的请看别人吧因为要写的话有点多,反射 dll 的核心就在 ReflectiveLoader 函数好好看它的源码吧。
其实所谓的修补反射 dll 其实就是修改 dll 头部让其变成汇编指令去调用 ReflectiveLoader 函数然后 ReflectiveLoader 函数会经过一系列处理最后会调用 DllMain。这时这个 dll 就像 shellcode 一样可以直接执行,其实我们所做的就是解析 dll 找到 ReflectiveLoader 函数并将其地址硬编码写到 Dll 头部然后 call
我这里以 x86 为例 x64 类似都在 py 代码里我就不写了
dec ebp ; M
pop edx ; Z
call 0 ; 为了将下一条指令压到栈里
pop ebx ; 将压到栈里的地址弹到 ebx
push edx ; 恢复 edx
inc ebp ; 恢复 ebp
push ebp ; 保存 ebp
mov ebp, esp ; 切换堆栈
add ebx,0x??? ; ebx+ReflectiveLoader 函数文件偏移-7
call ebx ; call ReflectiveLoader
MZ 都不用多说了都知道是 PE 文件标志对应十六进制的 4D5A 也是 x86 汇编指令的 dec ebp 和 pop edx 你问我为什么要用这个两个开头你看 ReflectiveLoader 函数里的代码就知道了。
call 0 这句是为了将下一条指令的地址压到栈了
pop ebx 这句是为了将栈里的地址弹到 ebx 里
push edx 恢复 edx
inc ebp 恢复 ebp
push ebp 保存 ebp
mov ebp,esp 切换堆栈
add ebx,0xxx 这句就是关键这后面的 0xxx 就是 ReflectiveLoader 函数的文件偏移-7(你问为什么-7 因为文件偏移是从 0 开始的,ebx 从+7 开始)
call ebx 调用 ReflectiveLoader 函数
修改后 dll 基本结构如图
关键的就是这段引导程序是由它来调用 ReflectiveLoader 函数,其余的自己看看 py 代码吧都不难主要就是解析 pe 文件寻址 ReflectiveLoader 函数文件偏移然后将引导程序和文件偏移都硬编码到 dll 头部
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论