zhuayi112 发表于 2023-7-12 10:03

dll挂载跳转问题求解

本帖最后由 zhuayi112 于 2023-9-21 10:47 编辑


一个PE某位置如上图。在地址 0057C46F 位置 添加几句汇编代码。想法如下跳转到pe一段空白位置:
地址:      汇编代码
0057C46F   jmp   677777                                 跳转到PE空白位置
0057C476   push esi
...
...
00677777cmp dword ptr ds: , 555    空白位置添加代码
                  jne 677788
                  mov[内地地址] , ds:
00677788cmp dword ptr ds:,199               
00677792 jmp0057C476                              在跳转回去                                       


上面的代码可以在pe空白位置完成。现在不想在pe里改来改去,想用dll来实现。
想法是pe挂载dll,然后修改0057C46F,跳到dll某个位置实现这段代码 ,然后在跳到0057C476,(已知可以在dll里修改jmp 跳转)现在问题有几点疑惑?
不知道怎么获取这个dll某个位置地址, 然后是不是内嵌汇编方式操作代码,最后在跳转回去。
这里很疑惑求有经验的大佬帮指点指点,非常感谢。

JuncoJet 发表于 2023-7-12 10:08

WriteProcessMemory 修改shellcode就行
OD里面是怎么样的字节码,你就改什么样的字节码

zhuayi112 发表于 2023-7-12 10:10

JuncoJet 发表于 2023-7-12 10:08
WriteProcessMemory 修改shellcode就行
OD里面是怎么样的字节码,你就改什么样的字节码

嗯 WriteProcessMemory,修改位置懂,现在遇到的问题是,跳转到dll里的地址怎么回去?这里是用fun的地址还是 fun中 某一段的地址
voidfun()
{
__asm{

}
}
是这样?

JuncoJet 发表于 2023-7-12 10:15

zhuayi112 发表于 2023-7-12 10:10
嗯 WriteProcessMemory,修改位置懂,现在遇到的问题是,跳转到dll里的地址怎么回去?这里是用fun的地址 ...

jmp 不会返回(需要返回的用call),
fun的约定比较重要 _cdecl 无所谓,_stdcall 得注意平衡
用哪个地址无所谓,不重要,哪个方便用哪个

zhuayi112 发表于 2023-7-12 10:25

JuncoJet 发表于 2023-7-12 10:15
jmp 不会返回(需要返回的用call),
fun的约定比较重要 _cdecl 无所谓,_stdcall 得注意平衡
用哪个地 ...

大大的意思有点明白了,jmp到fun里,然后fun里执行了
00677777cmp dword ptr ds: , 555    空白位置添加代码
                  jne 677788
                  mov[内地地址] , ds:
00677788cmp dword ptr ds:,199
不需要在jmp回去,相当于call了是吗?
可是我这个fun是 void fun() ,能获取到 ebx+14 局部变量内容吗?不是很理解了,难道要把esp指针传进来吗?
哈哈大大能简单写下吗?

yes2 发表于 2023-7-12 10:56

你是想通过注入dll来实现对吧?修改0057C46F位置为jmp的指令可以在dll里实现,加载的时候获取目标PE的基址+偏移可以确定要写入jmp的地址。再根据你dll中的实现函数来计算jmp的偏移。
fun函数建议使用naked裸函数实现,你jmp过来到裸函数的话,是可以直接读取ebx+14这些寄存器现场的。如果是64位的可能就要手写asm文件

zhuayi112 发表于 2023-7-12 11:08

下面是fun简单实现的代码


下面是刚实现的图,发现几个问题
第一 jmp 跳转到 fun 地址后 ret到未知区域。
所以只能使用 call 了。但是 call 执行了后,
cmp dword ptr ds:,199 已经失效了,在fun里面


fun 汇编内容

zhuayi112 发表于 2023-7-12 11:10

yes2 发表于 2023-7-12 10:56
你是想通过注入dll来实现对吧?修改0057C46F位置为jmp的指令可以在dll里实现,加载的时候获取目标PE的基址+ ...

naked裸函数 我试试大大说的这方法。主要这里有个cmp 比较

yes2 发表于 2023-7-12 11:32

可以直接jmp fun函数,只需要在naked函数里用内联汇编jmp回来就行。事实上naked函数似乎也不支持return

zhuayi112 发表于 2023-7-12 11:48

yes2 发表于 2023-7-12 11:32
可以直接jmp fun函数,只需要在naked函数里用内联汇编jmp回来就行。事实上naked函数似乎也不支持return

感谢感谢,这方法可行。jmp到 fun地址 然后在 内联汇编 中jmp回去。

第一个方法估计也是可以,可能要复杂点。 这naked方法比较符合我的想法。
页: [1]
查看完整版本: dll挂载跳转问题求解