找上下文有哪些方案?

需求: app在刚开始会检测越狱,然后跳到safari提示设备越狱. 现在已经hook了openURL函数,并成功进入断点. lldb调试信息如下:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x00000001052ee894 libfootballDylib.dylib`_logos_method$_ungrouped$UIApplication$openURL$options$completionHandler$(self=0x000000010631ea60, _cmd="openURL:options:completionHandler:", arg1="https://c-notification.klabgames.com/?BundleID=com.abiu.dev.football&DateTime=1579161505.277681&Carrier=(null)&Country=(null)&Platform=iPhone7%2C2&Version=12.4.4&Architecture=ARM64&Error=32", arg2=0x0000000280278080, arg3=0x0000000000000000) at footballDylib.xm:54:27
    frame #1: 0x0000000102dbbeac captain283`___lldb_unnamed_symbol252863$$captain283 + 1104
    frame #2: 0x00000001041fbe00 captain283
    frame #3: 0x0000000103a8596c captain283`___lldb_unnamed_symbol302627$$captain283 + 36
    frame #4: 0x000000010585f6f4 libdispatch.dylib`_dispatch_call_block_and_release + 24
    frame #5: 0x0000000105860c78 libdispatch.dylib`_dispatch_client_callout + 16
    frame #6: 0x000000010586e6fc libdispatch.dylib`_dispatch_main_queue_callback_4CF + 1360
    frame #7: 0x0000000220f9cb20 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
    frame #8: 0x0000000220f97a58 CoreFoundation`__CFRunLoopRun + 1924
    frame #9: 0x0000000220f96fb4 CoreFoundation`CFRunLoopRunSpecific + 436
    frame #10: 0x000000022319879c GraphicsServices`GSEventRunModal + 104
    frame #11: 0x000000024d7f8c38 UIKitCore`UIApplicationMain + 212
    frame #12: 0x0000000100c92f6c captain283`___lldb_unnamed_symbol1$$captain283 + 156
    frame #13: 0x0000000220a5a8e0 libdyld.dylib`start + 4

做了三个尝试皆失败

  1. frame #1: 0x0000000102dbbeac 这个函数确实是执行跳转的函数, 在ida中找到该函数地址为
    sub_10212FA5C, 却提示无xrefs.
  2. frame #2: 0x00000001041fbe00 这地址跳转到如下…
__objd:000000010356FDFD                 DCB    1
__objd:000000010356FDFE                 DCB 0x3F ; ?
__objd:000000010356FDFF                 DCB 0xD6
__objd:000000010356FE00                 DCB    8

  1. frame #1函数的最下面打点,lldb 输入ni 程序退出了
    请问 怎么正确找到上一层函数调用位置呢?:flushed::flushed:

可能不是通过openURL跳转的呢

已经确认了 是openURL,我hook完 没有返回 %orig ,safari没有再打开.

用的寄存器跳转,所以没有xrefs。
另外__objd这个段不觉得很奇怪吗?:slight_smile:

frame backtrace 不正常有种可能是程序本身乱改自己备份的 fp 寄存器,这样会让栈回溯不正常但不影响程序执行。

如果单纯是为了过越狱检测不如换个思路,找一下 jailbreak 相关的检测函数干掉。如果是为了了解这个方案,可能需要仔细分析下 #1 ~ #3 的调用。

另外__objd这个段不觉得很奇怪吗? 是很奇怪, 这个超出了我的知识范围😅…我去看看寄存器跳转,多谢提醒😁

嗯嗯,我要实践一下这个逆向流程~
#3 伪代码看不出来啥

__int64 __fastcall sub_102DF9948(__int64 a1)
{
  return (*(__int64 (__fastcall **)(_QWORD))(a1 + 32))(*(unsigned int *)(a1 + 40));
}

#4 #5 都找跳不到地址了…

sub_102DF9948明显这就就是寄存器跳转,直接看汇编代码,在BLR下断点调试器跟下

a1 可能是个 block 对象,如果是这样 a1 + 32 正好指向了它的捕获列表,a1 + 40 如果是捕获的第二个值,如果是这样外部调用应该形如:

id someVal;
void *someFunc;
[Foo bar:^ {
    someFunc(someVal);
}];

断一下 sub_102DF9948 以确认。

标准寄存器跳转,二进制混淆过吧

未必是混淆吧,看着也像C++的虚函数/函数指针,混淆一般没这么工整

可以参考openURL具体使用

NSURL *url = [NSURL URLWithString:@“weixin://”];
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
NSLog(@“success:%@”,@(success));
}];

openURL会有一个block。
如果是blr调用的,可以静态入手,openURL是系统api,在ida里看看哪段代码ldr了openURL的地址。