ImageVerifierCode 换一换
格式:DOC , 页数:6 ,大小:49.50KB ,
资源ID:9285702      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-9285702.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c#做外挂 step by step(更新至step3注入).doc)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

c#做外挂 step by step(更新至step3注入).doc

1、c#做外挂 step by step(更新至 step3:注入)做外挂我也是现学的。可以说写的这个教程是现学现卖,希望对用 C#的外挂爱好者能有点帮助。 本教程中有一些以“ 废话 ”字样标注的内容,赶时间的可以直接越过。 第一课:C#使用 WINDOW API 和对内存的操作。 这一课是些简单的东西,了解的可以直接越过。考虑到大多数使用 c#的人都是做网站的,可能没有机会接触这些,所以我在这里做一下粗略的介绍。 step 1:认识 WINAPI windows 系统里提供了很多的函数,我们如果做外挂的话,就需要用到其中的函数( 以下简称 API)。 (废话:这些 API 被封装在系统路径下的

2、DLL 文件里。事实上,我们不用关心它在哪,我们只要知道怎么用就可以了,) 用起来很简单,格式如下: public partial class Form1 : Form DllImport(“kernel32.dll“) public static extern int ReadProcessMemory( | int hProcess, | int lpBaseAddress, | int lpBuffer, 代码段 1 int nSize, | int lpNumberOfBytesWritten | ); / . public Form1() InitializeComponent();

3、 ReadProcessMemory(processhandle,. 代码 2 . . 代码段 1 就是引用 api 的代码。我们引用的函数,是做外挂时最常用的函数,从它的名字就可以看的出来它的作用-读取进程内存。 (废话:从代码里,我们很容易看的出来,这个函数被封装在了 kernel32.dll 这个文件里。) 引用之后,我们就可以在自己的代码中使用这个函数了(如代码 2)。 (废话:WINDOWS 还提供很多的 API,如果你有兴趣了解的话,可以到网上搜 WINAPI 手册。想深入了解的话,可以看 MSDN。) step 2:读写内存 下面我来说一下,如何使用上一步引用的那个 API 读取

4、游戏的数据。先来看看参数: public static extern int ReadProcessMemory( int hProcess, /进程,如果你是做外挂的话,它代表你要挂的那个游戏。 int lpBaseAddress, /你要读取的内存地址 int lpBuffer, /从上面那个参数地址里读出来的东西 (调用这个函数的就是为了它 ) 不管这个参数是什么类型,它应该是一个数组,否则读不出东西来 int nSize, /长度,上一个参数,类型是 int,那个长度应该用 4 int lpNumberOfBytesWritten /用 0 就行了,想知道它是干嘛的,自己去 MSND

5、吧 关于第一个参数 hProcess 如何获取,我过会再说。假设它已经搞定了,那么这个函数,我们需要关心的只有 lpBaseAddress 和 lpBuffer,既读的地址,和读出来的值。 (废话:对了,这个函数貌似还有个返回值,我们这里用不到它。如果你有兴趣了解,MSDN) 读出来的值 out int lpBuffer 我们在引用 API 的时候声明为 int 型了,但是,我们要从内存里读的值不一定总是 int。我们可以多次引用这个 API,第 3 个参数分别用不同的类型。 下面,我们结合实际,来写一段读取诛仙人物 HP 的代码。首先,我们需要知道人物 HP的地址,( 废话:如何知道这个地址

6、,用 CE 还是 IE,你自己搞定吧。 ) 我是用 IE 在这里 http:/ 找到的,它这里是这样写的: 人物基址: int hp=new int1; ReadProcessMemory(process, 0x12F830, Base;, 4, 0);/相当于 Base=, 4, 0);/相当于 Base=Base+, 4, 0);/相当于 hp=base+ try ReadProcessMemory(process, add, r, 4, 0); return r0; catch (Exception ex) return -1; 这个函数很简单,不用我多说了吧。 有了这个函数,上面的读取

7、 HP 的代码,我们就可以写成这样了: int Base; int hp; Base=r(r(0x12F830)+0x28); /读出了人物基址 base hp=r(base+ /读出了 hp 看起来清晰多了吧。 下面我来说下读取字符串,首先引用 API: DllImport(“kernel32.dll“) public static extern int ReadProcessMemory( int hProcess, int lpBaseAddress, byte lpBuffer, int nSize, int lpNumberOfBytesRead ); 然后和上面一样,写一个读字符串

8、的方法。 public static string rString(IntPtr process, uint add) string r; string temp; byte b = new byte256; try API.ReadProcessMemory(process, (IntPtr)add, b, 256, (IntPtr)0); /读出的 byte要按 Unicode 编码为字符串 temp = System.Text.Encoding.Unicode.GetString(b); /截取第一段字符串 r = temp.Split(0); return r0; catch (Exc

9、eption ex) return “error“; 这个函数和上面那个函数差不多,多的东西注释里已经写了,也很简单,不必我废话了。 下面,我们来读人物的名字。还是刚才那个帖子里得到的,人物名字偏移如下: 人物角色名:base+3a4+0 代码如下: string name; name=rString(r(basse + 0x3a4)+0x0);/+0x0 可以去掉 读其他类型的数据和读 INT 的雷同,我就不废话了,大家自己搞定吧。 现在万事俱备,就差这个 process 了,下面我来说下,如果获得游戏的进程句柄 (废话:进程句柄:一个用来表示某进程的整形值。推广到一般, *句柄,就是表示某

10、*的整形值)。 分两步,第一步: System.Diagnostics.Process GamesProcess = System.Diagnostics.Process.GetProcessesByName(“elementclient“); 这一步用的是.NET 本身的方法,System.Diagnostics.Process 是.NET 里的进程类,GetProcessesByName 静态方法是通过进程的名字获得进程数组。这行语句执行之后,所有游戏进程就放在了 GamesProcess 里面。如果你想做多开挂的话,可以通过数组GamesProcess 的下标,来确定你要挂的游戏。 第二

11、步: int ProcessID=GamesProcess0.Id; int process = OpenProcess(0x1F0FFF, 0, ProcessID); 第 1 行是获得进程 ID,就是任务管理器里看到的 PID。第 2 行就是获得进程句柄。OpenProcess 也是一个系统 API,也是在 kernel32.dll 里。他的 3 个参数和返回值都声明为INT 就 OK 了。如何引用请看 step 1。大家应该可以看出来怎么用,第 3 个参数是进程ID,返回的就是进程句柄 (废话:1,2 参数做何用,想知道的自己看 MSDN。懒人直接用示例里的参数就行了。以后此类废话不再多

12、说了)。 看到这里,大家可以试着写一个读取人物资料的小东西试试了。当然,前提是你要知道资料的地址。 写内存: (废话:修改游戏数据,对于写现在的网游外挂来说,意义不是很大。因为重要数据的处理都是在服务端进行的,改了也没用。人们使用写内存,通常是改游戏的代码,以实现一些特殊功能,比如诛仙里的穿墙,无限跳等。要想知道如何改,需要反汇编分析经验。就不是本菜鸟能及的了,呵呵) WriteProcessMemory(process, (IntPtr)add, bytes, (UInt32)bytes.Length, 0); 写进程内存函数。这个 API 的各参数和 ReadProcessMemory 是

13、一一对应的。大家自己声明,用用看吧。喜欢的话,也可以向上面一样自己写个函数,以简化写内存的代码。在下一课,我们要用这个函数来向游戏里写代码。 下一课将是些更有趣的东西。我们要通过外挂让游戏执行一些操作。敬请期待吧,呵呵。 第 2 课 C#注入 这一课其实也很简单,只不过知道的人不多而已。 step 3:注入 注入没什么复杂的,它是一个很简单的过程。用语言描述就一句话:在别的程序里写入你的代码,并执行。 (废话:传说注入分 3 种,我说的这种属于哪个呢?我懒的去想,能用就行了,呵呵。) 实现起来也很简单,就几行代码: byte bytes=0xC3;/我们要写入的代码 int addr = Vi

14、rtualAllocEx(process, 0, bytes.Length, 0x1000, 0x40);/一,申请空间 WriteProcessMemory(process, addr, bytes, bytes.Length, 0);/二,把代码写进去 int hThread = CreateRemoteThread(process, 0, 0, addr, 0, 0, threadId);/三,执行写入的代码 WaitForSingleObject(hThread, 0xFFFFFFFF);/等待线程结束 VirtualFreeEx(process, addr, 0, 0x8000);

15、/四,释放申请的空间 CloseHandle(hThread);/五,关闭线程句饼 仔细看一下这几行代码,你会发现非常简单,几乎不需要我多说什么。这几个豆耐特里豆不出来的函数,都是 API。根据上面的使用方法,引用一下,就可以用了。你能看懂的那几个参数和返回值,就是需要你关心的。不知道的的参数都不用理会,直接用上面的值就行了。还有疑问的话,可以参考 WINAPI 手册。值得注意的地方是,第四步释放申请,如果你看了 API 手册,会发现第三个参数是大小,但如果你用 bytes.Length 的话就错了,一定要用 0。 (废话:如果你不知道怎么根据上面的使用方法引用 API,我就简单说两句。以第二

16、行为例,我们看到 VirtualAllocEx 的返回值和 5 个参数都是 int 行,那么这样声明就行: DllImport(“Kernel32.dll“)/没有特殊说明的话, API 一般都是从这个 DLL 引用的 public static extern int VirtualAllocEx( int p1, int p2, int p3, int p4, int p5 ); 大家可以看出来,要申明一个 API 只要知道各参数和返回值的类型,以及 DLL 文件名就可以了。喜欢的话,你可以把参数的名字起的有意义些。) 简简单单几行代码就实现了注入,是不是没你想像的复杂?呵呵。 现在的一个问

17、题就是,代码从何而来? 大家可以使用我的工具将你找到的 CALL 转换为机器码。 (废话:这个工具的原理,就是调用 MASM 编译,所以任何你在 MASM 里能使用的语法和指令(限函数内) ,都可以在这里用,当然,语法和 MASM 里的语法规则是一样的。使用的方法在附件里有详细的说明,我就不在这里浪费篇章了。) 工具转换得到的结果是型如 60b8d0305a00ffd08b561c83c40461c3 的字符串,大家可以用下面的方法把它转换为 byte public static byte getBytes(string HEX) byte bytes = new byteHEX.Length

18、 / 2; for (int i = 0; i bytes.Length; i+) bytes = Convert.ToByte(Int32.Parse(HEX.Substring(i * 2 , 2), System.Globalization.NumberStyles.AllowHexSpecifier); return bytes; OK,到这里,大家可以着手试着用外挂调用一下游戏里的攻击 CALL 了.(如果你不会找 CALL,你可以试着在此论坛里找找) 下一节里,我会以技能 CALL 举例说明如何使用参数. 上一课里有些错误,我已经更正并用 红字 标注了,如果有人因为这些错误在实践时受挫,我表示道歉,呵呵。 过些天我可能会写个简单的 DEMO,大家敬请期待吧.转载请注明出自外挂海编程论坛,本贴地址:http:/

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报