读书人

小弟想利用CreateRemoteThread 和 Loa

发布时间: 2012-05-09 12:13:59 作者: rapoo

小弟想利用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毛 不付免谈~~~

读书人网 >C++

热点推荐