修改DLL函数地址问题? 帮帮我郁闷

huangdilei 2008-05-30 12:24:29
#include<windows.h>

#include<stdio.h>

void main()
{
//haha.dll中的函数声明为
//_declspec(dllexport) void run()
//{
// printf("哈哈你死了,给我调到了");
//}



//hehe.dll中的函数声明为
//_declspec(dllexport) void run()
//{
// printf("呵呵你死了,给我调到了");
//}

HMODULE hmodule = LoadLibrary("haha.dll");

int (__stdcall*funhaha)();

funhaha = GetProcAddress(hmodule,"?run@@YAXXZ");

hmodule = LoadLibrary("hehe.dll");

int (__stdcall*funhehe)();

funhehe = GetProcAddress(hmodule,"?run@@YAXXZ");

BYTE bCode[6];
bCode[0]=0xe8; //call
HANDLE hProcess=::GetCurrentProcess();

FlushInstructionCache(hProcess,NULL,0);

//我想在这里更改funhaha()在本程序的地址,更改为funhehe()
//在下面调用funhaha()的时候,将得到funhehe()的运行结果
//有高手建议我这样 函数地址-调用地址-5 机器码,不懂???

WriteProcessMemory(hProcess,........?不知道怎么解决了.....);

funhaha();

int a = 10;

scanf("%d",&a);
}
...全文
60 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangdilei 2008-06-03
  • 打赏
  • 举报
回复
谢谢

我刚刚来的不会给分

记住您的名字了
KeSummer 2008-05-30
  • 打赏
  • 举报
回复
// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };
*(DWORD *)(btNewBytes+ 1) = (DWORD)funhaha ;

::WriteProcessMemory(::GetCurrentProcess(), (void *)funhehe ,
btNewBytes, sizeof(DWORD)*2, NULL);

大概和上面的步骤一样,但是无论是6字节还是8字节拷贝都可能会产生指令碎片,这也是inline hook的缺点之一。为了保证不产生指令碎片,还应该有一个反汇编引擎去识别一条指令的长度。参看detours的代码。
tccqs 2008-05-30
  • 打赏
  • 举报
回复
up and mark,,,似乎在做病毒...噶噶

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧