逆向工程

类与方法

Posted by JT on May 25, 2018

LLDB常用命令

打印值、修改值、调用方法

ppo 打印值

ppo 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。

(lldb) p width
(CGFloat) $10 = 70
(lldb) po width
70

类与方法

在AppDelegate中打断点,执行lldb命令查看

(lldb) p self
(AppDelegate *) $0 = 0x0000600003e46380     // 表名self是一个指针
(lldb) p sizeof(self)
(unsigned long) $1 = 8                      // 指针的大小
(lldb) p sizeof(void *)                     // void * 代表指针
(unsigned long) $2 = 8
(lldb) p (int)class_getInstanceSize([AppDelegate class])
(int) $0 = 24                               // 返回一个实例的大小


(lldb) p self
(AppDelegate *) $1 = 0x000060000325a500
(lldb) memory read/3wg $1                   // 打印内存分布
0x60000325a500: 0x000000010535fd08 0x0000000000000000
0x60000325a510: 0x00007fe78c406b90
(lldb) p (Class)0x000000010535fd08          // 对象第一个内容是自己的class,近似isa,arm64架构下不一样
(Class) $4 = AppDelegate
(lldb) po 0x00007fe78c406b90
<UIWindow: 0x7fe78c406b90; frame = (0 0; 414 896); hidden = YES; gestureRecognizers = <NSArray: 0x600003c5b270>; layer = <UIWindowLayer: 0x60000325b2c0>>

类结构

xcrun -sdk iphoneos clang -rewrite-objc -F Foundation -arch armv7 main.m

可以将OC文件转为C++文件类型,下面代码是包含block的,将其转为C++文件类型

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        void(^block)(void) = ^(void){
            
        };
        block();
        
        return 0;
    }
}

clang -rewrite-objc mainBlock.m 执行编译命令