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某个位置地址, 然后是不是内嵌汇编方式操作代码,最后在跳转回去。
这里很疑惑求有经验的大佬帮指点指点,非常感谢。 WriteProcessMemory 修改shellcode就行
OD里面是怎么样的字节码,你就改什么样的字节码 JuncoJet 发表于 2023-7-12 10:08
WriteProcessMemory 修改shellcode就行
OD里面是怎么样的字节码,你就改什么样的字节码
嗯 WriteProcessMemory,修改位置懂,现在遇到的问题是,跳转到dll里的地址怎么回去?这里是用fun的地址还是 fun中 某一段的地址
voidfun()
{
__asm{
}
}
是这样? zhuayi112 发表于 2023-7-12 10:10
嗯 WriteProcessMemory,修改位置懂,现在遇到的问题是,跳转到dll里的地址怎么回去?这里是用fun的地址 ...
jmp 不会返回(需要返回的用call),
fun的约定比较重要 _cdecl 无所谓,_stdcall 得注意平衡
用哪个地址无所谓,不重要,哪个方便用哪个 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指针传进来吗?
哈哈大大能简单写下吗? 你是想通过注入dll来实现对吧?修改0057C46F位置为jmp的指令可以在dll里实现,加载的时候获取目标PE的基址+偏移可以确定要写入jmp的地址。再根据你dll中的实现函数来计算jmp的偏移。
fun函数建议使用naked裸函数实现,你jmp过来到裸函数的话,是可以直接读取ebx+14这些寄存器现场的。如果是64位的可能就要手写asm文件 下面是fun简单实现的代码
下面是刚实现的图,发现几个问题
第一 jmp 跳转到 fun 地址后 ret到未知区域。
所以只能使用 call 了。但是 call 执行了后,
cmp dword ptr ds:,199 已经失效了,在fun里面
fun 汇编内容
yes2 发表于 2023-7-12 10:56
你是想通过注入dll来实现对吧?修改0057C46F位置为jmp的指令可以在dll里实现,加载的时候获取目标PE的基址+ ...
naked裸函数 我试试大大说的这方法。主要这里有个cmp 比较 可以直接jmp fun函数,只需要在naked函数里用内联汇编jmp回来就行。事实上naked函数似乎也不支持return yes2 发表于 2023-7-12 11:32
可以直接jmp fun函数,只需要在naked函数里用内联汇编jmp回来就行。事实上naked函数似乎也不支持return
感谢感谢,这方法可行。jmp到 fun地址 然后在 内联汇编 中jmp回去。
第一个方法估计也是可以,可能要复杂点。 这naked方法比较符合我的想法。
页:
[1]