请教iOS app检测attached dylib的其他方法


#1

在试图干掉一个unity游戏的越狱检测,文件系统方面感觉挡得差不多了(hook掉了_opendir2/scandir/readaddr/open/popen/fopen/access/stat/fstat/lstat/statfs),因为从行为上看app还在读取attached dylib,于是又加上了dladdr和_dyld_get_image_name的hook;但之后从log看app现在还是能获得我的tweak的名字(在试图scandir 我的tweak.plist)。请问除了上面这两个调用,是否还有什么别的方法能获得attached dylib列表?


#2

既然有日志, 那不是很好找到下手的地方?


#3

我的意思是那是hook后的函数打印的日志……只能看到宿主已经在readdir(诶,问题里写错了,好像不能改了),前面的log都与此不相干,不知道它前面做了什么才会知道要readdir这个,所以才推测它是获得了attached dylib列表然后直接用这个扫描的;现在问题就是我只知道前文提到的两个获取dylib列表的路径,不知道是否还有其他的需要去堵。


#4

看到readdir了就在这里下断点栈回溯啊


#5

_dyld_get_image_header ?


#6

可以问下对这种启动就检测,发现越狱就直接崩溃的app怎么下断点吗?


#7

直接断在入口点单步啊


#8

问题是断不住。说一下我的步骤吧:
大略流程是按照http://iosre.com/t/debugserver-lldb-gdb/65走的
iOS端./debugserver *:1234 executable地址(因为启动起来就死,没法-a attach,只能靠它启动)
OSX端启动lldb
(lldb) process connect connect://IP:1234
Process 12869 stopped

  • thread #1, stop reason = signal SIGSTOP
    frame #0: 0x000000010256d000
    -> 0x10256d000: mov x28, sp
    0x10256d004: and sp, x28, #0xfffffffffffffff0
    0x10256d008: mov x0, #0x0
    0x10256d00c: mov x1, #0x0
    Process 12869 exited with status = 45 (0x0000002d)
    (lldb) image list
    error: the target has no associated executable images
    (lldb) b readdir
    Breakpoint 1: no locations (pending).
    WARNING: Unable to resolve breakpoint to any actual locations.
    (lldb) b readdir
    …此处能看到大堆我hook的log…
    Process 12869 exited with status = 45 (0x0000002d)
    请指教下应该怎么改动才能断上吧,谢谢

#9

ptrace


#10

更新一下进度:
1,无法调试的问题最后发现是没有砸壳导致的。
2,ptrace通过直接编辑砸壳后的二进制nop掉所有svc 0x80解决了。
3,现在卡在断到dyld以后无法进入本程序的entry point。原教程看了看大概ni 20多次就切换进程空间了,但我试验时按了几千下都没走出去dyld::main。而这个程序对入口藏的很好,b main只能断进[NSThread main],压根不在本进程空间;br s -a 基地址+LC_MAIN地址的方法则只能在本进程空间使用。——按pediy的帖子patch了lldb 310/随后切到lldb 4.0.1,现在可以了。
4,这个app最后并不是崩溃而是启动邮件;断openURL已经断到,从这里逆向进了一个好几十层的调用(最后是启动了一个线程在线程里不知做了什么判断,没越狱就继续有越狱就跳邮件;线程本身不能不创建否则永远等死在那,线程创建后直接返回则会死在pthread_body里),几十层调用都在同一个段,整个段足有20M,伪装成了physx sdk而且全是花指令(包括创建的线程本身的代码),一筹莫展中,准备回头看arm64指令集去了。
这两周从这个论坛真是学了不少东西(包括各位大牛的提点,经常一句话就能解决求索许久的问题——前提是经过学习已经理解了这句话需要的前置知识),不过回头看看一开始提的问题压根没意义(精确断到之后发现那个log的执行远在start之前,应该是dyld被hook到后的log……),继续努力吧,反正也只是我个人的需求,没啥时间压力。


#11

Good Lord
你在逆什么玩意


#12

一个反越狱比较极端的游戏。。。bundle id rot47后是4@>]2?:A=6I]72E68C2?5@C56C]6?
另外上面那个大段长度又写错了,1.8M,虽然就我现在的arm汇编水平区别不大。。。


#13

有二进制么


#14

没有,直接https://rot47.net粘贴解码就行。


#15

我的意思是app本身的二进制。或者叫binary/MachO


#16

没反应过来- -上传到 http://www.mediafire.com/file/s0u0k29q5hadu4r/dec.7z 了。


#17

启动邮件?日本的废狗吗,楼主有进度了么


#18

没有了,最后的进度就是上面的,现在手上已经没有越狱机器无法继续了。对那个混淆段后来的分析,之前认为是花指令,这个有误,定长指令集上干扰反编译器没意义;这是一种在编译结果中大量塞进垃圾反复跳转的混淆手法——对这块不熟悉不清楚应该叫什么——但那1.8M里真正有意义的代码应该不超过20K,只是被稀释得极其分散,举例:我找到的开检测线程代码在第二十多层,它返回后的第一句实际处理则在返回十几层后又进去十几层的代码里,第二句我就没找到——搞的我头昏脑胀,不得不退出。后续工作我猜需要一个能机械化执行arm代码,智能干掉垃圾代码并把真正的工作流显现出来的工具,从这个意义上这个手法又跟虚拟机有点像。


#19

详细描述一下?


#20

感觉是某种ollvm的变种。思路的话先ida里基于cfg去做指令简化。Google一下有一些相关的文章