首页
社区
课程
招聘
[求助]IATHOOK+DLL注入不成功,但是程序HOOK自身却能成功!请求指点一二
发表于: 2013-11-15 16:03 5923

[求助]IATHOOK+DLL注入不成功,但是程序HOOK自身却能成功!请求指点一二

2013-11-15 16:03
5923
首先下面是利用IATHOOK HOOK自身MessageBox函数!测试是通过的

// HookDll.cpp : 定义 DLL 应用程序的导出函数。
//
#include <windows.h>
#include <delayimp.h>
#include <stdio.h>

//定义函数原型
typedef int (WINAPI *PFNMESSAGEBOX)(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType);
//保存原始的MessageBox地址,注意这里
PROC g_orgProc = (PROC)MessageBoxA;

//WINUSERAPI
int WINAPI MyMessageBoxA(__in_opt HWND hWnd,
			  __in_opt LPCWSTR lpText,
			  __in_opt LPCWSTR lpCaption,
			  __in UINT uType)
{
	//todo yourself
	return ((PFNMESSAGEBOX)g_orgProc)(NULL, "IATHook 成功", "caption", MB_OK);
}

void SetHook()
{
		HMODULE hModule = NULL;
		hModule = GetModuleHandle(NULL);	//定位到当前EXE的基地址
		IMAGE_DOS_HEADER* pImageDosHearder = (IMAGE_DOS_HEADER*)hModule;	// 定位到DOS头
		IMAGE_OPTIONAL_HEADER* pImageOptionalHeader = (IMAGE_OPTIONAL_HEADER*)((DWORD)hModule+pImageDosHearder->e_lfanew+24);    
		IMAGE_IMPORT_DESCRIPTOR* pImageImportDescriptor = (IMAGE_IMPORT_DESCRIPTOR*)
			((DWORD)hModule+ pImageOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
		
		BOOL bFindDll = FALSE;
		while(pImageImportDescriptor->FirstThunk)
		{
			char* pszDllName = (char*)((BYTE*)hModule + pImageImportDescriptor->Name);
			printf("模块名称:%s\n", pszDllName);
	
			if (_stricmp(pszDllName, "user32.dll") == 0)//如果是user32.dll
			{
				bFindDll = TRUE;
				break;
			}
			pImageImportDescriptor++;	
		}
	
		if (bFindDll)
		{
			printf("准备写入:\n");
			DWORD n = 0;		//计数器
			//一个IMAGE_THUNK_DATA就是一个导入函数
			IMAGE_THUNK_DATA *pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModule + pImageImportDescriptor->OriginalFirstThunk);
			while(pThunk->u1.Function)
			{
				//取得函数名称
				char* pszFuncName = (char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2); //函数名前面有两个..
				//比较函数名称
				if (_stricmp(pszFuncName, "MessageBoxA") == 0)
				{
					PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImageImportDescriptor->FirstThunk) + n;
					DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
					
					DWORD OldProtect = 0;
					DWORD NewProtect = 0;
					VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &OldProtect);		//将指定内存设为可读写
					if (!WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL))
					{
						return;
					}
					//VirtualProtect(lpAddr, sizeof(DWORD), OldProtect, &NewProtect );		//还原内存属性
					printf("成功写入:\n");
					return;
				}
				n++;
			}
		}
}


/*
VOID WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)
{
	switch (_Reason)
	{
	case DLL_PROCESS_ATTACH:
		MessageBoxA(NULL, "原来的", "原来的", 0);
		printf("准备注入\n");
		SetHook();
		break;
	case DLL_PROCESS_DETACH:
		break; 
	}
}*/


int main(int argc, char* argv[])
{
	::MessageBoxA(NULL, "before hook", "", MB_OK);
	SetHook();
	::MessageBoxA(NULL, "AFTERE hook", "", MB_OK);
	return 0;
}


去掉上段代码中的注释,将入口函数改为DllMain,并且编译成为DLL 远程注入到DEMO程序就会出现:"xxxx"内存不能为READ 之类的错误!实在不解!
DEMO在此:求指点,是不是DLL加载后不存在内存中?还是怎么样?要怎么解决?
IATHookTest.rar

今天有空,我分析了一下!我发现了一个问题:
DLL注入函数执行成功但是DLL在函数执行完成之后被卸载了,并没有长驻在内存中。到底为何?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
VirtualProtect(lpAddr改为VirtualProtectEX(-1,lpAddr
2013-11-15 16:49
0
雪    币: 357
活跃值: (3468)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
DllMain 里要 return 1;

另一个注入不成功,只需要 | PROCESS_QUERY_INFORMATION

OpenProcess(PROCESS_QUERY_INFORMATION
2013-11-15 16:57
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
权限,令牌啥的,每个要权限的函数后面都GetLastError就能弄明白了……
2013-11-15 23:52
0
雪    币: 19
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark IATHOOK
2013-11-16 00:26
0
游客
登录 | 注册 方可回帖
返回
//