找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 289|回复: 0

2-1-1、CALL调用示例分析-远程代码注入器

[复制链接]

1793

主题

457

回帖

0

积分

管理员

积分
0
发表于 2013-7-1 20:00:17 | 显示全部楼层 |阅读模式
前  言

学完第一章后,我粗略、概况的看了一遍第二章的内容,了解了大致情况之后,现在下决心仔细学习每一节课,一步一个脚。
我发现老师会根据游戏的变化而更改教程方案,所以如果不尽快将当前的知识学会,可能存在着技术的过时性,因为老师的技术也是在不断的更新。

//////////////////////////
一点我要说明,有的同学说在看录像的时候说不让操作其它程序,会有提示出现,我发现用隐藏软件将占用CPU的程序隐藏即可。
//////////////////////////

中级篇2-1-1
前面好些天没写笔记了,因为没仔细学嘛,好现在开始。
这一节课是CALL调用基础课,教案里提供了一个小程序为例,让我们来熟悉一下如何用OD来查找及调用CALL。首先用OD调试这个TEXTCALL,用OD下断bp MessageBoxA,这个是针对弹出信息框的API函数,断下来之后查看“调用堆栈”,查看到TESTCALL(第二个CALL)比较像,
然后鼠标右键“显示函数过程”,找到一个JMP,跟随它到地址处,下断,断下后

用远程代码注入器调用一下试试

果然成功了

同理,我将下面那个按钮2的CALL也调用了。
call 00401ef0
call 00401ea0
这个没有参数的调用成功了。


中级篇2-1-2

这一章一共是两个视频教程,首先是OD的教程,
OD窗口 分为4部分
1、反汇编窗口
2、寄存器窗口
3、数据窗口
4、堆栈窗口
  
Alt+B:断点窗口
F7: 单步步入 F8:单步步过
ctrl+f9: 执行到返回
数据窗口

DU 地址   使用 UNICODE 格式转储  (统一的字符编码标准,采用双字节对字符进行编码)
DC 地址   使用 ASCII 格式转储 ASCII 码的字符集
DB 地址   十六进制 byte 格式转储  显示Byte格式
DD 地址   使用堆栈格式转储  显示DWORD格式 4Byte
DA 地址   转储为反汇编  显示反汇编代码
表达式    计算
DD [[[[95E800+1c]+24]+8a4]+0C]+0*4  物品对象

然后是查找武林外传人物的血值,用CE查找到之后然后用OD进行分析,发现血值、魔值、血值上限、魔值上限都在一起。此时发现ECX就是当前的血值
意 血值地址每次都会变化,实践时记得重新用CE找过
  dd 04F7398C 血值
  dd 04F7398C+4  魔力值
  dd 04F7398C+18 血值上限
  dd 04F7398C+1C 魔力值上限
但是这个地址是会更改的,接下来我们下一个硬件写入断点(字节),此时发现ECX就是当前的血值,别忘了关闭硬件断点,这是找到了对象的偏移,下面就是更新魔力的值。看一下ESI和EDI的值,再次按F2下断,用DD来查看ESI+25C,对象是指ESI里的地址,
对象+25C 当前血值
对象+260 当前魔力值
对象+274 血值上限
对象+278 魔力值上限
然后看一下坐标,用32位浮点数来查看

// 角色对象 血值,魔力偏移
对象+3C  X坐标
对象+40  h坐标
对象+44  Y坐标


中级篇2-1-3

上一节课我们分析了角色血值,魔力值,坐标的偏移,虽然已经找到了相应的内存地址,  但是游戏重新登录后,这个内存地址就变化了,那么有没有什么方法,能一劳永逸呢;答案是肯定的--找游戏的基址。
首先用DELPHI创建一个小例子,
public
    { Public declarations }
  end;
    type
                   GameObj=class
                   Blood:  integer;//血值
                   Magic:  integer;//魔力值
                   BloodMax: integer;//血值上限
                   MagicMax:integer;//魔力值上限
                   x       :single; //X坐标 float;
                   h       :single; //h坐标
                   y       :single; //Y坐标
                   grade   :integer;//等级
                 end;


var
  Form1: TForm1;
  role :GameObj;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

  role:=GameObj.Create;   //动态分配一块内存给role
    role.Blood:=$272;
    role.Magic:=$271;
    role.BloodMax:=$300;
    role.MagicMax:=$300;
    role.x:= 100.1;
    role.h:= 10.2;
    role.y:= 200.3;
   

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
role.Free;
end;

end.
用DELPHI在role:=GameObj.Create;   //动态分配一块内存给role处下断,然后查看CPU

那么0044DFC5里面的EBX就是基址,下面用OD。

按F8下向走,但是浮点数值不一样
  


我们看DD EAX,这里就是保存血值等的地址了。
0044DFC5:
  Ctrl+G :  转到44D999://发现00451b68是基址
  dd [00451b68]+4 :血值
  dd [00451b68]+8 :魔力值
  dd [00451b68]+C :血值上限
  dd [00451b68]+10:魔力值上限
  dd [450bd4]+14: X坐标
  dd [450bd4]+18:H坐标
  dd [00451b68]+1C:Y坐标

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 03:27 , Processed in 0.068846 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表