关于反射dll修补

没有找到合适的图片

前言

最近开源了一个小工具反射dll修补工具,其原理类似msf和cs分段payload加载,我就算便写写,写的不好勿喷。

废话不多说开始

关于反射dll的原理我实在是懒得写的请看别人吧因为要写的话有点多,反射dll的核心就在ReflectiveLoader函数好好看它的源码吧。

其实所谓的修补反射dll其实就是修改dll头部让其变成汇编指令去调用ReflectiveLoader函数然后ReflectiveLoader函数会经过一系列处理最后会调用DllMain。这时这个dll就像shellcode一样可以直接执行,其实我们所做的就是解析dll找到ReflectiveLoader函数并将其地址硬编码写到Dll头部然后call

我这里以x86为例x64类似都在py代码里我就不写了

1
2
3
4
5
6
7
8
9
10
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基本结构如图

d.png

关键的就是这段引导程序是由它来调用ReflectiveLoader函数,其余的自己看看py代码吧都不难主要就是解析pe文件寻址ReflectiveLoader函数文件偏移然后将引导程序和文件偏移都硬编码到dll头部

github地址:https://github.com/WBGlIl/ReflectiveDLL_Patch