首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟念利用CreateRemoteThread 和 LoadLibrary实现在exporer.exe进程里映射自己的写的一个DLL,但是DLL里面的代码没有执

2013-10-01 
小弟想利用CreateRemoteThread 和 LoadLibrary实现在exporer.exe进程里映射自己的写的一个DLL,但是DLL里面

小弟想利用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;


将要映射的DLL(InspectQQLandDlg)的代码如下:
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;   // 确定
}

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毛 不付免谈~~~

热点排行