大学时候因为主修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++&C#外挂(内存修改)的更多相关文章

  1. (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍

    Heat Engine是一款内存修改编辑工具,Cheat Engine允许你修改你的游戏,所以你将总是赢.它包括16进制编辑,反汇编程序,内存查找工具.与同类修改工具相比,它具有强大的反汇编功能,且自 ...

  2. UWP游戏防内存修改器的方法

    最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...

  3. ce游戏内存修改器(Cheat Engine)

    ce修改器(Cheat Engine)一款专门修改内存修改编辑的游戏工具它包括16进制编辑,反汇编程序,内存查找工具新版6.1 版的CE与6.0 最大的区别就是添加了修改器制作工具,比之前 5.6.1 ...

  4. oracle11g rac asm 实例内存修改

    ASM实例内存修改 memory_max_target(它为静态参数,修改完成后需要重启实例) memory_target(它为动态参数,不需要重启实例) SQL> select name,is ...

  5. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器

    声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http ...

  6. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  7. [20180604]在内存修改数据(bbed).txt

    [20180604]在内存修改数据(bbed).txt --//以前曾经做过在内存修改数据,通过oradebug poke命令修改内存信息,相关链接:--//http://blog.itpub.net ...

  8. Tomcat 安全设置 及 内存修改

    1.删除%tomcatRoot%/webapps目录下的examples.docs文件夹 2.修改%tomcatRoot%/conf/tomcat-users.xml <?xml version ...

  9. Tomcat 启动内存修改

    内存修改文件 Windows 文件 /bin/catalina.bat Linux 文件 /bin/catalina.sh 方法一 # 设置参数 JAVA_OPTS='-Xms[初始化内存大小] -X ...

随机推荐

  1. Hive 复制分区表和数据

    1. 非分区表: 复制表结构: create table new_table as select * from exists_table where 1=0; 复制表结构和数据: create tab ...

  2. mysql中join后on、where的区别

    SELECT * FROM A; SELECT * FROM B; 以上是两张表的机构 SELECT * FROM A LEFT JOIN B ON A.id=b.a_id ; ; ; 两个语句查询出 ...

  3. mysql数据库----索引原理与慢查询优化

    一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语 ...

  4. 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)

      本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间 ...

  5. 各种语言中的可变参数(java、python、c++、javascript)

    索引: java python c++ js 1.Java public class Animal { // 接受可变参数的方法 void eat(String... Objects) { for ( ...

  6. Observer模式实践

    Observer 模式在实践中的应用场景: 为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程.将更改过程打印在控制台上.考虑使用松耦合设计. 代码: # ...

  7. kubernetes 一些基本的概念

    k8s 原理 kubernetes API server 作为集群的核心,负责集群各功能之间的通信, 集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据的时候 通 ...

  8. jQuery 源码分析:当 selector 传来一个函数时,怎么进行处理?

    本文章为 0.9 版本,将会在稍后润色更新.本文使用的 jQuery 版本为 3.4.0 我们知道使用 $ 操作符时,可以往里面塞很多类型的参数,字符串,对象,函数...,jQuery 会根据不同的参 ...

  9. JavaScript常用操作,常用类

    算术运算符 重点关注 算数,赋值,逻辑运算符,三目运算符 <!DOCTYPE html> <html> <head> <meta charset=" ...

  10. ubuntu下git clone 提速

    环境:ubuntu16.04 方法:通过socks5代理并且使用http链接 步骤: 1.设置全局使用socks5代理,并且使用http传输 git config --global http.prox ...