进程注入技术:CreateRemoteThread 和 LoadLibrary技术的步骤 (非dll注入)

来源:互联网 发布:java中的同步方法 编辑:程序博客网 时间:2024/04/30 17:05

1、得到远程进程的HANDLE(OpenProcess)

2、在远程进程中为DLL文件名分配内存(VirtualAllocEx)

3、把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory)

4、使用CreateRemoteThread和LoadLibrary把你的DLL映射进远程进程

5、等待远程进程结束(WaitForSingleObject),即等待LoadLibrary返回,也就是说当我们的DllMain返回时,远程线程也就立即结束了。

6、取回远程线程的结束码(GetExitCodeThread),即LoadLibrary的返回值---我们DLL加载后的基地址(HMODULE)

7、释放第2步分配的内存(VirtualFreeEx).

8、用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递第6步取得的HMODULE给FreeLibrary(通过CreateRemoteThread的lpParameter参数)

9、等待线程的结束(WaitSingleObject)

最后,关闭所有的句柄,包括4、8步生成的线程句柄,1生成的远程进程句柄

简略的代码如下:

HANDLE hThread;

char szLibPath[_MAX_PATH];//  c:/.../LibSpy.dll

void* pLibRemote;    //szLibPath将要复制到的地址

DWORD hLibModule;    //已加载的DLL的基地址(HMODULE)

HMODULE hKernel32 = ::GetModuleHandle("Kernel32");

//初始化szLibPath

//......

pLibRemote = ::VirtualAllocEx(hProcess, NULL, sizeof(szLibPath), MEM_COMIT, PAGE_READWRITE );

::WriteProcessMemory(hProecess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL );

//加载LibSpy.dll到远程进程

hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernel32, "LoadLibraryA", pLibRemote, 0, NULL));

::WaitForSingleObject(hThread, INFINITE);

::GetExitCodeThread(hThread, &hLibModule);

::CloseHandle(hThread);

::VirtualFreeEx( hProcess, pLibRemote, sizeof(szLibPath), MEM_RELEASE);

.......

.......

//卸载

hThread = ::CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernel32, "FreeLibrary"), (void*)hLibModule, 0, NULL);

::WaitForSingleObject(hTread, INFINITE );

::CloseHandle(hThread);

 

//待续

原创粉丝点击