反汇编的疑问 以及 我逆向游戏的思路(菜鸟思路

正题
最近在逆一款游戏. 思路就是用Hopper分析感兴趣的逻辑的执行过程, 然后, 发现条件跳转的时候, 改变条件. 或者nop掉跳转.
但是, 也碰到了很多问题. 在此感谢群里各位大牛的耐心讲解~

问题
1. 汇编代码与机器码之间的具体关系如何? 为什么同样的机器码用不同的工具看到的反汇编指令不一样? 例1:


黑色为as命令编译出来的文件otool反编译的结果, 浅色的为hopper分析完整二进制文件得到的结果. 差别相当明显. 感觉应该是as的编译需要指定一些参数神马的吧. 还没搜到.
例2:

黑色为gdb动态调试得到的反汇编结果, 浅色为hopper分析完整二进制文件得到的结果, 可见只有一条命令不一样. fmrs我也没搜到是神马指令.(忽略那个s0与s10的区别, 我改动机器码了)

2. 与问题1差不多, 就是如何获取特定指令的机器码呢? 

简单的指令, 比如mov r0, #1 这种, 直接as编译一个文件, 再otool反汇编就行了. 但是复杂一点儿的. as就各种报错, 明显写的跟gdb分析出来都一样.
再就是虽说as成功了, 但是otool反汇编后的结果跟gdb的大相径庭.
例:

无论是hopper分析出来的指令还是gdb分析出来的指令,as均无法编译成机器码

3. 如何写函数调用指令? 

比如, 一个函数的地址为 0x0123456. 则汇编写成 bl 0x123456后, otool反汇编得到的机器码为f123fa29
然后, 把这个机器码放到想替换的目标位置的时候. 再次反汇编, 看到的结果就完全不是函数调用了.

Ps: 刚发现Hopper还有alt+a… 但是, 还是没搞出来 vmov r0, s0, lsl #2的机器码是啥~

望大牛们不吝赐教~ 谢谢~ :lol

鹳狸猿… 把图片的水印去掉吧… 或者换个透明度80以上的… iosre的… 幸好没挡住关键内容…

问题1:
例2:fmrs是老版的arm汇编。等价于vmov。你去找找旧版的arm 汇编的reference.

以下只是猜想
例1:那就是说明,otool不能反汇编新版的arm汇编。所以相同的指令,它会以老版的语法结构来解析,导致结果和hopper或者ida的不同。hopper和ida都会随着arm 汇编语法结果的改变一直在更新,otool我就不知道了。也许只是因为otool更新太慢,跟不上时代~。

问题2:
可以试着自己写机器码~?
或者从已知的机器码去修改。例如,有 mov r0, 1的机器码,我们把它改成 mov r0, 0的机器码就蛮简单的
应该有更便捷的途径,我也求指教~.

问题3就不懂了,没搞过~

:)
--------------------------补充-------------------------------------------------
有“otool更新太慢,跟不上时代”这个猜疑,是因为问题1里,用到了浮点寄存器d18,及vmov.f32 这个好像是neon加速指令~?

好专业… 简单的确实可以自己动手就改了.小的立即数很好改. 但是稍稍复杂点儿的. 或者大立即数就很棘手了… 昨天快写完帖的时候. 发现hopper竟然有alt+a… 就是在指定位置输入汇编代码. 然后. 自动的替换那行代码… 我试了下,发现应该是在空间足够的情况下才行, 所以, 后来就先把下边的nop掉… 就有足够的空间随意写了~ 然后. 就能得到机器码了… 这方法超赞~ 哈哈哈哈 完全脱离otool了` :lol

我已经把水印的选项全都勾掉了啊,不知道怎么会还有水印,你再试试,有的话我再调一下

  1. 汇编码和机器码是1:1的关系,但是要通过一定的方式把汇编码转化为机器码,我没有手动转过,网上有资料,你可以搜搜看;
  2. 猜测:hopper,IDA,gdb和otool应该有各自的反汇编方式,我觉得以otool为准比较好(因为是OSX自带的),而且otool在反汇编时可以指定arch,你在hopper和otool都指定相同的arch试试看还有差别不;
  3. 猜测:如果在你不懂机器码的情况下,手动改了机器码之后,很有可能系统会把你写的机器码给拆成2部分,然后给拼到前面和后面的机器码上去了,造成汇编代码错误。我以前在windows上练习patch时,都是在ollydbg里直接改汇编代码,olly会自动帮我生成机器码,从没直接更改过机器码。玩iOS后,更是用Theos来动态patch,没有直接写过binary

otool的详细教程没找到好的… 找到一篇http://blog.163.com/iswing@126/blog/static/166700480201129102259978/ 说的比较多. 还是没看到怎么指定arch~
改机器码我发现hopper的alt+a了~ 哈哈 还学会了 movt movw. 大立即数可以用两个指令搞定~ 帅 ~

话说我还没尝试写过patch呢` 如果说, 我直接改二进制得到的结果. 应该如何用theos编写个patch去实现呢?
我改的主要就是cmp…

otool还要什么教程,所有的OSX自带命令行命令都可以通过“man command”(如“man otool”)的方式查看使用手册!
书中Optimo撰写的后记专门提到,Theos(CydiaSubstrate)的优点就在于无需静态patch二进制文件,而是通过dylib注入的方式来动态patch。CydiaSubstrate虽然没有提供方便地修改汇编代码的功能,但你要改的是cmp,这个cmp的某一个参数肯定是通过哪个函数算出来的,所以hook那个函数,改一下返回值就可以了。

好吧~ 太复杂了那就~ 比如函数X被函数 A B C均调用. 我只希望改函数A调用X的返回值. 这就比较难搞了~ 如果是直接改汇编代码… 就简单多了~ 小菜表示汇编真的是简单粗暴啊~~ :lol

直接改汇编代码的话,你怎么样可以只改A调用X的返回值?

我把汇编代码定位到A中… 然后. 会有类似如下代码

b func
cmp r0, 1 ; 改这个.. 

然后. 就搞定了~