一段汇编码求解读,代码逆向

@snakeninny

用IDA查看APP的汇编码的时候,有一段汇编码,一直不清楚具体的运行流程,想写一个相应的伪代码也一直无法正常工作
下面是汇编码:

; Service - (char)request:(struct IMessage *)
; Attributes: bp-based frame

; char __cdecl -[Service request:resHandler:error:](struct Service *self, SEL, struct IMessage *)
__Service_request__

PUSH            {R4-R7,LR}
ADD             R7, SP, #0xC
PUSH.W          {R8,R10,R11}
MOV             R10, R0
MOV             R6, R2
LDR             R1, [R6]
MOV             R0, R6
LDR             R1, [R1,#0x10]
BLX             R1
MOV             R11, R0

下面是IMessage的结构:

struct IMessage {
    CDUnknownFunctionPointerType *_field1;
};

我对上面汇编码的理解是:

; Service - (char)request:(struct IMessage *)
; Attributes: bp-based frame

; char __cdecl -[Service request:resHandler:error:](struct Service *self, SEL, struct IMessage *)
__Service_request__

PUSH            {R4-R7,LR}
ADD             R7, SP, #0xC
PUSH.W          {R8,R10,R11}
MOV             R10, R0
MOV             R6, R2                                                      // R2 = (struct IMessage *), R6 = R2
LDR             R1, [R6]                                                    // R1 = *R6 即  R1 = (struct IMessage) ?
MOV             R0, R6
LDR             R1, [R1,#0x10]                                        // R1 = *(R1 + 0x10),即 R1 = *(struct IMessage) + 0x10) ?

我自己尝试在tweak 里想关的代码的时候,却一直复原不出来

%hook Service
- (BOOL)request:(struct IMessage *)arg1
{   
        long addr5 = (intptr_t)&(*arg1);                                    // add5 = (int)& (struct IMessage)即 add5 = &(*R6)
        NSLog(@"%lu",addr5);
    
        long * p;
        p = (long *)(addr5 + 16);                                              // *p = *(&(*R6) + 0x10)
        NSLog(@"%lu",*p);

    
      ( *(void *(*)())(*p))();                                                   //  *p(), 返回void*;实际运行直接报错退出

请各位高手指定迷津!

注意你贴出来第一段汇编码的第15行,有个BLX R1,即调用了一个函数。关键的工作应该都是在这个函数内完成的,而在调用这个函数前,R0是R6,R6是R2即struct IMessage *;函数调用结束后把R0赋给了R11,说明函数有返回值,所以这个函数应该是个形如void *SomeFunction(struct IMessage *)的调用。解决方案就很简单了,lldb在这个BLX R1上下个断点,看看此时R1的值就知道它调用了哪个subroutine,然后分析那个subroutine就可以了

我大致能通过IDA找到 subroutine 的地方

我想弄清楚的是,怎么用代码重现第一段汇编码的执行过程,获取到R11,我想通过tweak 在这个函数的开头自己把这个结果求出来~~~

第一段汇编码的第15行BLX R1, 从上文的汇编码分析,R1也是从R6来的,所以我一直在考虑,这段汇编码怎么用代码表达出来

你这里的

long addr5 = (intptr_t)&(*arg1); 

好像不对吧?去掉这里的

&

试试?

必然会报错的,*arg1 是个struct

Cannot convert 'struct IMessage' to 'intptr_t' (aka 'long') without a conversion operator

那我就不清楚了,你试试直接用内联汇编?

内联汇编不怎么会。。。。哪儿有相关资料没有?

这个链接不错,你把IDA反汇编出来的代码直接复制粘贴一下应该就可以了

多谢,学习去