C++&C#外挂(内存修改)
大学时候因为主修C#语言(当然现在做的是javaweb开发),那时在网上学了用C#做外挂的教程,外挂嘛,大家都懂的.这里只是低级的修改内存,不涉及到截获数据包.如果是欺骗服务器,修改服务器数据,那就难的多了.这里给出两个修改内存代码的例子,一个是C#的一个是C++的.C#做东西比较简单,但是运行需要.net环境.C++编译出来的exe执行文件就没有这多要求.查找基质和偏移量的方法大都是用CE,网上教程很多.这里只有简单的代码给大家参考
首先看看C#的,我封装了一个ECHelper.cs工具类,代码如下
//打开进程获取句柄
[DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
public static extern IntPtr OpenProcess(int desiredAccess, bool heritHandle, int pocessID);//访问权限(16进制),是否继承句柄,进程ID
//关闭句柄
[DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
public static extern void CloseHandle(IntPtr hObject);
//读取内存
[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr baseadress, IntPtr buffer, int nsize, IntPtr bytesread);
//写入内存
[DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr baseadress, long[] buffer, int nSize, IntPtr byteswrite); //根据进程名获得PID
public static int GetPIDByProcessName(string name)
{
Process[] pros = Process.GetProcessesByName(name);
if (pros.Count() > )
{
return pros[].Id;
}
else
{
return ;
} }
public static int ReadMemoryValue(string name, IntPtr baseadress)
{
try
{
byte[] buffer = new byte[];
IntPtr bufferadress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, );
IntPtr hprocess = OpenProcess(0x1F0FFF, false, ECHelper.GetPIDByProcessName(name));
ReadProcessMemory(hprocess, baseadress, bufferadress, , IntPtr.Zero);
CloseHandle(hprocess);
return Marshal.ReadInt32(bufferadress);
}
catch
{
return ;
}
}
public static void WriteMemoryValue(string name, IntPtr baseadress, long value)
{
IntPtr hprocess = OpenProcess(0x1F0FFF, false, ECHelper.GetPIDByProcessName(name));
WriteProcessMemory(hprocess, baseadress, new long [] { value }, , IntPtr.Zero);
CloseHandle(hprocess);
}
调用方法如下
string name = "cstrike";
int baseadress = 0x025069BC;
private void btnShoot_Click(object sender, EventArgs e)
{
timShoot.Start();
} private void timShoot_Tick(object sender, EventArgs e)
{
timShoot.Interval = ;
int adress1 = ECHelper.ReadMemoryValue(name, (IntPtr)baseadress);
adress1 = adress1 + 0x7C;
int adress2 = ECHelper.ReadMemoryValue(name, (IntPtr)adress1);
adress2 = adress2 + 0x5EC;
int adress3 = ECHelper.ReadMemoryValue(name, (IntPtr)adress2);
adress3 = adress3 + 0xCC;
ECHelper.WriteMemoryValue(name, (IntPtr)adress3, 0x64); //cs子弹无线
}
这里是C#源码
下面看C++语言的
DWORD getLastError;
//1.根据窗口名获取窗口
HWND hWinmine = FindWindow(NULL,"Counter-Strike");
DWORD dwPID = ; //窗口进程标示
//2.根据窗口获取pid
GetWindowThreadProcessId(hWinmine, &dwPID);
if (dwPID == )
{
printf("获取PID失败\n");
return -;
}
//3.根据pid获取进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);
if (hProcess == NULL)
{
printf("进程打开失败\n");
getLastError = GetLastError();
return -;
} DWORD dwNum = , dwSize = ; //基址
DWORD CSBaseAddress = 0x025069BC;
//基址值
DWORD CSBaseAddressValue = ;
if ( == ReadProcessMemory(hProcess, (LPVOID)CSBaseAddress, &CSBaseAddressValue, sizeof(DWORD), &dwSize))
{
printf("静态址获取失败\n");
getLastError = GetLastError();
return -;
} //一级偏移
DWORD CSOffsetFirst = 0x7C;
//一级偏移值
DWORD CSOffsetFirstValue = ;
if ( == ReadProcessMemory(hProcess, (LPVOID)(CSBaseAddressValue + CSOffsetFirst), &CSOffsetFirstValue, sizeof(DWORD), &dwSize))
{
printf("一级偏移获取失败\n");
getLastError = GetLastError();
return -;
} //二级偏移
DWORD CSOffsetSecond = 0x5EC;
//二级偏移值
DWORD CSOffsetSecondValue = ;
if ( == ReadProcessMemory(hProcess, (LPVOID)(CSOffsetFirstValue + CSOffsetSecond), &CSOffsetSecondValue, sizeof(DWORD), &dwSize))
{
printf("二级偏移获取失败\n");
getLastError = GetLastError();
return -;
} //三级偏移
DWORD CSOffsetThird = 0xCC;
DWORD CSNum=; //这里是当前子弹值
if ( == ReadProcessMemory(hProcess, (LPVOID)(CSOffsetSecondValue + CSOffsetThird), &CSNum, sizeof(DWORD), &dwSize))
{
printf("三级偏移获取失败\n");
getLastError = GetLastError();
return -;
} int modifyCS;
printf("CSNum:%d\n", CSNum);
printf("输入你要修改后的值:");
scanf("%d", &modifyCS);
//更改值
WriteProcessMemory(hProcess, (LPVOID)(CSOffsetSecondValue + CSOffsetThird), &modifyCS, sizeof(DWORD), &dwSize); CloseHandle(hProcess); //关闭进程
system("pause"); //窗口停留
C++&C#外挂(内存修改)的更多相关文章
- (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍
Heat Engine是一款内存修改编辑工具,Cheat Engine允许你修改你的游戏,所以你将总是赢.它包括16进制编辑,反汇编程序,内存查找工具.与同类修改工具相比,它具有强大的反汇编功能,且自 ...
- UWP游戏防内存修改器的方法
最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...
- ce游戏内存修改器(Cheat Engine)
ce修改器(Cheat Engine)一款专门修改内存修改编辑的游戏工具它包括16进制编辑,反汇编程序,内存查找工具新版6.1 版的CE与6.0 最大的区别就是添加了修改器制作工具,比之前 5.6.1 ...
- oracle11g rac asm 实例内存修改
ASM实例内存修改 memory_max_target(它为静态参数,修改完成后需要重启实例) memory_target(它为动态参数,不需要重启实例) SQL> select name,is ...
- 只需要一点点C++基础,新手也可以制作单机游戏内存修改器
声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http ...
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...
- [20180604]在内存修改数据(bbed).txt
[20180604]在内存修改数据(bbed).txt --//以前曾经做过在内存修改数据,通过oradebug poke命令修改内存信息,相关链接:--//http://blog.itpub.net ...
- Tomcat 安全设置 及 内存修改
1.删除%tomcatRoot%/webapps目录下的examples.docs文件夹 2.修改%tomcatRoot%/conf/tomcat-users.xml <?xml version ...
- Tomcat 启动内存修改
内存修改文件 Windows 文件 /bin/catalina.bat Linux 文件 /bin/catalina.sh 方法一 # 设置参数 JAVA_OPTS='-Xms[初始化内存大小] -X ...
随机推荐
- 【Python】【Flask】前端调用后端方法
后端代码: @app.route("/test",methods=['POST','GET']) def test(): return "我是测试的" 前端代码 ...
- Python Web学习笔记之递归和迭代的区别
电影故事例证:迭代——<明日边缘>递归——<盗梦空间> 迭代是更新变量的旧值.递归是在函数内部调用自身. 迭代是将输出做为输入,再次进行处理.比如将摄像头对着显示器:比如镜子对 ...
- Mysql优化_内置profiling性能分析工具
如果要进行SQL的调优优化和排查,第一步是先让故障重现,但是这个并不是这一分钟有问题,下一秒就OK.一般的企业一般是DBA数据库工程师从监控里找到问题.DBA会告诉我们让我们来排查问题,那么可能很多种 ...
- xdebug安装方法
打开网址:https://xdebug.org/wizard.php 把phpinfo页面中输出的所有内容复制过来,粘贴在此处点下面那个按钮,系统会分析出你需要下载哪个版本的x-debug,还会告诉你 ...
- vijos 1096 津津的储存计划
题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...
- poj 2773 Happy 2006 - 二分答案 - 容斥原理
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11161 Accepted: 3893 Description Two ...
- 使用Oracle执行计划分析SQL性能
执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述.即就是对一个查询任务,做出一份怎样去完成任务的详细方案. 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的 ...
- 51nod 1242 斐波那契数列的第N项
之前一直没敢做矩阵一类的题目 其实还好吧 推荐看一下 : http://www.cnblogs.com/SYCstudio/p/7211050.html 但是后面的斐波那契 推导不是很懂 前面讲的挺 ...
- Linux mysql 添加远程连接
方法/步骤 第一步 远程连接上Linux系统,确保Linux系统已经安装上了MySQL数据库.登陆数据库. mysql -u$user -p $pwd 第二步 创建用户用来远程连接 GRANT ALL ...
- BZOJ 2339 【HNOI2011】 卡农
题目链接:卡农 听说这道题是经典题? 首先明确一下题意(我在这里纠结了好久):有\(n\)个数,要求你选出\(m\)个不同的子集,使得每个数都出现了偶数次.无先后顺序. 这道题就是一道数学题.显然我们 ...