汇编与C/C++/Objective-C混用,分两种类型:外联汇编、内联汇编。 LLDB的一些常用指令可以协助我们更好的读取分析OC反编译,看懂汇编代码。
1、外联汇编
sum.h 声明:
#ifndef sum_h
#define sum_h
int sum(int a, int b);
#endif /* sum_h */
sum.s 实现:
.global _sum
_sum:
movq %rdi, %rax
addq %rsi, %rax
retq
main.m 调用:
#import
#import "sum.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"%d", sum(1, 2));
}
return 0;
}
2、内联汇编
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
int num1 = 1;
int num2 = 2;
int result;
__asm__(
"addq %%rbx, %%rax"
: "=a"(result)
: "a"(num1), "b"(num2)
);
NSLog(@"%d", result);
}
return 0;
}
LLDB常用指令
1.1、读取寄存器的值
register read/格式 register read/x
1.2、修改寄存器的值
register write 寄存器名称 数值 register write $rax 0
2.1、读取内存中的值
x/数量-格式-字节大小 内存地址 x/3xw 0x0000010
2.2、修改内存中的值
memory write 内存地址 数值 memory write 0x0000010 10
3.1、格式
x是16进制,f是浮点,d是十进制
3.2、字节大小
b – byte 1字节 h – half word 2字节 w – word 4字节 g – giant word 8字节
4、expression 表达式
可以简写:expr 表达式 expression $rax expression $rax = 1
5、po 表达式 6、print 表达式
7、po/x
r
a
x
8
、
p
o
(
i
n
t
)
rax 8、po (int)
rax8、po(int)rax
好文推荐
发表评论