小弟想利用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的程序如下:
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;
}
}
extern "C" int APIENTRY
DllMain(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; // 确定
}
[解决办法]
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毛 不付免谈~~~