温馨提示:这篇文章已超过468天没有更新,请注意相关的内容是否还可用!
摘要:,,本文主要探讨Android逆向工程中的两个关键技术:过Frida检测以及SO层算法逆向。针对Frida检测,介绍如何绕过或应对这种动态代码插桩工具的检测机制,确保逆向工程的安全进行。针对SO层算法逆向,详细阐述如何通过技术手段分析并还原算法逻辑,揭示其工作原理。本文旨在为Android逆向工程师提供有效的技术手段和策略,推动相关领域的研究与发展。
0x01 Frida检测绕过
Frida是一个强大的动态代码注入工具,常用于逆向工程,但在实际应用中,由于其流行性,也遭遇了各种检测机制。
检测方式:
1、ptrace占坑、进程名检测、端口检测(这些绕过方法较为简单)。
2、D-Bus通信协议的检测。
3、maps、fd检测。
4、App中线程名的检测。
绕过方法:
直接使用hluda-server,通过修改运行端口并以spawn方式注入frida,hluda-server的好处在于其生成的so库名字去掉了frida等特征字段,可以很好地绕过maps和fd的检测。
对于可能的D-Bus通信协议检测,可以尝试hook相关的函数如strstr来查看是否含有特定的字符串或认证消息,如果App向每一个端口都发送了D-Bus认证消息,那么利用strcmp()或strstr()函数进行检测是可能的。
对于maps和fd检测,可以尝试hook open函数,过滤掉含有tmp的行,并将剩余内容输出到新的文件中,修改open的返回值指向新生成的文件。
0x02 SO层算法逆向
数据包分析
登录时,关注sign字段(看起来像散列值)和经过加密处理的password字段。
2. so算法逆向(password参数)
通过JNI机制,Java层在和so层交互时,会通过NewStringUTF函数返回加密后的数据,可以hook这个函数并输出堆栈信息。
通过分析堆栈,找到libNativeHelper.so中的函数,通过反编译找到相应的函数,分析数据流程,发现NewStringUTF的调用和一个看起来像base64编码的字符串,进一步分析发现这是一个base64编码函数,输入是16进制数据,继续向上找,找到加密函数的入口,发现输入的密码和某个16进制数据作为参数传入,猜测该函数是某种加密,进一步跟踪发现v23中的数据可能与子密钥生成有关,经过验证确实如此,最终得出结论:输入的密码经过DES/CBC模式加密后再进行base64编码得到password的值。
so算法逆向(sign参数)
同样通过hook NewStringUTF找到对应的函数位置,找到特征如MD5的初始化常量,进一步hook得到明文数据,对比数据包发现,sign的值是将多个字段拼接后进行md5散列的结果。
至此,整个逆向过程结束。
是根据您提供的内容进行的整理和格式化,希望对您有帮助!
还没有评论,来说两句吧...