注入DLL的思路步骤:
1. 在目标进程中申请一块内存空间(使用VirtualAllocEx函数) 存放DLL的路径,方便后续执行LoadLibraryA
2. 将DLL路线写入到目标进程(使用WriteProcessMemory函数)
3. 获取LoadLibraryA函数地址(使用GetProcAddress),将其做为线程的回调函数
4. 在目标进程 创建线程并执行(使用CreateRemoteThread)
std::string temp = W2Astring(strDllPath);
int dllLen = temp.size();
const char* pPath = temp.c_str();
LPVOID pDLLPath = VirtualAllocEx(targetProc,NULL,dllLen,MEM_COMMIT,PAGE_READWRITE );
if( pDLLPath == NULL )
{
TRACE(_T("CUtility::InjectDllToProc VirtualAllocEx failed\n"));
return false;
}
SIZE_T wLen = 0;
int ret = WriteProcessMemory(targetProc,pDLLPath,pPath,dllLen,&wLen);
if( ret == 0 )
{
VirtualFreeEx(targetProc, pDLLPath, dllLen, MEM_DECOMMIT);
TRACE(_T("CUtility::InjectDllToProc WriteProcessMemory failed\n"));
return false;
}
FARPROC myLoadLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"),"LoadLibraryA");
if( myLoadLibrary == NULL )
{
VirtualFreeEx(targetProc, pDLLPath, dllLen, MEM_DECOMMIT);
TRACE(_T("CUtility::InjectDllToProc GetProcAddress failed\n"));
return false;
}
HANDLE tHandle = CreateRemoteThread(targetProc,NULL,NULL,
(LPTHREAD_START_ROUTINE)myLoadLibrary,pDLLPath,NULL,NULL);
if(tHandle == NULL)
{
VirtualFreeEx(targetProc, pDLLPath, dllLen, MEM_DECOMMIT);
TRACE(_T("CUtility::InjectDllToProc CreateRemoteThread failed\n"));
return false;
}
WaitForSingleObject(tHandle,INFINITE);
VirtualFreeEx(targetProc, pDLLPath, dllLen, MEM_DECOMMIT);
CloseHandle(tHandle);
return true;
}
卸载钩子 /* 卸载步骤和注入DLL步骤实质差不多. 注入DLL是 在目标进程中执行LoadLibraryA 卸载DLL是 在目标进程中执行FreeLibrary函数,不同的是卸载不需要再目标进程中申请空间, 因为FreeLibrary参数为HMODULE 实际上就是一个指针值。这个句柄已经加载就已经存在。 */
dll注入,入口
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
InlineHookIE();
}
break;
case DLL_PROCESS_DETACH:
UnInlineHookIE();
break;
}
return TRUE;
}
main主方法-》InlinkHookie方法->g_inlineHookObj7類的方法hook(获取模块句柄、获取进程地址、读取当前进程内存,7个字节,并储存起来、修改进程内存7个字节)
相當注入器:把dll注入到exe 事件觸發執行dll注入到exe(// 获取到的每个EXE进程列表句柄都进行DLL注入) 注入DLL的思路步骤: 1. 在目标进程中申请一块内存空间(使用VirtualAllocEx函数) 存放DLL的路径,方便后续执行LoadLibraryA 2. 将DLL路线写入到目标进程(使用WriteProcessMemory函数) 3. 获取LoadLibraryA函数地址(使用GetProcAddress),将其做为线程的回调函数 4. 在目标进程 创建线程并执行(使用CreateRemoteThread) */
|