小弟想利用CreateRemoteThread 和 LoadLibrary实现在exporer.exe进程里映射自己的写的一个DLL,但是DLL里面的代码没有执
c++,用的vs2010,在debug下调试可以利用OpenProcess在调试的自动窗口得到explorer.exe的进程id,也可以利用CreateRemoteThread在调试的自动窗口得到远程句柄。在release模式下“自动窗口”和“局部变量”都看不到explorer.exe的进程id和远程句柄,在“监视”窗口监视这两个变量的时候又会提示“CXX0017:错误,没有找到符号hRemoteProcess”。
在debug模式下,可以得到创建远程线程的句柄啊,这是不是说我的DLL已经成功映射到了explorer.exe进程里面了呢?
但是不管怎么样,DLL里面的代码好像怎么都不执行。
exe的映射远程DLL的程序如下:
- C/C++ code
HANDLE hSnapshot ; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if ( hSnapshot == INVALID_HANDLE_VALUE) { MessageBox ( NULL, "shibai", "RemoteDLL", MB_OK ); exit(1); } string lpName = "explorer.exe" ; //设定需要监视的进程名 我的系统里面是小写的 PROCESSENTRY32 pe; pe.dwSize = sizeof ( PROCESSENTRY32 ); for( BOOL fOk = Process32First ( hSnapshot, &pe ) ; fOk; fOk = Process32Next( hSnapshot, &pe ) ) { if ( pe.szExeFile == lpName ) { //获取远程进程(OpenProcess)的 HANDLE; HANDLE hRemoteProcess; hRemoteProcess = OpenProcess ( PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID ) ; //HANDLE hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,FALSE, pe.th32ProcessID ); //取得目标DLL的当前路径(路径可自由设置) char szInspectDllPath[128] ; GetCurrentDirectory ( 128, szInspectDllPath ) ; strcat ( szInspectDllPath, "\\InspectQQLandDlg.dll"); //申请存放文件名的空间 //为远程进程中的 DLL名分配内存(VirtualAllocEx); LPVOID pszInspectDllRemote ; int InspectDllNameLength = sizeof ( szInspectDllPath ) + 1 ; pszInspectDllRemote = VirtualAllocEx ( hRemoteProcess, NULL, InspectDllNameLength, MEM_COMMIT, PAGE_READWRITE ); //把dll文件名写入申请的空间 //将使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 WriteProcessMemory ( hRemoteProcess, pszInspectDllRemote, (LPVOID)szInspectDllPath, InspectDllNameLength, NULL); //获取动态链接库函数地址 远程函数中执行的函数的地址 HMODULE hModule ; hModule = GetModuleHandle ( "kernel32.DLL" ) ; LPTHREAD_START_ROUTINE fnStartAddr ; fnStartAddr = ( LPTHREAD_START_ROUTINE ) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); //创建远程线程 HANDLE hInspectRemoteThread = NULL ;//存放远程线程句柄 hInspectRemoteThread = CreateRemoteThread ( hRemoteProcess, NULL, 0, fnStartAddr, pszInspectDllRemote, 0, NULL ) ; //等待远程线程结束 WaitForSingleObject(hRemoteProcess, INFINITE); CloseHandle(hRemoteProcess); //必须等到远程线程结束后才能释放宿主进程中所分配的内存,否则宿主进程会直接崩溃 //释放 VirtualAllocEx 分配的内存 VirtualFreeEx(hRemoteProcess, fnStartAddr, 0, MEM_RELEASE); VirtualFreeEx(hRemoteProcess, pszInspectDllRemote, 0, MEM_RELEASE); CloseHandle(hInspectRemoteThread); if( hSnapshot != NULL ) CloseHandle ( hSnapshot ) ;//关闭进程快照 return 0; } } 将要映射的DLL(InspectQQLandDlg)的代码如下:
- C/C++ code
extern "C" int APIENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved){ // 如果使用 lpReserved,请将此移除 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("InspectQQLandDlg.DLL 正在初始化!\n"); // 扩展 DLL 一次性初始化 if (!AfxInitExtensionModule(InspectQQLandDlgDLL, hInstance)) { char szProcessId[64] ; _itoa ( GetCurrentProcessId(), szProcessId, 10 ); MessageBox( NULL, szProcessId, "RemoteDLL", MB_OK ); MessageBox ( 0, "Code Injection success!", "NOTE", MB_OK ) ; } return 0; new CDynLinkLibrary(InspectQQLandDlgDLL); //下面这句会给你创建远程线程成功的提示。 MessageBox ( 0, "Code Injection success!", "NOTE", MB_OK ) ; HANDLE hNewThread = CreateThread ( NULL, 0,ThreadForInspect, NULL, 0, 0 ) ; } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("InspectQQLandDlg.DLL 正在终止!\n"); // 在调用析构函数之前终止该库 AfxTermExtensionModule(InspectQQLandDlgDLL); char szProcessId[64] ; _itoa ( GetCurrentProcessId(), szProcessId, 10 ); MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK ); } return 1; // 确定}
DLL里面的代码(即弹出消息框确认DLL已经成功映射),并没有执行,小弟已经困扰了两天了,身边没有个老师,只有自己找资料专研,实在是没有办法了,恳请各位大侠帮忙看看,万分感谢
[解决办法]
LoadLibraryW 参数是const wchar_t* 不是char*
[解决办法]
char szInspectDllPath[128] ;
GetCurrentDirectory ( 128, szInspectDllPath ) ;
strcat ( szInspectDllPath, "\\InspectQQLandDlg.dll");
[解决办法]
按照你上面的代码看,是ANSI编译的,但是调用的函数是LoadLibraryW.
fnStartAddr = ( LPTHREAD_START_ROUTINE ) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
[解决办法]
把LoadLibraryW换成LoadLibraryA. 我c,难道这是你第一次写程序吗????
[解决办法]
私聊要收费的 一字5毛 不付免谈~~~