首页
社区
课程
招聘
[旧帖] [求助]新手请教一个注入的问题-取不到正确的函数地址 0.00雪花
发表于: 2011-4-2 18:39 1334

[旧帖] [求助]新手请教一个注入的问题-取不到正确的函数地址 0.00雪花

2011-4-2 18:39
1334
在下是个菜鸟,刚开始学习注入等内容,自己写了一个模拟注入的程序,可是调试时总是不成功,特来请教论坛里的各位达人,如能指点,至为感谢。

目标程序是一个简单的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期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
调下你这句代码。

你这里不需要写入回调函数地址,你自己计算下你代理函数的地址,直接跳过去

还有的你代码不能下载
2011-4-2 18:55
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
載點是掛掉的喔

修正一下吧
2011-4-2 19:33
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
代码下载点已修复;
感谢回复,不过老兄的回答我不是很明白,抱歉……

似乎我没有写入回调函数的地址啊?我写入的是要进行处理的函数GetBuff()的地址(是个静态函数)。现在主要是我获得不到GetBuff()的正确地址……
2011-4-2 19:58
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你这个程序的要求,我建议你开内存映射,好像不是注入的问题!
2011-4-2 22:24
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
实践证明,不是 dwCallFrontAddr = (DWORD)GetBuff;这句的问题,是GetBuff函数本身的问题。

我把GetBuff函数改成这样,
VOID GetBuff()
{
	::MessageBox(NULL, TEXT("getbuff function"),TEXT("aaa"),MB_OK);
  
	//char *Tar = NULL;

	//_asm
	//{
	//	mov Tar, edi;
	//}
	//Log(Tar);
	//_asm
	//{
	//	mov ebx, 0x401480;
	//	call ebx;
	//}
}


效果如图:

OD效果如图:


完整的代码如下:
mycode.rar

顺便说下我用的vs2008 工程文件做了转换,打开原来的就行
上传的附件:
2011-4-3 21:18
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
因为连续多天没有上网所以没有及时回复,抱歉;

应该说我没有表达清楚吧
老兄指出的问题后来我经过调试,结果是一样的。

主要的问题其实就在GETBUFF()内,其实就是GETBUFF()获取完毕字符串指针后,跳转回去的时候出了问题。

那个跳转回去的call地址,按说应该是正确的,因为是捕获的修改之前的跳转地址;
但为何我一跳转就出错呢?

想了很久,大概可能是寄存器或标志位现场保护的问题;可能哪个寄存器值或者标志我没有在使用时保护好吧?

这里似乎有一个两难的问题:我使用完毕GETBUFF()最后一步必然是call那个跳转地址以便回去,这样的话岂不是无论如何都有一个寄存器我无法保护?那该怎么办呢?

我用OD查了下,我旋转地EBX寄存器在其后似乎没有使用到,所以才选择了它;但不知为何还是出错,因为我调试很挫,所以实在不知道到底哪里没有保护导致出问题了……
2011-4-11 17:30
0
游客
登录 | 注册 方可回帖
返回
//