使用 frida 绕过 Flutter 应用的 Sslpinning 中的空地址

Posted

技术标签:

【中文标题】使用 frida 绕过 Flutter 应用的 Sslpinning 中的空地址【英文标题】:Null address in Sslpinning bypass of flutter app by using frida 【发布时间】:2021-10-17 16:31:33 【问题描述】:

我正在使用this 和this 方法在genymotion x86 上测试一个flutter android 应用程序以绕过sslpinning,但是在运行Frida 时我的函数地址返回null。

首先,Ghidra 找到了函数的地址,即 (0x773c52),这里是该函数早期行的字节: (\x55\x41\x57\x41\x56\x41\x55\x41 \x54\x53\x48\x81\xec\xf8\x00\x00\x00\xc6) 然后地址的正确偏移量被binwalk找到了:

C:\ >python binwalk -R " \x55\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xec\xf8\x00\x00\x00\xc6" <app_path>\lib\x86_64\libflutter.so

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
6761554       0x672C52        Raw signature (\x55\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xec\xf8\x00\x00\x00\xc6)

接下来我在 Frida 代码中使用了这个地址,如下所示:

function disablePinning()
    var address = Module.findBaseAddress('lib/x86_64/libflutter.so').add(0x673c52)
    hook_ssl_verify_result(address);

setTimeout(disablePinning, 10000)

最后,当我运行 Frida 脚本时,我遇到了空地址异常。

TypeError: 在 disablePinning 时无法读取 null 的属性“添加” (/hook_ssl.js:20) 在 (frida/runtime/core.js:45) 处应用(原生)

null address error in frida

我还尝试了许多不同版本的 Frida。有人知道为什么会这样吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您的代码的问题是您将模块名称与文件名混淆了。

var address = Module.findBaseAddress('lib/x86_64/libflutter.so') 返回 null,因为您指定的模块名称错误,因此未找到该模块。

如果你执行下面的代码 sn-p 你会看到模块名称从来没有用路径表示。模块名称是库的内部名称,通常与文件名相同(但据我所知可以不同)。

Process.enumerateModules(
        onMatch: function(module)
            console.log('Module name: ' + module.name + " - Base Address: " + module.base.toString());
        , 
        onComplete: function()
    );

常规 Android 应用的代码 sn-p 的示例输出:

Module name: app_process64 - Base Address: 0x763b8e3000
Module name: libandroid_runtime.so - Base Address: 0x7637b04000
Module name: libbinder.so - Base Address: 0x763a365000
Module name: libcutils.so - Base Address: 0x763a7df000
Module name: libdl.so - Base Address: 0x763a20d000
Module name: libhwbinder.so - Base Address: 0x7637183000
Module name: liblog.so - Base Address: 0x763a9dd000
Module name: libnativeloader.so - Base Address: 0x7639fcc000
Module name: libutils.so - Base Address: 0x7636f92000
Module name: libwilhelm.so - Base Address: 0x7637e86000
Module name: libc++.so - Base Address: 0x7639bdb000
Module name: libc.so - Base Address: 0x7638d5e000
...

考虑到这一点,如果您使用不带路径名的 'libflutter.so',您的代码应该可以工作。如果仍然无法正常工作,请使用提供的代码 sn-p 获取应用程序的模块列表,并确定 Flutter 库的正确模块名称。

function disablePinning()
    var address = Module.findBaseAddress('libflutter.so').add(0x673c52)
    hook_ssl_verify_result(address);

【讨论】:

感谢您的回复,起初我尝试了“libflutter.so”,但是当出现空错误时,我将其更改为路径。无论如何,通过运行您的代码,输出中没有名为 libflutter.so 的模块。如何获取与flutter库相关的? @MaedeHojjati 你检查过包含libflutter.so 的APK 文件吗?如果它包含在 APK 中,则可能是在您执行挂钩代码时它尚未加载。我没有太多 Flutter 经验,但考虑到 this issue,似乎 libflutter 是在运行时由 Java 代码加载的。我建议使用Jadx反编译Java部分,并hook加载库的方法,这样可以在加载完库后直接hook方法,也可以直接hook System.loadLibray方法。 在 Flutter 中完全创建的应用程序通常会在启动时加载库,使用的超时时间 10 000 应该足够了。但是,完全可以将 Flutter 与其他框架(或本机代码)结合使用,并且 Flutter 功能可能仅在触发特定功能后才会加载。尝试将钩子与 System.loadLibrary 钩子结合使用。可以找到一个例子here (scroll down) @Robert 是的,libflutter.so 存在于 APK 文件中。我还通过Process.findModuleByName("libflutter.so") 检查应用程序并返回null!其他 Flutter 应用程序也是如此(没有名为 libflutter.so 的模块)。有没有可能是因为我的处理器(我的意思是 x86)!? @MaedeHojjati 你还在使用 Genymotion 模拟器吗?有些人在使用带有 x86 映像和 ARM 应用程序的 Android 模拟器时遇到此问题(最新的 Android 模拟器具有 ARM 到 x86 的转换层)。在这样的模拟器上也找不到模块,我们认为这是因为翻译层。 Frida 的 Android x86 引擎中是否存在一般性错误?

以上是关于使用 frida 绕过 Flutter 应用的 Sslpinning 中的空地址的主要内容,如果未能解决你的问题,请参考以下文章

Android安卓应用渗透Hook:使用frida进行绕过和解密

iOS安全攻防之使用 Frida 绕过越狱设备检测

如何修复错误:frida 上的 java.lang.ClassNotFoundException

Flutter:local_auth 可以通过按返回键绕过

使用Frida攻击安卓应用程序

在 Flutter 中使用 Bloc/Cubit 时绕过 CONTEXT