xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
来源:互联网 发布:查看udp端口 编辑:程序博客网 时间:2024/05/16 14:12
掌握了基本技巧后,基本上已不难理解所有的反汇编结果。授之以鱼不如授之以渔:
通过观察自己写的代码的反汇编来掌握各种代码的反汇编结果,从而逆向推测系统代码的源码。
调试自己写的代码时,可以不断切换查看源码和反汇编来定位代码执行到何处
这里分别用两个很简单的C++和Objective-C类来做示例:
class TestC { int m_var; public: int getVar(); void setVar(int var);};@interface TestOC : NSObject{ int m_var;}- (void)setVar:(int)var;@endint g_var = 0;int *g_pVar = &g_var;void TestC::setVar(int var){ int l_var = 0; l_var = var; m_var = var; g_var = var; *g_pVar = var;}@implementation TestOC- (void)setVar:(int)var{ int l_var = 0; l_var = var; m_var = var; g_var = var; *g_pVar = var;}@end在外部,这样调用:
- (void)viewDidLoad{ TestC test; test.setVar(100); TestOC *t = [[TestOC new] autorelease]; [t setVar:100]; .......分别在两个类的setVar加断点,看反汇编结果。
WebViewResearch`TestC::setVar(int) at TestClass.mm:15:0x8bda: pushl %ebp0x8bdb: movl %esp, %ebp0x8bdd: calll 0x8be2 ; TestC::setVar(int) + 8 at TestClass.mm:150x8be2: popl %eax0x8be3: movl 12(%ebp), %ecx0x8be6: movl 8(%ebp), %edx0x8be9: movl %ecx, (%edx)0x8beb: movl %ecx, 30406(%eax)0x8bf1: movl 29170(%eax), %eax0x8bf7: movl %ecx, (%eax)0x8bf9: popl %ebp0x8bfa: ret
WebViewResearch`-[TestOC setVar:] at TestClass.mm:25:0x8bfb: pushl %ebp0x8bfc: movl %esp, %ebp0x8bfe: pushl %esi0x8bff: calll 0x8c04 ; -[TestOC setVar:] + 9 at TestClass.mm:290x8c04: popl %eax0x8c05: movl 29372(%eax), %edx0x8c0b: movl 16(%ebp), %ecx0x8c0e: movl 8(%ebp), %esi0x8c11: movl %ecx, (%esi,%edx)0x8c14: movl %ecx, 30372(%eax)0x8c1a: movl 29136(%eax), %eax0x8c20: movl %ecx, (%eax)0x8c22: popl %esi0x8c23: popl %ebp0x8c24: ret以上是release版的结果。可以看到,编译器做了优化,没有实际用处的局部变量l_var直接被省略到了,既不为它分配空间,连对它的赋值语句都没要。
对于操作成员变量、全局变量,没法直观地看出来,需要自己计算好各个偏移,才会明白那些带括号的间接寻址的操作。这些麻烦的事情可以借助IDA Pro来看(后面会有一系列来讲)。
下面是调用两个类的setVar函数的反汇编语句。
0x441e: leal -16(%ebp), %eax0x4421: movl %eax, (%esp)0x4424: movl $100, 4(%esp)0x442c: calll 0x8bda ; TestC::setVar(int) at TestClass.mm:15
0x445b: movl 45819(%esi), %ecx0x4461: movl %ecx, 4(%esp)0x4465: movl %eax, (%esp)0x4468: movl $100, 8(%esp)0x4470: calll 0x97c0 ; symbol stub for: objc_msgSend
可以看到C++能更直接地看出下一步的去向,OC则需要知道是哪个类的对象以及Selector(可用register read来查看)。所以系列中也没特别针对C++做讲解。
对比类的函数以及被调用处的行数,也可以间接地表明,Objective-C的效率会比C++慢一点,但也差不了多少,主要耗时在objc_Send里的查找,也就十几到几十行的汇编指令,很快就过去了。Apple也有一些帮助反汇编调试的文档:
http://developer.apple.com/library/ios/#technotes/tn2239/_index.html
使用IDA做静态分析系列:http://blog.csdn.net/hursing/article/details/8920487
转载请注明出处:http://blog.csdn.net/hursing
- xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
- xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
- xcode反汇编调试iOS模拟器程序
- Xcode反汇编调试iOS模拟器程序
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- 分享&交流&调查 xcode反汇编调试iOS模拟器程序
- xcode反汇编调试iOS模拟器程序系列
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序(五)调试objc_msgSend函数
- 实用jquery的时间控件,教你如何玩转时间
- 关于Android的学习起步
- 开放式系统互联模型基础知识
- docx4j -- 使用Java处理word2007(.docx)文档
- java 虚拟机安全
- xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
- 使用JavaScript获取PHP代码中的数组
- 3D游戏中的数学方法(C++实现)1
- 创建点实体图层--向量图层,为什么在图层管理器中没有添加点、线、面的按钮?
- DedeCMS中用到的字符编码转换
- ipcs
- Haydn第104号交响曲的讨论
- GCC 小技巧
- 举杯邀明月,共看断点行