汇编语言在ARMv7上的使用(还有NEON编程)

这是好好的嵌入式的心得,才不是破解游戏时候做的呢。

unity出了一个il2cpp,把关键代码放到了so里面,这个so还是不能用ida直接分析的。网上有大神就写了能直接dump出来一个神奇脚本小程序(具体链接是:https://www.perfare.net/659.html),这个dumper已经到了latest build(我就当他是一个版本号了),auto都十分强大,大家可以去大神博客下载。

dump出来一个cs文件和一个py脚本,cs文件可以看各种函数名,py脚本是加载到ida里面的(加载上它又分析了一宿)。然后正常情况下能不能f5就看脸了,不能就改汇编,顺便再推荐一个网站http://armconverter.com/,能看汇编指令的机器码。在二进制编辑器里面直接改就成了。

这次这个就神奇了,好多即使是能f5看,看到的也有好多汇编语言翻译不过来,大多数都是指令前面带个v,网上一查原来是neon指令。有关neon指令的官方文档还请看arm官网(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Cjaihjec.html)这个网站卡的怪怪的,但是能下载下来PDF,推荐看PDF。

东西就介绍这么多,下面就是修改了,修改无非就是两种:改正负号、直接返回一个我们需要的数。改正负号,或者说把减改成加,看着简单一点,但是在没有反编译的时候就怕找到错误的地方。于是我这次选择了返回一个值。定位修改的函数的返回值是一个double,我一开始还天真的以为double就是两个int合起来,因为明显返回的是R0,R1两个寄存器,我只改一个的话,改高位就行。但是事实上double是浮点数(我说的那个叫long int),然后又查了浮点数的二进制表示手法,大致就是分符号位,阶码和尾数,double是64位双精度的,分别占了1,11,52位。

返回值的前一条指令是一个vmov,把一个S寄存器里面的值赋给R0,R1,NEON指令中的vmov是可以使用浮点立即数的,我一开始想对S寄存器赋值,但是弄了半天没弄好,文档里面也写得模模糊糊。然后又把一部分指令nop掉,因为so修改不能加减指令,好多都是算偏移的,结果毫无疑问的崩了。最后还是打算对R0使用mov指令,寄存器里面的值就是值而已,浮点数控制大小的还是最前面的几位。用十六进制查看器找一个合适的数字准备输进去,这一步有两点注意的,首先,数字一定是“合适”的大小,有一次不知道哪改不对了,游戏里显示的都是NaN;然后十六进制查看器是看文件的十六进制,里面高位和地位是反着的。

mov的时候又发现了问题,因为mov输入立即数只能输0到65536。其实是控制不到R寄存器的高位的,但是后面有发现有灵活的第二操作数,能让8位的常数以各种移动mov进去,最后只控制了最高的8位,输出了一个迷一般的浮点数。

多看官方文档,可能没有教程详细,但是有许多网上教程没有的东西。

你可能感兴趣的:(汇编语言在ARMv7上的使用(还有NEON编程))