申请会员ID:赶码人【申请通过】
1、申 请 I D:赶码人2、个人邮箱:366371380@qq.com
3、原创技术文章:
(目前在网络上没写过好文章,只在B站发过几个视频教程:)
https://space.bilibili.com/669962565/channel/seriesdetail?sid=488234&ctype=0
用IDA快速找到矩阵基址偏移(IDA入门操作教程)
视频内容文字:
你好 我是赶码人
这期视频演示IDA直接看坦克英雄激光战争矩阵基址偏移的步骤,
本来想这期视频把矩阵算法也一起说了,但是录完之后发现时间太长了,所以矩阵算法下期再录,
游戏安装包,后缀原本是apk,改成rar,解压,
找到里面的lib文件夹,
这里有两个子文件夹,上面的文件夹里面的共享库,是给十多年前的CPU使用的,我们现在手机cpu都是v7或者v8架构,
所以我们选这个带有v7a的文件夹,把里面的共享库文件拖出来
然后打开IDA,v7a文件夹里面的so是32位的,所以用32位的IDA打开,
可以直接把so文件拖到IDA图标上,
也可以打开IDA之后,这个窗口直接点new,然后找到我们共享库的位置,
默认已经选中了ELF for ARM,啥也不用点,直接点OK
然后IDA开始对这个so进行分析,
左侧是so文件涉及到的函数名,
没有符号的函数就是sub开头,这里的符号是指函数名和变量名,
直到左下角数字不再变化,或者出现idle,表示分析完毕,
然后我们点一下函数名的窗口,按下Ctrl+F,开始搜关键词,
要找矩阵相关函数,可以直接搜matrix,
和矩阵有关的单词,除了matrix,还有它的简写mat,
以及视椎体frustum,
投影的简写 proj
视图矩阵简写 view
相机 camera
这些都可以用来找到矩阵相关的函数,还有perspective之类的单词,这个要自己多积累
这里已经通过matrix搜到了三个函数,
背景色是浅粉色的函数先不用管,通常是其他库的函数,
先看ViewMatrix这个函数,
双击,如果变成了这种流程图的形式,可以按一下空格,
然后按F5,IDA就会将汇编指令分析成C语言伪代码,
我们看到这个函数进行了赋值操作,一共有16行,
很显然,这是在给视图矩阵赋值,
双击左边的dword开头的变量名,
跳转到了so的bss段,
bss段的地址存储的都是程序中的全局变量,
左边这个63894就是这个全局变量相对于so文件的偏移,
我们复制下来,然后打开CE,
直接添加一个地址,63894是基于libnative.so文件头的偏移,所以这样写,
先浏览内存区域,然后切换成浮点数的显示类型,
可以看到现在矩阵是个单位矩阵,对角线是1,其余数字是0,我们继续游戏再看一下,
可以看到这个矩阵的第四行前三个数字看起来就像是相机坐标,
这个矩阵相比于上期视频的茶壶demo中的矩阵,经过了转置,
所以茶壶demo中,和相机坐标相关的三个浮点数在第四列,而这里在第四行
我们移动人物之后,相机的位置和角度也变了,所以你会发现,矩阵相关位置的值也在变化,
现在我们视图矩阵已经找到了,但是这个地址的矩阵不是很好,
比如说,游戏暂停之后,这个矩阵就变成了单位矩阵,
很可能有别的函数也在往这个地址写入数据,
所以我们要进一步分析,刚才那个viewmatrix函数的参数是哪来的,
先记录一下这个矩阵的基址偏移,
接下来看是哪里调用了这个函数,点击这个函数名,然后按键盘上的x键,
可以看到一个带有Perspective的函数,perspective是透视的意思,
点进来,然后看到这个函数最后一句调用了刚才我们看的viewmatrix函数,这里传入的变量是v4,这个v4的值实际是个地址,传入viewmatrix函数时转换成了指针,
然后找这个v4在进入viewmatrix函数之前最后一次赋值的位置,
可以看到第54行,
v4 = rdc + 170968
这个170968是十进制,我们在ce中要填16进制,可以对着这个数字右键,切换成十六进制,
然后双击rdc,找到rdc是哪里来的,可以看到rdc是bss段的一个数据,相对于so文件的偏移是689d0,
现在就找到了另一个存储视图矩阵的地址,
然后我们到CE中,添加这个rdc,看rdc存储的数据,
刚才说v4存储的是一个地址,而它在54行和rdc直接相加,那么rdc存储的也是一个地址,或者说 rdc是个指针,
我们先看这个指针指向哪个地址,
指向的是816D9D78,
然后再添加这个指针的偏移,也就是刚才看到的第54行的29bd8
然后按Ctrl+B,这个矩阵就很稳定,只有视角变化了才会变,游戏暂停之后不会乱变,
所以我们可以记录下这个基址偏移,后面就直接用这个基址偏移了。
在CE中也可以这样写,用中括号表示把中括号中的内容当做指针,
接下来找投影矩阵,
双击左侧函数窗口的projectionMatrix函数,进来之后,
能看到有16行赋值的代码,所以可以直接猜测这里就是在构造投影矩阵,
这里就是计算投影矩阵,如果感兴趣可以自己对照着上期视频的茶壶demo里面的矩阵构造格式,
看看这里a2 a3 a4 a5 a6表示的实际意义,
这里有很多地址设置成0,也正对应了投影矩阵中有很多位置是0,
我们找到这16个数值的开头,也就是 最低的偏移,
很显然,63914最小,这个63914实际就是对于so文件的偏移,
然后到CE中进行验证,
可以看到这里就是投影矩阵,
但是游戏暂停后还时不时出现变化,
这是因为有其他函数也在向这个地址写入一个默认数据,
可以对着刚才的bss段63914按x看一下还有啥函数在往这里写数据,
或者干脆用CE打一个写入断点,虽然指令识别的不准确,但是找是哪个函数在写入是没有问题的,
我这里不具体演示了,对于本系列教程不是很有必要,再详细就讲不完了,
我上期视频说过,投影矩阵实际上描述的就是视椎体,对于这款游戏也没有改变fov的行为,
所以视椎体的大小不会变的,也就是投影矩阵是一直固定的,
所以对于这个游戏,我们干脆就把投影矩阵这16个数字复制下来,后面直接用就行了,
https://static.52pojie.cn/static/image/hrline/4.gif
免root使用ceserver的教程,以及注意的地方
教程05-1:免root使用ceserver桥接真机的准备工作:设置debuggable=true
教程05-2:CE查看安卓手机内存中的数据(ceserver桥接教程)
视频内容:
你好我是赶码人
这期视频演示一下ceserver 下载 编译 使用
先说说如何下载,首先打开github,搜索ce全称 cheat engine,中间记得加上空格,第一个搜索结果就是,语言这里是pascal
不要直接点这里下载,目前这里的代码是7.4版本正在开发中的,里面的ceserver不适合目前最新发行的7.3版本,会导致选择 进程之后卡死,因为有个结构体变了,不细说了,
点击右边的releases,往下翻点这里下载源代码,
下载完成,找到ceserver的目录,直接拖出来解压,
这里有个markdown文件,介绍了编译和使用的步骤,以及参数,
我直接演示,打开ndk-build目录,我上个视频说过,ceserver有两种编译结果,一种是so文件,共享库,另一种是可执行文件,
我们进入EXECUTABLE文件夹编译可执行文件,
步骤和我以前一个视频里演示的一样,在jni同级目录打开终端执行ndk-build
有很多警告,我们不用管它,
然后顺便说一下这个Application.mk,这里指定了我们要编译出的版本,
这里后两个分别是真机32位和64位,第一个x86通常是给模拟器用的,
编译出的东西在libs文件夹,
具体选择哪一个版本,这个要根据游戏来选择,64位游戏选择armv8这个,32位游戏选择v7,即使你是64位的手机跑32位游戏,也要选择v7版本
然后我先演示一下root过的手机,
现在adb连接上的手机是已经root过的,
root过的手机,直接 推到 /data/local/tmp这个目录或者是子目录,
因为我这个tmp目录已经有ceserver了,所以我提前建了个子文件夹,放到子文件夹了
我先开个投屏
接下来进入adb shell,执行su命令,
接下来进入ceserver所在的地方,先检查是否有可执行权限,这里有x代表可执行,
我们直接执行就行了,
这里显示正在监听52736端口,
然后再打开一个终端,进行端口转发,使用adb forward命令,
接下来就可以使用CE了,我用CE7.3演示,
点击最下面的“网络”,如果你已经运行了ceserver,并且打开了端口转发,并且手机和电脑在同一局域网,这个列表会自动显示可以连接的设备,直接连接就行了,这时候这个列表就是手机上的进程,这时候我们可以点击这个列表,然后键盘按GAMES,过滤出包名,
可能有点看不清,这里有个app process32,表示这是一个32位进程,我们选中后直接点打开就行了,
然后看ceserver这个终端,
正在进行一些初始化相关工作,
现在正在获取符号表,ce对arm指令兼容性很差,经常识别错,所以其实没啥卵用,可以自己在代码里删掉这部分,
我们接下来开始搜索测试一下,随便搜个数字1,
搜索完成了,顺便提一下刚才说的那个获取符号表,作用就是可以快速定位到某个函数的地址,比如输入个malloc,就可以得到它的地址了,按一下ctrl+d,这些就是malloc的汇编指令,
接下来演示一下没有root的手机,
没有root就推到sdcard目录,
然后进入run-as,进入到游戏的目录之后,使用mv命令,将ceserver移动进来,这个点表示当前路径,
这里提示操作没权限,不用管它,是否有这个提示可能因手机而已
然后用ls命令,可以看到ceserver已经进来了,
然后我们看这里没有x,表示不可执行,所以要先执行chmod 777,
设置可执行权限完成了,然后直接执行它,
因为我刚才重启了adb连接了新手机,所以要重新进行端口转发
ceserver被结束了,可能是因为我这个手机内存太小了,重新打开就行
接下来步骤和有root是一样的,
如果连接服务器这里,“已发现的服务器”是空的,就进入adb shell,用ifconfig看一下自己ip,找192.168开头的,复制过来,
我这里没连接上,又被结束进城了,没事,重新运行,然后就好了。
选中游戏进程点打开,然后有反映了,但是又没了,我的内存太小了,你们手机应该不会出现这个问题,重新连一下就行了,
然后先搜索一下,看看有啥问题
你会发现搜索进度不会动,卡在了这个函数,
实际上是卡在这个地方,
这里会试图打开pagemap文件,但有些手机如果没有root权限,是不允许打开这个文件的,或者读不出内容,
我之前是直接去api.c,直接把pagedonly设置成0,
我之前觉得这了要改,实际上是因为没找到控制flags的地方,
这两天才刚找到,实际上CE在连接ceserver之后,会多出一个“网络”菜单,
把最后一个勾取消掉就可以了,
在选择好进程之后就要及时取消勾选,
第一个是压缩率,理论上如果你手机性能比较好,调高一些,搜索速度会更快
取消掉那个钩子之后,就可以正常搜索了
CE桥接教程就先到这里了。
接下来搜一下坐标,通过自己的坐标确认一下地图的四个角的坐标,这样就可以在找到矩阵之后测试起来比较方便,可能现在不太理解,后面就明白了,
本系列视频把表示高度的轴叫做y轴,下期视频聊矩阵再说原因,
我们先搜水平方向的坐标,可能是x轴,也可能是z轴,
暂停,搜索未知的初始值,类型float,
一般没什么心机的游戏都是float表示坐标,
因为矩阵通常是float类型,用不到double,
而且相比float,double占字节多,运算效率低,
如果用int,与float运算之前还要先做转换,麻烦,所以这种简单游戏肯定是float,
然后继续,向左移动,搜索减少,
解释一下为什么是减少,咱们不知道坐标轴的正方向在哪,就先假设左边是负方向,右边是正方向,如果搜不到,再假设左边是正方向,
剩下的步骤以此类推,
现在只剩下30多条结果,下面这些在我们暂停游戏之后还一直在变动,直接删掉
现在剩下11条结果,直接拉下来,
先选中一部分,然后空格键冻结数值,
再恢复游戏,看人物是否能左右移动,
现在人物不能移动了,
真正坐标肯定在下边,我们把上面未选中的删掉,
然后再冻结一半,
以此类推,找到真正控制人物坐标的轴,
第一个值就是我们要找的值,
选中之后按下Ctrl+b,
然后ctrl+9切换成单浮点,
也可以右键来切换,
这个2.53就是我们现在横向的坐标,
然后我们移动游戏,
程序员在写结构体的时候肯定习惯上是按照xyz的顺序写这三个属性,
所以2.53要么是x要么是z,那么2.53后面的值可能是y,也可能前面这个值是y,
我们可以移动一下来确定18.54是否是z,
我直接说结论了,2.53是x,0是y,我们可以把y设置成20,看坦克是否漂浮起来,
接下来就去找地图四个顶点的坐标了,
左上角是2.57,0,2.70
这个坐标是角色的中心点的坐标,所以实际上左上角坐标是0,0,0,也就是原点,
同理获得另外三个点坐标,
结论:四个顶点,x轴分别是0或95,z轴是0或70
视频内容完了,
给坐标打个断点,可以看到显示的指令都是错的,这就是之前说的ceserver对真机支持很不好,基本只能用读写内存和指针扫描,这期视频就到这了,下期录矩阵算法
证明是视频作者本人(我的浏览器好像传不上来图片):
https://t.bilibili.com/603733309309351649
I D:赶码人
邮箱:366371380@qq.com
申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。 Hmily 发表于 2021-12-14 15:23
I D:赶码人
邮箱:
前来报到,感谢审核!
页:
[1]