23.x86游戏实战-实现读人物坐标

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:22.x86游戏实战-实现读人物

找人物坐标地址,首先打开CE,并附加到游戏

人物地址使用的数据结构一般是单浮点,如下图使用位置的初始值扫描

扫描完有很多

在游戏中横向移动,也就是左右移动,改变x坐标,移动之后使用变动的数值再次扫描

然后游戏中什么都不要操作,然后使用未变动的数值再次扫描

然后一直重复上方变动和未变动的操作,最终剩下27个,然后下图两个红框里的数据最像坐标,其它的数值小数点太多,有的还出了科学计数法

所以把不满足的数据手动删了

删除之后

然后第一个地址颜色是绿色的,这说明它是全局变量,游戏重启地址不会变,然后之前分析名字的时候,名字是通过加偏移得到的,然后坐标应该也是数据人物相关的数据,人物相关的数据它必然会放到一起,所以这个绿色的地址不是我们要的,我们要的是非绿色的,也就是第二个地址0x5889718C

然后打开OD,看看这个地址怎么来的,如下图鼠标单击内存区,然后按ctrl+g键然后在弹框中输入地址,然后点OK,第一次点OK可能没用,需要在按一次ctrl+g再按一次OK才可以

然后为了好看使用HEX显示,如下图

然后下硬件访问断点

然后来到下图位置,xmm寄存器是专门用来放小数的,然后xmm0的值来自于ebp+8,ebp是栈底所以xmm0的数据来自于参数

然后先把硬件断点删除

ecx的值是一个内存地址,ecx的值也正是通过CE得到的地址,xmm0的值给到了这个内存地址,所以应该看ecx的值从哪来,xmm0的值就不需要管

删除之后按ctrl+f9,来到上一层,可以看到ecx的值来自于edi+18C,接下来看edi的值从哪来

然后往上看,可以看到一堆很乱的代码,如下图,代码里还有?还有加的偏移很大的,这种代码不用纠结,这种代码是混淆代码,用来组织别人逆向的手段,这里执行完游戏会退出(闪退),所以edi的值我们是找不到了

但是我们想要的东西已经得到了,edi+0x18C,最开始说坐标属于人物的数据,名字的地址是[0x1AB7CDC]+0x258,所以可以猜测坐标的地址是[0x1AB7CDC]+0x18C

使用CE验证,通过[0x1AB7CDC]+0x18C可以得到x坐标

让y坐标的获取,坐标这个东西正常人写的代码,x坐标y坐标肯定是相邻的,所以点击浏览相关内存区域

然后选择使用单浮点显示

然后上下移动角色改变y坐标,可以看到下图红框的数据有红色背景,说明这个值被更改了,然后这个数据也符合坐标数据的样子,所以它就是y坐标

然后x坐标是加0x18C,y坐标是加0x18C加0x4(也就是加0x190是y坐标)

代码

首先添加一个按钮

然后给按钮更改显示的文字

然后双击按钮

双击完它给我们生成的代码(函数名可以与下图中不一样,函数名是根据按钮id来的,只要是通过上图双击自动创建的就没问题,不用在意)

获取坐标的实现

编译的时候会出现下图的错误

复制下图红框里的内容(_CRT_SECURE_NO_WARNINGS)

然后右击项目选择属性

然后找到预处理器

然后选择编辑

然后把上方复制的字母粘贴到下图红框位置

然后鼠标单机最前面,然后按回车(Enter)键

然后把上方复制的字母放到第一行(放在第几号都行)

然后点确定

然后再次重新编译(重新生成)

就可以生成成功了

然后注入,注入之后发现上方代码写的有问题,做出了修改,如下图,上方的代码只把内存地址得到了,内存地址的值没有得到,我们现在要的是内存地址的值

效果图:

代码:

void DXXDlg::OnBnClickedButton2()
{
	//  [[0x1AB7CDC]+0x18C]x坐标
	//  [[0x1AB7CDC]+0x190]y坐标
		/*
			*这个符号表示地址,在c++中被称为指针或指针类型
			int表示4字节数字
			int*就表示指针类型的int
			(int*)0x1AB7CDC;这样表示0x1AB7CDC地址里的内容是4字节的数字
		*/
	int* address = (int*)0x1AB7CDC;
	/*
		取出地址中的值,也就是取出0x1AB7CDC里的内容
		*address这样在左边只写一个*表示取内存地址里的值
		也就是取address它的值,address是0x1AB7CDC,也就是取0x1AB7CDC它的值

	*/
	int addressValue = *address;
	float xZuoBiao = *(float*)(addressValue + 0x18C);
	float yZuoBiao = *(float*)(addressValue + 0x190);
	char buf[256] = { 0 };
	// 拼接文字,%f表示拼接一个小数(单浮点数)
	sprintf(buf, "x=%f;y=%f", xZuoBiao, yZuoBiao);
	OutputDebugStringA(buf);
}

完整代码:以 22.x86游戏实战-实现读人物 它的代码为基础进行修改

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5

提取码:q9n5

复制这段内容后打开百度网盘手机App,操作更方便哦


  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值