请哪位用过DLL插入某个系统进程的高手帮帮我 PLZ,急!!

marballwang 2004-11-30 09:24:41
我在把我做好的某个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;
}

请高手们赐教啊
...全文
188 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
marballwang 2004-12-05
  • 打赏
  • 举报
回复
看不懂Delphi,谁能告诉我C的代码?提升权限我也试过了,DLL插入后被插入的进程还是会死掉,
songtitan 2004-12-05
  • 打赏
  • 举报
回复
gz
qrlvls 2004-12-05
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/38/38807.shtm
marballwang 2004-12-02
  • 打赏
  • 举报
回复
没人能够帮我吗??
foxinet 2004-12-01
  • 打赏
  • 举报
回复
可能是你的程序在注入前要提升一下权限
代码如下:
void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
//以调试和查询的方式,打开本进程的令牌环
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken ))
return;
if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &sedebugnameValue))
{
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL ))
CloseHandle( hToken );
}
marballwang 2004-12-01
  • 打赏
  • 举报
回复
好像和权限没有关系,因为DLL已经被成功地插入了,其中的功能也能够实现
marballwang 2004-11-30
  • 打赏
  • 举报
回复
直接运行release出来的.exe文件和在vc.net中编译运行有什么区别?为什么一个可以,另一个会出错?
marballwang 2004-11-30
  • 打赏
  • 举报
回复
为什么我把DLL插入到EXPLORER.EXE,一插就死机啊?
marballwang 2004-11-30
  • 打赏
  • 举报
回复
那请问应该用什么版本的啊?Release版本的?如果DLL中有accept、receive函数放在while里面会不会有问题??
alphagx 2004-11-30
  • 打赏
  • 举报
回复
SetWindowsHook注入不到一些系统进程中,
他只能注入到带有消息循环的进程中
alphagx 2004-11-30
  • 打赏
  • 举报
回复
你看一下你的DLL是不是Debug版本的,
不能将Debug版本的Dll插入进去,必死无疑
marballwang 2004-11-30
  • 打赏
  • 举报
回复
请问怎么样用SetWindowsHookEx函数啊,MSDN中的参数看得头都晕了?
aoosang 2004-11-30
  • 打赏
  • 举报
回复
哇,淡月儿终于升星了??请问多少分才升星阿
danyueer 2004-11-30
  • 打赏
  • 举报
回复
那这种情况没必要用CreateRemoteThread,直接SetWindowsHookEx就可以了。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧