我用vc6.0编写了一个DLL注入的程序,即将我在c盘下的DLL注入到ie进程中去。步骤是:
1、创建一个无窗口的ie进程作为目标进程
2、将要注入的DLL的路径写入目标进程地址空间
3、获取LoadLibrary的地址
4、创建远程线程
现在的情况是编译、连接、执行都没有问题,执行的结果也是正确的。问题就是换一个分区或者换一台电脑就不能运行。比如我建的工程是在e:\study\Inject目录下,我的程序就只能在e盘下运行,换到c盘或者d盘就不能运行了(双击之后没任何反应),放到我同学电脑上也不行。我想了几天也没想出来怎么回事,这个太诡异了。。。不知道有没有谁遇到过这样的问题?
所有源代码如下:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
// 创建一个无窗口的IE进程作为目标进程
STARTUPINFO si = { sizeof(si) }; // 初始化结构
PROCESS_INFORMATION pi; // 进程信息结构,由系统填充
si.cb = sizeof(STARTUPINFO); // si.cb为si的大小
si.wShowWindow = SW_HIDE; // 创建一个没有窗口的IE进程
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; // 设置si使用哪些标志位
TCHAR szCommandLine[] = TEXT
("C:\\Program Files\\Internet Explorer\\iexplore.exe"); // 指定要创建进程的主程序
BOOL bRet = CreateProcess(NULL,szCommandLine,NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi); // 创建进程
if(!bRet)
{
MessageBox(NULL,"创建进程失败!",NULL,MB_OK);
return -1;
}
CloseHandle(pi.hThread);
HANDLE hProcess = pi.hProcess; // 保存进程句柄
// 将DLL路径字符串写入目标进程地址空间
PTSTR pszLibFile = TEXT("C:\\MyDll.dll"); // DLL的完整路径
int cch = 1 + strlen(pszLibFile); // DLL路径的字符数
int cb = cch * sizeof(TCHAR); // DLL路径的字节数
PTCHAR pszLibFileRemote = (PTCHAR)
VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE); // 在目标进程地址空间分配内存
WriteProcessMemory(hProcess,
pszLibFileRemote,(PVOID)pszLibFile,cb,NULL); // 将DLL路径写入目标进程
// 获取LoadLibrary的地址
PTHREAD_START_ROUTINE pfnStartAddr;
pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress
(GetModuleHandle("Kernel32"),"LoadLibraryA");
// 创建远程线程
CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL);
CloseHandle(hProcess);
return 0;
}
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法