记一次VS2010学写代码过程(三)

        就酱紫懵圈三两天,之间也碰到些小插曲,比如在查找资料的时候用关键字搜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;
}

修改工作区的目录

嗯,然后,不错,注入的窗口如期而至。======未完待续======

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值