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

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,习进阶更高效! 阅读详情

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

修改工作区的目录

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

一次VS2010代码过程(五)           剧情应该结束了,还要什么………………想想那个找不到hProcess还没有解决,于是我在家里用WIN10来用两种方式运行代码,都能够显示注入窗口,那问题应该还是出现在XP系统,或是XP系统的VS2010设置上,我就想既然VS2010对XP系统的兼容不是很好,那VC6++是完全32位系统的编译器,应该没有问题吧,况且视频的作者也说VC6VC7等等都可以,只是大同小异,那我还是用... 阅读详情

相关推荐

Win32习笔——安装VS2010,下载配套源代码

习Win32编程,我们需要一款编译器。美国Windows编程大佬查尔斯·佩措尔德先生在他的《Windows程序设计第五版》中,采用的开发软件,是Visual C++ 6.0 软件。而在我们这里,我不打算采用Visual C++ 6.0。原因就是,这个软件,它太旧了。在Win7,Win10里面,Visual C++ 6.0 软件都存在着兼容性的问题,所以呢,我不考虑这个软件了。

jingxian1992的博客 1471

使用CreateRemoteThread把代码远程注入指定exe执行

效果图示如下: 做的这个例子首先是创建了一个MFC 对话框程序,然后自己创建了一个 带有导出函数 (简单的减法) 的DLL , 这个Calc按键就是调用自己DLL里面的减法函数 计算1 - 1, 其次创建一个拥有能够修改进程中某函数的入口代码功能的DLL(为什么是DLL,网上有大量详细的资料,), 然后我们还创建一个windows控制台程序 也就是 调用CreateRemoteThread  让...

technologyleader的专栏 997

VS2010简介

今天参加微软组织的VS2010 Launch Event Train-The-Trainer Traning,Brian A. Randell同讲的眉飞色舞、demo的激情澎湃,我却听的懵懵懂懂:( 听听课,才发现自己的知识落伍太多了。还没研究过WPF到底是怎么回事儿,现在Silverlight已经大行其道。没做过Web方面的开发,现在Cloud又火得不行。SharePoint & Of

Thinking in ... 2万+

一次VS2010代码过程(二)

接上集,编译没有错误那就运行了,满怀激动的心情点了菜单下面的绿色小角图标然后期待的画面>>>>>>这是什么鬼,怎么会酱紫,注入的计算器就崩溃了,反复的一行行的对照代码,没有错了,除了注释不一样,是哪里出错了么,还是哪个步骤错了,删除所建的文件夹,再按视频一步一步来,故障仍旧,找不出问题所在,继续删除文件夹再来一次,不行,我就想,是不是XP系统的问题,把文件打包...

hsoftk的博客 286

一次VS2010代码过程(一)

前几天看到XX老师编的编Win32控制台程序 注入带窗口的DLL,的教程,闲来无事,也跟着视频教程自己动手个,主要是代码简短,比起以往看的一些视频,代码都比较繁琐,好多都不懂,也懂得去找资料去一探究竟,本来新手一个,视频中用的VS2010.本人机器里XP只有很久之前留的一个VC6++;本以为都 一样,教程里也说装一个VC6,VC7,VC8,VC9,VC2010,VC2012,VC2013都...

hsoftk的博客 299

VS2005的静态库到VS2010出错的处理

今天装了vs2010, 了一个test,调用了以前用vs2005的一个调试用的日志类,链接死活过不了,又是库冲突 ,又是无法解析外部符号。用错误内容及vs2005与vs2010搜了半天都没找到解决办法。后来找到说是string在旧版编译器中编译的结果在新版本里有区别,于是把库拿到vs2010重新编译,再拿到项目中,终于是通过了。       贴出错误:      1> AMobileDe

4573

VS2010下编译Python程序

最近因为想要习有关机器习的相关东西,发现《机器习实战》这本书不错,但是代码用的是Python,因为Python有强大的数值计算库,还能够包含opencv,真是牛气,幸亏之前实习时用过,上手还算容易。感谢微软对Python的兼容啊,对于用惯了VS的人来说真是太好了。 安装步骤: 1:下载VS2010,并安装(上网搜一下注册码吧,忘了当时在哪里找的了)。 2:下载最新版本的Python,我

hdhfighting的专栏 1万+

VS 2010 打开 VS 2019 创建的程序项目文件

前言 最近运行Windows 8.1 有些卡,想用一下 Windows XP(毕竟用Windows 8.1也不安装更新的),应该会流畅很多,但大家都知道Windows XP最多可以安装VS 2010VS 2013以上是安装不了的,可之前代码呢?是用VS 2017创建的,在偶然间看到了这篇文章,于是实践一下,录一下。 开始尝试 既然是尝试,就肯定不会把Windows XP安装到实机上的,于是安装虚拟机(只分配了512MB的内存,居然运行的非常流畅),上面安装VS 2010过程就不用讲了) 接着打开

gfdgd xi 1万+

VS2010的MFC对话框程序中添加菜单栏的过程

VS2010的MFC对话框程序中添加菜单栏的过程最近在看一个用MFC的界面的项目的代码,在代码和界面中一直没有看到关于菜单控件是如何添加进对话框的,于是就百度了下。结果,与其它控件(Button等)添加的方式不一样; VS2010的MFC对话框程序中添加菜单栏的过程大致分了这五步。一、将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在左边目录的任意位置上

wojiushimogui的博客 1万+

VS2010中安装MSDN

1.帮助中找“管理帮助设置” 2.第一次装msdn时让选择安装地点,要选个大点的盘安装,进入如下界面,选择从磁盘安装内容 3.选择msdn的位置,我的vs2010默认安装的f盘中,然后选择VS2010安装光盘下的ProductDocumentation\HelpContentSetup.msha文件,如果没有找的上述文件,可到下面云盘下载http://yunpa

Wang Bei的博客 6728

【Error】安装VS2012后VS2010工程失败

安装VS2012后遇到的问题 悲剧的种子是在上个月初种下的。。。9月份微软发布了Visual Studio2012(发布会),我是个对各种“新版本”极有偏好的人,一看到新闻就立刻下载了VS2012 Pro版,花了几个小时安在原本装有VS08,VS10版本的电脑上。装下来之后体验还是挺不错的,启动速度感觉比10快了许多,而且代码的智能提示也很给力,不需要Visual Assist 之类的插件就能高

小魏的修行路 2万+

VS2010编译调试STL源代码

平台环境:windows 7 32位+VS2010+STL源代码

KangRoger的专栏 6571

vs2010+OpenCV一次性配置和永久配置

OpenCV有着强大的图像处理能力,最近想要习以下OpenCV的使用,然后录以下OpenCV库在vs2010中的配置方法,有两种配置,一种配置之后,所有的库文件只能在当前项目中使用,一旦新建项目之后就要重新配置,还有一种方法可以永久配置,一次配置后,在所有的项目中都可以生效。 顺带附加一个OpenCV的文件包链接:https://pan.baidu.com/s/1G8wubEcfSwNnfXu...

weixin_43940770的博客 799

VS2010 经常崩溃的一次解决办法

VS2010 经常崩溃的一次解决办法       今天在w

TRTK 6148

VS2010 路径一次性配置的方法

VS2005、VS2008路径配置都是配置一次后下次新建工程不再需要重新配置。但是VS2010开始支持独立工程方案,每次都需要重新配置,后来找到了一次性配置的方法。 这里以opencv的为例讲解配置方法   大家在使用opencv的时候肯定会面对这样一个问题:根据官网以及大多数教程提供的方法中,似乎每一次新建一个opencv的新项目以后都需要重新再配置“VC++目录”中的“包含目录”和“

junpengxue的专栏 1643

图解VS2010打包全过程

最近刚刚打包发布了用VS2010开发的一个收费系统,借此讲一讲打包过程,供大家参考。 首先打开已经完成的工程,如图: 下面开始制作安装程序包。 第一步:[文件]——[新建]——[项目]——安装项目。 名称——可以自己根据要求修改。 位置——是指你要制作的安装文件存放在什么目录内,可以根据需要修改,笔者一般是把它放在本工程的同一个目录内。

一名系统架构师的征途 1万+

LibUSB-Win32 在Windows7上使用vs2010编译过程

LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP、Vista、Win7等)上的通用USB设备驱动程序,该驱动程序允许使用者在不任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备,本文描述如何利用VS2010在win7上编译libUSB-Win32。

机器学习与神经网络 1万+
上一篇: 记一次VS2010学写代码过程(二)
下一篇: 记一次VS2010学写代码过程(四)
hsoftk
博客等级 码龄11年 18粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值