就酱紫懵圈三两天,之间也碰到些小插曲,比如在查找资料的时候用关键字搜vc6 dll注入只找到一个CSDN的链接,为了能下下来,因为要积分才能下软件,找了好些工具,打回了自己CSDN的帐号,以为里面有积分,记得以前注册的时候用软件刷过一些积分,哪知道找回后帐号内积分为0,又求助了52PJ论坛坛友,还好,坛友比较热心,没多入就给我发了链接让我去下,我还以为能够解决这几天的困惑,谁知道那个软件和我抄来代码的不一样,那个就是一个EXE注入想要的DLL,而我抄来的代码是编一个DLL然后用控制台注入,虽然不是我想要的,但是留着以后备用。继续查,竟然又在一个论坛中找到完整的代码,于是我把MFC_DLL的代码又COPY到我编译器中,还是两种方式,一种阻塞,一种新建函数,情况还是仍旧,这我是实在找不到解决办法了,本来就酱紫放弃了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这不是分界线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
又酱紫懵圈一两天,脑袋里全是想找到解决之道,却又不知道从何下手,这天闲来无事,先注入阻塞的代码,照旧卡住了,然后注入DoModal移动上面函数中的代码,发生了什么鬼?这次竟然能够注入成功了,程序没有崩溃,注入的窗口可以移动,计算器也能够自由运用,我敢发誓我没有修任何代码,这TMD发生了什么事情,反复注入,有一两次不会出现注入窗口,但程序不会注入出错面崩溃。竟然还有代码运行出错,过几天自己好了的这种神级操作,注入的问题终于是解决了,那再写入注入代码来代替注入软件吧,为了保险起见,我把刚才那个注入没问题的代码备份一个,发到自己邮箱里,发两份,这应该够 了吧,然后在编译器的MFC_DLL上
然后
在InjectDll.cpp添加COPY的代码
// InjectDll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include<iostream>
using namespace std;
#define GameClassName "计算器"//定义窗口类名
#define DllFullpath "D:\\我的文档\\Visual Studio 2010\\Projects\\MFC_DLL1\\Debug\\MFC_DLL.dll"
void InjectDLL()
{
DWORD pid = 0;
DWORD byWriteSize;
HANDLE hProcess = NULL;
LPDWORD AddressDW = NULL;
HANDLE threadHandle = NULL;//存放写入线程的句柄
//查找窗口句柄
HWND Gameh = FindWindow(NULL,GameClassName);//通过查找进程句柄,第一个参数类名,第二个参数标题名
if (Gameh != 0)
{
printf("进程句柄 =%d\n",Gameh);
cout<<"进程句柄 ="<<Gameh<<endl;
//获得线程句柄
GetWindowThreadProcessId(Gameh,&pid);//获得线程句柄
if (pid != 0)
{
printf("进程PID =%d\n",pid);
cout<<"进程PID ="<<pid<<endl;
//打开线程(权限,子进程继承,进程句柄)
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if (hProcess != 0)
{
printf("进程hProcess =%d\n",hProcess);
cout<<"进程hProcess ="<<hProcess<<endl;
//在游戏线程分配一段空间
//访问权限(线程句柄,分配起始地址,写入字节,内存标志,页面属性)
AddressDW = (LPDWORD)VirtualAllocEx(hProcess,NULL,256,MEM_COMMIT,PAGE_READWRITE);
if (AddressDW != NULL)
{
printf("进程AddressDW =%d\n",AddressDW);
cout<<"进程AddressDW ="<<AddressDW<<endl;
//写入内存(线程,起始地址,缓冲区,字节长度,具体写入字节)
WriteProcessMemory(hProcess,AddressDW,DllFullpath,strlen(DllFullpath)+1,&byWriteSize);
if (byWriteSize >= strlen(DllFullpath))
{
threadHandle = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibrary,AddressDW,NULL,NULL);
//创建远线程(线程句柄,安全属性,初始大小,该线程函数起始地址,参数(路径),标志,返回值)
WaitForSingleObject(threadHandle,0xffffffff);//等待注入DLL的线程挺无再进行下一步
CloseHandle(threadHandle);//关闭写入线程句柄
VirtualFreeEx(hProcess,AddressDW,256,MEM_DECOMMIT);//释放远程地址空间
CloseHandle(hProcess);//关闭打开线程
}else
{
printf ("与入DLL路径失败\r\n");
}
}else
{
printf("未找到AddressDW");
}
}else
{
printf("未找到hProcess");
}
}else
{
printf("未找到pid");
}
}else
{
printf("未找到Gameh");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//添加注入DLL代码
printf("注入DLL\r\n");//输入一段打印信息,作为测试
InjectDLL();//调用InjectDll函数
getchar();//防止控制台窗口一闪而过,只到输入回车,窗口才会结束
return 0;
}
刚写代码的时候 main函数里的 InjectDLL();没有添加,然后加入这行,又改掉几个大小写错误,少大小括号之类的低级错误后,终于期待已入的界面出现了,至于注入的窗口不是默认的窗口,是因为之间又发生了小插曲,插曲还真多,就是注入成功后,我想改注入窗口的内容,比较添加几个按扭,加个编辑框之内,加好后,编译运行,发现窗口还是默认的只有确定和取消两个按扭的窗口,我新加的资源不见了,又捣鼓了一阵了,才出现我想要的结果,所以窗口是酱紫了,小插出,让它过了就行了。于是跟着视频内容再进一步改进自己获取DLL文件的路径,InjectDll.cpp代码修改为
// InjectDll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include<iostream>
using namespace std;
#define GameClassName "计算器"//定义窗口类名
#define DllName "MFC_DLL.dll"
//#define DllFullpath "D:\\我的文档\\Visual Studio 2010\\Projects\\MFC_DLL\\Debug\\MFC_DLL.dll"
void InjectDLL(HWND Gameh,const char* DllFullpath)
{
DWORD pid = 0;
DWORD byWriteSize;
HANDLE hProcess = NULL;
LPDWORD AddressDW = NULL;
HANDLE threadHandle = NULL;//存放写入线程的句柄
//查找窗口句柄
if (Gameh != 0)
{
printf("进程句柄 =%d\n",Gameh);
cout<<"进程句柄 ="<<Gameh<<endl;
//获得线程句柄
GetWindowThreadProcessId(Gameh,&pid);//获得线程句柄
if (pid != 0)
{
printf("进程PID =%d\n",pid);
cout<<"进程PID ="<<pid<<endl;
//打开线程(权限,子进程继承,进程句柄)
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if (hProcess != 0)
{
printf("进程hProcess =%d\n",hProcess);
cout<<"进程hProcess ="<<hProcess<<endl;
//在游戏线程分配一段空间
//访问权限(线程句柄,分配起始地址,写入字节,内存标志,页面属性)
AddressDW = (LPDWORD)VirtualAllocEx(hProcess,NULL,256,MEM_COMMIT,PAGE_READWRITE);
if (AddressDW != NULL)
{
printf("进程AddressDW =%d\n",AddressDW);
cout<<"进程AddressDW ="<<AddressDW<<endl;
//写入内存(线程,起始地址,缓冲区,字节长度,具体写入字节)
WriteProcessMemory(hProcess,AddressDW,DllFullpath,strlen(DllFullpath)+1,&byWriteSize);
if (byWriteSize >= strlen(DllFullpath))
{
threadHandle = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibrary,AddressDW,NULL,NULL);
//创建远线程(线程句柄,安全属性,初始大小,该线程函数起始地址,参数(路径),标志,返回值)
WaitForSingleObject(threadHandle,0xffffffff);//等待注入DLL的线程挺无再进行下一步
CloseHandle(threadHandle);//关闭写入线程句柄
VirtualFreeEx(hProcess,AddressDW,256,MEM_DECOMMIT);//释放远程地址空间
CloseHandle(hProcess);//关闭打开线程
}else
{
printf ("与入DLL路径失败\r\n");
}
}else
{
printf("未找到AddressDW");
}
}else
{
printf("未找到hProcess");
}
}else
{
printf("未找到pid");
}
}else
{
printf("未找到Gameh");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char DirName[256] = "";
char DllNamePath[256] = ";";
HWND Gameh = FindWindow(NULL,GameClassName);//通过查找进程句柄,第一个参数类名,第二个参数标题名
GetCurrentDirectoryA(sizeof(DirName),DirName);
strcpy_s(DllNamePath,DirName);
strcat_s(DllNamePath,"\\");
strcat_s(DllNamePath,DllName);
printf("%s \r\n",DirName);
printf("%s \r\n",DllNamePath);
//添加注入DLL代码
printf("注入DLL\r\n");//输入一段打印信息,作为测试
InjectDLL(Gameh,DllNamePath);//调用InjectDll函数
getchar();//防止控制台窗口一闪而过,只到输入回车,窗口才会结束
return 0;
}
修改工作区的目录
嗯,然后,不错,注入的窗口如期而至。======未完待续======