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


#24

这你需要咨询@Ouroboros
我们穷人是用不起IDA的


#25

。。。您开玩笑真有水准。我才是用不起的好吧- - 回头看看能否用脚本跑吧。


#26

我跳过fgo日服的整套检测了 越狱、改执行文件、用插件都不会有影响
eternallinkage这个游戏也买的相同的加固方案

如果你不深究它的运作原理,可以手动加载Unity引擎的初始化函数,并关注下面几个不应该在objd段的正常函数,找到他们的原身然后hook掉。

QQ20180301-011740


#27

顺便 这是我自己写的脚本你存成py,然后用ida加载。
用命令tst(0x100000,0x200000)就可以解析这个范围内的未解析代码。
(要是没有显示缩进你可能要自己缩进一下

def tst(staadd,end):
while(staadd<end):
idc.MakeFunction(staadd,end=ida_idaapi.BADADDR)
staadd=staadd+2


#28

前几天没找到时间上来,厉害啊,终于有人突破了。谢谢提供的脚本。
这几个函数我一直觉得不该在那个段,原来IDA直接分析出来的符号是烟雾弹啊- -能问下「手动加载Unity引擎的初始化函数」具体是什么操作,应该在哪个阶段执行吗?另外寻找原身用什么思路?


#29

函数的上下关系或者特征 比如上面这个就是touchesbegan。很幸运的是他都附加在oc的类上,后来我遇到几个游戏附加在了mod_init_func上,这基本上找不到原身了.
unity无所谓不用管了


#30

感谢大牛。
感觉基本拼出它这个方案的原理了。链接后对可执行文件进行后处理,根据配置静态hook特定method;hook后的代码段里加入了各种动态的越狱检测;hook代码进行了控制流混淆,同时抗静态和动态分析,把原method的地址藏得无法简单找到;但因为原始二进制还是clang编译的,被夺走链接的原代码段实际位置还在老地方,可以用就近原则找到再直接在objc_const段里替换回来。至于在mod_init_func上的,估计是后期改进版,可能是做了混淆编译器专门来解决上面这个问题,但可能有性能损失,对性能要求高的没法上。


#32

都搞编译器了整个需求都可以完全在LLVM里做了不需要这么麻烦。根本搞不懂日厂的这个路数


#33

您好,我其实一直也在研究这个的,我是jp版本不是en,看到你的帖子,我也跟着尝试,我想问一下您一开始把svc 0x80 nop掉是用什么工具,我用了IDA加插件Keypatch改了砸壳后的二进制,发现它报另外的错误了,应该是检测完整性了?您在objc_const段里替换回来原身能正常运行吗?我注意到这些做法都是要直接修改二进制的。


#34

相问一下您最后成功的方法,最后是通过hook这个touchesEnded函数,然后在hook里面用dyld获取原来的subroutine地址运行,比如直接调用sub_10019c84就可以跳过那些检测代码吗,最后的做法需要修改二进制吗?另外它的那些混淆代码您最后研究了吗?

因为我其实ios11在electra beta版本中发现能正常运行,所以我推测出日服其实它还是判断文件存在的方式来判断的。那时electra测试版本把越狱bootstrap放到一个单独的文件夹中。后来我通过黑盒测试的方法,把越狱文件夹的目录一个一个文件的touch来判断它检测哪些,最后确实成功了,那些文件夹主要影响cydia的运行。所以我的运行方法是写了个shell,运行前改这些文件夹的名字,运行后再改回来。但我不知道它通过什么函数检测的,以前 https://github.com/akusio/cp-c 这个插件是hook readdir和_opendir2来规避检测,后来版本更新后失效了,所以我想了解下您最终成功的做法,因为每个版本地址不一样我想是没有通用的tweak的吧。


#35

关于这个问题 你是怎么解决的 可以回复我一下吗?
下面是我的帖子链接:http://bbs.iosre.com/t/x-dyld-module/11257


#36

如上,因为误操作,去年年底以后我就没有越狱机器了,后面主要是给大家喊666。nop掉svc 0x80是直接修改砸壳后的二进制(参看张总之前关于反反调试的帖子,整个text段只有一个),这步我没找到动态修改的方法。记得砸壳后挂debugserver,nop前压根连邮件都弹不了会直接崩掉,nop后可以弹邮件,错误码忘了是什么了。另外注意这个只是用作反反调试的,如果不需要动态调试(事后证明基本没用,控制流乱成这样上动态调试人脑也handle不过来),压根不必要做这步。再往后的就没有实际验证,因为没有办法获得砸壳后的二进制。可能的话,希望你能上传一个最新版砸壳后的二进制,我来试试实践下对@xxzzddxzd 大牛方法的理解是否正确。


#37

我当时的经验就是这几步:砸壳,重签(注意加get-task-allow),手动nop掉任何svc 0x80。其他的就帮不上了,可能你还得对具体程序做具体分析。


#38

谢谢 我试一下


#39

好的好的。nop的话lldb确实能多一会,最后也会挂。你是准备非越狱hook吗,我上传了最新版本的砸壳日服链接: https://pan.baidu.com/s/1rJ4PtfvFAEhWhi8FlnIQhQ 密码: 49aq


#40

很有意思,mark一下,


#41

我就不费劲去hook了,按上文的理解反正每个版本都要重新找特征来patch,没有通用的方法。
记录:(iPad Air,iOS 11.2.6)
1,直接重签名安装运行,errorcode 82
——估计这就是自校验失败的错误码。
2,按如上方法找-[UnityAppController application:didFinishLaunchingWithOptions:]原身,在objc_const里替换;重签名安装,运行成功;随后卡死在资源下载(忘记开vpn了),点击重试,跳出82
——证明思路理解正确,所有检测包括自校验都是hook函数里的,只要直接替换回去就完了,不需要做任何其他的anti-anti。
3,开vpn,按如上办法继续替换剩余4个touchesBegan;比之前大牛提到的多一个,应该是版本更新后增加的;这个interface只有这一个方法,因此丧失参照物,压根找不到,跳过;资源下载完成后成功进入游戏。至初始十连完成未发现问题。
——看来这个混淆工具链有通配符支持,把并没有必要的部分也加入了混淆。

补充:不过这个测试我并没有越狱环境去执行,所以不能排除替换回去的正常工作流里还是有越狱检测的可能性。


#43

方便给出下改名列表吗?我之前hook了比cp-c最终版多几倍的文件系统相关API也没找到到底用什么探测的和探测的什么文件orz
我修改的方式就是直接手改。反汇编找到原身位置后,用二进制编辑工具hexedit直接替换。
免歧义起见给出你上传这个版本的具体修改(经不断试探,已缩减至如下两组,按顺序分别对应-[UnityView touchesBegan: withEvent:]和-[UnityAppController application:didFinishLaunchingWithOptions:]):
— a
+++ b
@@ -2318933,7 +2318933,7 @@
02362540: 108d 0100 0100 0000 1f53 f501 0100 0000 …S…
02362550: b72d f601 0100 0000 588e 0100 0100 0000 .-…X…
02362560: ba63 f501 0100 0000 922b f601 0100 0000 .c…+…
-02362570: acba 1202 0100 0000 8b6a f501 0100 0000 …j…
+02362570: fc91 0100 0100 0000 8b6a f501 0100 0000 …j…
02362580: 922b f601 0100 0000 4492 0100 0100 0000 .+…D…
02362590: a36a f501 0100 0000 922b f601 0100 0000 .j…+…
023625a0: 8c92 0100 0100 0000 bf6a f501 0100 0000 …j…
@@ -2319029,7 +2319029,7 @@
02362b40: 9c9d 0100 0100 0000 9f73 f501 0100 0000 …s…
02362b50: 692d f601 0100 0000 8c9f 0100 0100 0000 i-…
02362b60: cb73 f501 0100 0000 692d f601 0100 0000 .s…i-…
-02362b70: 88ba 1202 0100 0000 5279 f501 0100 0000 …Ry…
+02362b70: 949f 0100 0100 0000 5279 f501 0100 0000 …Ry…
02362b80: c12c f601 0100 0000 10a3 0100 0100 0000 .,…
02362b90: 7179 f501 0100 0000 c12c f601 0100 0000 qy…,…
02362ba0: 1ca3 0100 0100 0000 f673 f501 0100 0000 …s…

此外有个问题希望测下:通过文件系统改名(不做上面的逆hook)跑起来之后,如果改名回去,再随便点击一下,该app会立刻崩溃还是等到下次启动才发觉异常?


#44

(post withdrawn by author, will be automatically deleted in 24 hours unless flagged)


#46

等你有越狱设备估计后面才能进一步尝试了,我猜这些文件夹路径是加密在那段混淆代码里的,很奇怪,盐哥哥只要检测cydiasubstrate那个关键的文件就可以废掉不少dylib,另外它明明能够检测attached dylib确,还是根据路径判断,不知道是什么操作