DLL插入问题
自己写了一个简单的DLL文件,只用于简单的测试.我想将这个DLL文件插入到另外的进程中去运行,其结果应该是能看到一个提示窗口.
我在网上查了一些资料,使用了如下代码注入到别的进程后,但是并没有提示窗口的出现,问题大概出在没有调用导出的ShowMe()函数(ShowMe()为DLL中唯一的导出函数).
请教:我如何在将DLL插入到别的进程后,再调用其中的导出函数,使其正常工作?
//////////////////////////////////////////////////////////////////////////////
DLL的主要源码如下(其中ShowMe()为唯一的导出函数):
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void ShowMe ()
{
MessageBox (0, "Injected!\n", "Notice", MB_OK);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
主程序的主要源码如下(主程序EXE和要注入的DLL在同一目录下):
#include "stdafx.h"
#include <stdlib.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//得到主程序也就是DLL的绝对路径
LPTSTR path=(LPTSTR)malloc(255);
GetCurrentDirectory(255,path);
strcat((char *)path,"\\dllpro.dll");
char *FullName = (char *)path;
//如果是要打开系统进程,还要先申请debug权限
//申请权限部分略......
HANDLE hRemoteProcess = NULL;
//被注入的进程ID假设为688
if ((hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE | //允许远程VM写
PROCESS_VM_READ, //允许远程VM读
0,
688)) == NULL)
{
//debug--
MessageBox(NULL,"打开进程失败!","信息",MB_OK);
return 1;
}
char *pDllName = NULL;
if ((pDllName = (char *)VirtualAllocEx( hRemoteProcess,
NULL,
lstrlen(FullName) + 1,
MEM_COMMIT,
PAGE_READWRITE)) == NULL)
{
CloseHandle(hRemoteProcess);
return 1;
}
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
if (WriteProcessMemory(hRemoteProcess,
pDllName,
FullName,
lstrlen(FullName),
NULL) == 0)
{
VirtualFreeEx(hRemoteProcess,pDllName,0,MEM_RELEASE);
CloseHandle(hRemoteProcess);
return 1;
}
//计算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = NULL;
if ((pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle(TEXT("kernel32")), "LoadLibraryA")) == NULL)
{
VirtualFreeEx(hRemoteProcess,pDllName,0,MEM_RELEASE);
CloseHandle(hRemoteProcess);
return 1;
}
DWORD ThreadId = 0;
HANDLE Result=0;
//这里好像并未执行DLL中的导出函数?
//那创建的线程执行的是什么?
Result= CreateRemoteThread(hRemoteProcess, //被嵌入的远程进程
NULL,
0,
pfnStartAddr, //LoadLibraryA的入口地址
pDllName,
0,
&ThreadId);
CloseHandle(hRemoteProcess);
free(path);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
请问:以上代码中如何使CreateRemoteThread()函数执行DLL中的导出函数?
急切盼望各位大侠解答!!!
问题点数:20、回复次数:16Top
1 楼sunxysong(寒羽)回复于 2005-08-02 08:54:47 得分 0
自己顶一下Top
2 楼linestyle(linestyle)回复于 2005-08-02 09:26:51 得分 0
你在什么调用了ShowMe 函数啊??Top
3 楼surstar(我要写个操作系统出来……)回复于 2005-08-02 09:58:42 得分 10
case DLL_PROCESS_ATTACH:
ShowMe();
break;
试一下
CreateRemoteThread()是让目标进程创建新线程,新线程地址就是第四个参数Top
4 楼sunxysong(寒羽)回复于 2005-08-03 16:01:39 得分 0
我去试一下.顺便问一下,如何得到CreateRemoteThread()创建的线程函数的返回值?(是线程函数的返回值)Top
5 楼Areslee(懒虫易水)回复于 2005-08-04 17:39:35 得分 0
参考MSDN。。。。。。Top
6 楼sunxysong(寒羽)回复于 2005-08-06 15:25:03 得分 0
to Areslee(懒虫易水)
能给出MSDN该问题的具体地址吗?谢谢Top
7 楼sunxysong(寒羽)回复于 2005-08-11 14:34:28 得分 0
再一次求教Top
8 楼nf3()回复于 2005-08-11 15:10:28 得分 0
如何向CSRSS.EXE进程插入一个DLL ?Top
9 楼nf3()回复于 2005-08-11 15:14:59 得分 0
你必须确定你的DLL中的导出函数在你插入的进程中的地址,才能用CreateRemoteThread()Top
10 楼nanfeng231(木木)回复于 2005-08-11 17:54:41 得分 5
应该不会调用,除非DLL_PROCESS_ATTACH下调用Top
11 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-08-11 23:59:38 得分 5
DLL加载的时候,可以捕获到DLL_PROCESS_ATTACH
case DLL_PROCESS_ATTACH:
ShowMe();
break;
在这里加入你的函数,这样,DLL在加载的时候,就可以执行你的ShowMe();了。呵呵。Top
12 楼mjcom(不明飞行物)回复于 2005-08-12 08:01:12 得分 0
...............Top
13 楼Areslee(懒虫易水)回复于 2005-08-15 13:24:54 得分 0
安装MSDN,然后以CreateRemoteThread为索引搜之
地址无法给出Top
14 楼sunxysong(寒羽)回复于 2005-08-17 09:37:52 得分 0
我试了试
case DLL_PROCESS_ATTACH:
ShowMe();
break;
个这方法是可行的.多谢上面几位
还想多问一下,case DLL_THREAD_ATTACH:中的语句是什么时候被执行的?
我在case DLL_THREAD_ATTACH:中加了一个函数,但是在插入后并未被执行,请各位指教
Top
15 楼sunxysong(寒羽)回复于 2005-08-19 13:21:56 得分 0
自己再顶一下Top
16 楼sunxysong(寒羽)回复于 2005-08-28 19:51:30 得分 0
算了,结贴吧Top




