zhuayi112 发表于 2023-11-9 20:11

别人exe写了一个dll通过导入想替换exe原先call的地址,现在自己dll地址总是变化

extern "C" int __declspec(dllexport) add(int a, int b);

int __declspec(dllexport) add(int a, int b)
{
return a + b;
}

别人的exe,把exe用x32dbg,动态加载反汇编后看到一段地方有个call 0x123456 , 这call 0x123456 ,分析后它是一个add的方法。 于是我自己写了一个dll,模仿出add的方法。
现在用 StudyPE+ 把我写的a.dll 导入进去,并添加add方法。
我用直接用x32dbg,在符号里找到a.dll,然后找到这a.dll里add的地址。复制这地址把 call 0x123456 替换成这个a.dll方法add在exe显示的地址。
每次加载好像地址都会变导致出问题,请问这地址要怎么计算才是真正的a.dll 里add方法的地址。

iamok 发表于 2023-11-9 21:00

用detour来hook call

zhuayi112 发表于 2023-11-9 21:11

iamok 发表于 2023-11-9 21:00
用detour来hook call

你好除了HOOK 没办法了吗?我自己写个dll然后用导入方法把dll导入进去,这时候不能直接 把call 0x1223456 改成 OD里看到的 dll 里方法的入口地址吗?

白陌陌 发表于 2023-11-9 21:12

我水平一般哈,仅供参考!
0x0 用hook的办法:给你的dll加上hook功能,取出自己dll中add()方法的地址,然后hook目标程序,修改目标程序的代码以指向你的add()方法的地址
0x1 用API获取dll地址:首先先要取出你的dll的基址(GetModuleHandle),然后查看你dll的导出表,找到add()方法的偏移量(GetProcAddress),用基址+偏移得到地址

董督秀 发表于 2023-11-9 21:15

zhuayi112 发表于 2023-11-9 21:11
你好除了HOOK 没办法了吗?我自己写个dll然后用导入方法把dll导入进去,这时候不能直接 把call 0x1223456 ...

通过纯汇编可以实现,动态定位。无需Hook。

zhuayi112 发表于 2023-11-9 21:25

董督秀 发表于 2023-11-9 21:15
通过纯汇编可以实现,动态定位。无需Hook。

大佬问下动态定位是怎么实现的,能大概的介绍下吗?我现在是用pe把dll导出的方法添加到exe中。然后用od在符号里找到dll导出的方法入口地方的地址,直接修改exe里call add 的地址替换成dll里方法的add地址

董督秀 发表于 2023-11-9 21:34

zhuayi112 发表于 2023-11-9 21:25
大佬问下动态定位是怎么实现的,能大概的介绍下吗?我现在是用pe把dll导出的方法添加到exe中。然后用od在 ...

可以用汇编实现loadlibrary,call 123456h 替换成 call 空白地址 ,在空白地址 加上汇编的代码,该处的代码作用是载入a.dll,注意a.dll的名称。之后再通过汇编获取a.dll的基址,加上偏移,定位到a.dll内部你自己写的all函数里,把这个地址保存到寄存器,最后再call寄存器。

zhuayi112 发表于 2023-11-9 21:36

董督秀 发表于 2023-11-9 21:34
可以用汇编实现loadlibrary,call 123456h 替换成 call 空白地址 ,在空白地址 加上汇编的代码,该处的代 ...

懂了,大佬请问下这样修改后给exe加壳不影响内容吧

xlhwxyh 发表于 2023-11-9 21:46

用GetModuleHandle   获取模块句柄,这个句柄它其实就是模块的基址,也就是模块加载地址,
偏移量 = 单前地址 - 模块基址;

可以用偏移量来计算新的地址!!!!!!!!!
实际地址 = 模块基址 + 偏移量;

zhuayi112 发表于 2023-11-9 23:24

xlhwxyh 发表于 2023-11-9 21:46
用GetModuleHandle   获取模块句柄,这个句柄它其实就是模块的基址,也就是模块加载地址,
偏移量 = 单 ...

感觉很复杂,大佬论坛里有这方面的资料和例子吗?
页: [1] 2
查看完整版本: 别人exe写了一个dll通过导入想替换exe原先call的地址,现在自己dll地址总是变化