请哪位用过DLL插入某个系统进程的高手帮帮我 PLZ,急!!
我在把我做好的某个DLL插入到某个进程中后,只要这个进程不被用到,DLL内的功能都能够正常地实现。然而一用到这个被插入的进程(比如QQ.EXE,只要插入后点出QQ窗口),此进程就死掉了,只能用进程管理器强行关闭。我一开始估计是由于这个DLL被进程重复调用的问题,后来我在DLL的入口处做了一个记数器,只在第一次调用时从该入口进入,代码如下:
int i=0;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(i==0) {
MessageBox(NULL,"diao yong","Caption",0);
::RemoveDirectory("c:\\aaa");
i++;
}
return TRUE;
}
虽然现在只从入口走一次(MessageBox只弹出过一次),但是一旦被插入进程被使用到,该进程仍然会死掉。请高手帮帮忙,怎么解决这个问题,DLL插入进程的代码如下:
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)//函数头
{
//调用VirtualAllocEx()函数在目标进程中分配内存
//找到目标进程的PID,把目标进程锁定为QQ.exe
//下面是获取explorer.exe的PID
DWORD pid; //声明PID
HANDLE hSnapshot = NULL;
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
PROCESSENTRY32 a;
a.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot,&a);
do
{
if(strcmp(a.szExeFile,"QQ.EXE")==0)
{
pid = a.th32ProcessID;//匹配,找到
break;
}
}
while(Process32Next(hSnapshot,&a)==TRUE);
CloseHandle (hSnapshot);//,找到了PID,善后
PWSTR pszLibFileRemote = NULL;//待会要作为传递的参数,(实际上是要存放我
//的DLL的空间)
HANDLE hRemoteProcess = NULL;
HANDLE hRemoteThread = NULL;
//下面这个OpenProcess() 来打开目标进程的,参数的设置
hRemoteProcess = OpenProcess(
PROCESS_QUERY_INFORMATION |PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | // 允许远程VM操作
PROCESS_VM_WRITE, // 允许远程VM写操作
FALSE, pid);
char CurPath[256]; //用来存放当前路径
GetCurrentDirectory(256,CurPath);//获得当前的路径
strcat(CurPath,"\\我的DLL.dll"); //.dll的路径放入CurPath
MessageBox(NULL,CurPath,"eee",0);
//计算DLL路径名需要的内存空间
int changdu = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
int changdu = (strlen(CurPath)+1)*2;
WCHAR wCurPath[256];
MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);
//调用VirtualAllocEx()函数在目标进程中分配内存
pszLibFileRemote = (PWSTR)VirtualAllocEx(hRemoteProcess, NULL, changdu, MEM_COMMIT, PAGE_READWRITE);
//用WriteProcessMemory()函数向申请的内存中写入要注入.dll的路径和名称,也就是参数
WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) wCurPath, changdu, NULL);
//远程进程 //具体空间 //路径 //长度
//计算LoadLibraryW的入口地址,也就是远程线程的地址pfndizhi,用它来启动DLL
PTHREAD_START_ROUTINE pfndizhi = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
//利用CreateRemoteThread()在远程进程中创建一个线程,这个线程执行LoadLibraryW
//就实现了通过远程线程调用用户的DLL文件
//要把LoadLibraryW的入口地址代入
hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, pfndizhi, pszLibFileRemote,0, NULL);
return 0;
}
请高手们赐教啊