大学时候因为主修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);//根据进程名获得PIDpublic static int GetPIDByProcessName(string name){Process[] pros = Process.GetProcessesByName(name);if (pros.Count() > 0){return pros[0].Id;}else{return 0;}}public static int ReadMemoryValue(string name, IntPtr baseadress){try{byte[] buffer = new byte[4];IntPtr bufferadress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);IntPtr hprocess = OpenProcess(0x1F0FFF, false, ECHelper.GetPIDByProcessName(name));ReadProcessMemory(hprocess, baseadress, bufferadress, 4, IntPtr.Zero);CloseHandle(hprocess);return Marshal.ReadInt32(bufferadress);}catch{return 0;}}public static void WriteMemoryValue(string name, IntPtr baseadress, long value){IntPtr hprocess = OpenProcess(0x1F0FFF, false, ECHelper.GetPIDByProcessName(name));WriteProcessMemory(hprocess, baseadress, new long [] { value }, 4, 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 = 300;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 = 0;  //窗口进程标示//2.根据窗口获取pid GetWindowThreadProcessId(hWinmine, &dwPID);  if (dwPID == 0)  {  printf("获取PID失败\n");  return -1;  }  //3.根据pid获取进程HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);  if (hProcess == NULL) {  printf("进程打开失败\n");  getLastError = GetLastError();  return -1;  }  DWORD dwNum = 0, dwSize = 0;  //基址  DWORD CSBaseAddress = 0x025069BC;  //基址值  DWORD CSBaseAddressValue = 0;  if (0 == ReadProcessMemory(hProcess, (LPVOID)CSBaseAddress, &CSBaseAddressValue, sizeof(DWORD), &dwSize))  {  printf("静态址获取失败\n");  getLastError = GetLastError();  return -1;  }  //一级偏移  DWORD CSOffsetFirst = 0x7C;  //一级偏移值  DWORD CSOffsetFirstValue = 0;  if (0 == ReadProcessMemory(hProcess, (LPVOID)(CSBaseAddressValue + CSOffsetFirst), &CSOffsetFirstValue, sizeof(DWORD), &dwSize))  {  printf("一级偏移获取失败\n");  getLastError = GetLastError();  return -1;  }  //二级偏移  DWORD CSOffsetSecond =  0x5EC;  //二级偏移值  DWORD CSOffsetSecondValue = 0;  if (0 == ReadProcessMemory(hProcess, (LPVOID)(CSOffsetFirstValue + CSOffsetSecond), &CSOffsetSecondValue, sizeof(DWORD), &dwSize))  {  printf("二级偏移获取失败\n");  getLastError = GetLastError();  return -1;  }//三级偏移  DWORD CSOffsetThird = 0xCC;  DWORD CSNum=0;  //这里是当前子弹值if (0 == ReadProcessMemory(hProcess, (LPVOID)(CSOffsetSecondValue + CSOffsetThird), &CSNum, sizeof(DWORD), &dwSize))  {  printf("三级偏移获取失败\n");  getLastError = GetLastError();  return -1;  }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++源码

转载于:https://www.cnblogs.com/aeolian/p/7789216.html

C++C#外挂(内存修改)相关推荐

  1. 使用java来写一个游戏外挂-内存修改程序(辅助-开篇)

    很久以前研究过如何使用java写一个内存读写的程序,但是java都是知道的 它是在虚拟机上进行运行的,所以没办法进行内存的读写 所以用到了jan来执行windows自带的 kernel32.dll程序 ...

  2. 揭秘手游外挂:基于内存蜜罐的内存修改挂分析技术

    经过近几年游戏市场的变迁,手游市场也在飞速发展.同时手游本身的安全风险也逐渐暴露出来.无恒实验室也在承担着手游安全评审的相关工作,上期我们分享了游戏安全评审的技术进阶历程.2020年市场上重度手游的不 ...

  3. 给初学者:用VB写外挂 ———— 实战六:幽城幻剑录-幽城幻劍錄内存修改器

    先起个头,有时间再写,今天病的,到现在也没睡着...本来写了好几天了,哎. 前几天下了这个游戏看了看,感觉还可以吧,发现有诸多存盘修改器.随时存档补丁.穿墙等补丁,很乱,玩家打上一个免CD还要打其他补 ...

  4. Java外挂开发之内存修改器(类似CE)

    最近闲着蛋疼,无聊之中用CE耍了一哈游戏,发现挺好用的,于是就想,我自己能不能写个内存修改器呢?于是乎,这个软件就诞生了! 当然我只会Java,C++嘛,了解了解,嘿嘿,所以这个工具也是用Java写的 ...

  5. 网络安全学习第15篇 - 游戏内存修改

    请依据实验文档<游戏辅助的实现>中的内容,自行编写一个游戏内存数据修改程序,使其可以对某款游戏的某一项或某几项数值进行修改.有余力的同学可以任选一款游戏尝试修改. 实验报告的最后请简述,作 ...

  6. 连连看外挂制作 —— 修改分数(1)

    标 题: 连连看外挂制作 -- 修改分数(1) 作 者: Koma 时 间: 2009-12-10 21:10 链 接: http://blog.csdn.net/wangningyu/archive ...

  7. iOS平台游戏安全再议之八门神器内存修改,IAP Free游戏内购破解的防御

     http://danqingdani.blog.163.com/blog/static/186094195201298103346566/ 今年3月初写过一篇<iO平台游戏安全小议> ...

  8. 内存修改器对游戏的危害

    内存修改器是游戏外挂里面的一个大类,通过修改器可实现很多魔幻且具有很大破坏性的功能. 下面几张图是使用修改器实现的游戏破解效果. 内存修改器实现的透视功能 内存修改器实现的遁地功能 修改器实现的飞天功 ...

  9. 【C 语言】指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

    文章目录 一.指针类型变量 与 指针指向的内存块 概念区别 1.指针赋值 2.指针运算 3.内存赋值 4.内存取值 5.内存修改注意事项 一.指针类型变量 与 指针指向的内存块 概念区别 指针类型变量 ...

最新文章

  1. 两个linux之间拷贝文件及文件夹
  2. VS2010中:error C2471: 无法更新程序数据库
  3. 关于域帐户将计算机加入域登陆上限问题
  4. STM32开启定时器就立即进Update中断问题探索
  5. 用Python盘点那些豆瓣评分低于3.0的奇葩电影
  6. css两列显示,div+css如何控制信息分两列显示?
  7. go语言 recover
  8. java ArrayList源码分析(转载)
  9. 一刷leetcode——树
  10. linux命令行下如何播放视频,linux播放视频命令
  11. 教你定时爬取微博热搜榜并做动态数据展示,让你不错过任何一个吃瓜热点
  12. 用proxifier、ccproxy、teamviewer做网络代理
  13. 一个牧场目前一共有20头刚出生的羊,母羊、公羊各一半。假如母羊5岁时后每年生一胎(母羊,公羊各一半)。羊活到10岁后死亡。请问20年后这个牧场有多少只羊? 请用C#写出算法。
  14. 母亲节是在每年五月份的第二个星期日,给定年份,求出当年母亲节的日期
  15. 一分钟了解“查看一台windows电脑是否成功安装了CUDA”
  16. “一刀切”严禁散煤,“煤改气”该如何走下去?
  17. objective-c delegate
  18. Spring Data MongoDB 多个条件或查询
  19. 单机模拟集群(三主两从)
  20. C++中构造函数的超详细讲解

热门文章

  1. Callable、Future和FutureTask
  2. 【转】老程序猿给新程序猿的13点建议
  3. 接力黄琨儿同志的《给玩命工作却对现状不满的IT人》
  4. 「译」有限状态机在 CSS 动画中的应用
  5. 第5章:可复用性的软件构建方法 5.2面向复用的构造
  6. 破解.net程序 编译和反编译方法
  7. SpringBoot笔记1-使用idea创建SpringBoot的hello world
  8. nagios自定义监控API插件
  9. 不使用加减乘除法,完成两个数的加法
  10. linux加入windows域之完美方案