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

非常感谢。看了看ollvm的几个目标,确实有控制流相关的,我先看看。另外google「IDA cfg 指令简化」这组没搜到什么,能再给个关键字吗?

具体……下面是一个随便抽出来的函数,反编译后:


这1.8M二进制里至少有95%都是这个函数的同形异位体。前后各有几个for循环做计算(兼混淆),中间是根据条件跳转两个子程序之一;这两个子程序多半也是同形式的,只是跳转位置在不断变化。

https://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html

原来上文的CFG是控制流图……谢谢,我看看找找思路。
另外问下,IDA里这种没有自动识别为代码段的整段有没有什么办法强制它再自动分析一次,至少把函数块都解析出来?一个个手动C再P,手都快断了也没符号化1/100,估计不完整解析成函数也没法开始下一步符号执行;或者有哪本书有讲这种操作的(感觉应该很基本,但看了看权威指南没找到)能推荐下吗。

1 个赞

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

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

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

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

QQ20180301-011740

1 个赞

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

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

2 个赞

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

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

1 个赞

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

3 个赞

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

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

相问一下您最后成功的方法,最后是通过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的吧。

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

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

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

谢谢 我试一下

好的好的。nop的话lldb确实能多一会,最后也会挂。你是准备非越狱hook吗,我上传了最新版本的砸壳日服链接: 百度网盘-链接不存在 密码: 49aq

很有意思,mark一下,

我就不费劲去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只有这一个方法,因此丧失参照物,压根找不到,跳过;资源下载完成后成功进入游戏。至初始十连完成未发现问题。
——看来这个混淆工具链有通配符支持,把并没有必要的部分也加入了混淆。

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

1 个赞