-
-
[旧帖]
[求助]新手请教一个注入的问题-取不到正确的函数地址
0.00雪花
-
发表于:
2011-4-2 18:39
1334
-
[旧帖] [求助]新手请教一个注入的问题-取不到正确的函数地址
0.00雪花
在下是个菜鸟,刚开始学习注入等内容,自己写了一个模拟注入的程序,可是调试时总是不成功,特来请教论坛里的各位达人,如能指点,至为感谢。
目标程序是一个简单的MFC程序,启动后开启计时器,内部的一个字符串随之改变,我的想法就是通过另外一个程序的注入,读取它不断更改的字符串内容。
下载代码已修复
这里是完整的工程代码
实际的做法是通过OD的调试,检测到目标程序在代码段的0x40146c处会推字符串地址入寄存器,然后使用call调用别的函数进行处理,于是我就想改写此处代码,将call的地址先跳到注入模块的函数处,截获完毕,再跳转回来继续进行。
实际调试时发现覆盖地址似乎成功,call的地址确实更改,但在获取注入模块处理函数的自身地址时却产生了错误,导致无法成功跳转。
注入DLL的代码我大致是这样写的:
这里是处理截获的字符串的部分:
VOID GetBuff()
{
char *Tar = NULL;
_asm
{
mov Tar, edi;
}
Log(Tar);
_asm
{
mov ebx, 0x401480;
call ebx;
}
}
这里是HOOK以后回调函数处理部分:
LRESULT CALLBACK HookExProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (false == bHooked)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//[COLOR="Red"]问题出在这里:GetBuff()获得的地址是错误的[/COLOR] dwCallFrontAddr = (DWORD)GetBuff;
dwCallFrontAddr -= dwWriteAddr;
dwCallFrontAddr -= 0x4;
WriteEx();
bHooked = true;
}
return CallNextHookEx(MainHook, nCode, wParam ,lParam);
}
这里是写入部分的代码:
BOOL WriteEx()
{
HWND Proc = FindWindow(NULL, "AsmTarget");
if (NULL == Proc)
{
Log("WriteEx() FindWindow() failed.");
return FALSE;
}
DWORD dwProcessID = 0;
DWORD dwhThread = GetWindowThreadProcessId(Proc, &dwProcessID);
if (0 >= dwhThread || 0 >= dwProcessID)
{
Log("WriteEx() GetWindowThreadProcessId() failed.");
return FALSE;
}
HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if (NULL == hHandle)
{
Log("WriteEx() OpenProcess() failed.");
return FALSE;
}
//dwWriteAddr是要写入的地址;dwCallFrontAddr是要调用的处理函数的地址
BOOL wRes = WriteProcessMemory(hHandle, (DWORD*)dwWriteAddr, &dwCallFrontAddr, 4, NULL);
if (FALSE == wRes)
{
Log("WriteEx() WriteProcessMemory() failed.");
return FALSE;
}
CloseHandle(hHandle);
return TRUE;
}
现在的关键问题就是dwCallFrontAddr = (DWORD)GetBuff;这一句,获得的是一个完全错误的值,我百思不得其解,请问怎样才能获得正确的GetBuff函数地址?
谢谢各位了!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)