一例简单的frida反调试绕过

简介: 一例简单的frida反调试绕过

前言


最近在分析一款app时遇见了frida反调试,花了时间简单学习了一下,有不少收获,记录下学习的过程。


抛出问题


frida是一个很强大的hook框架,用的人多了,自然而然就出现了很多检测方案,这次碰到的app就检测了frida,可以正常打开,但是当你用frida -f启动或者attach进程,不久后就会闪退。  


常见frida检测


1.检测frida-server文件名  

2.检测27042默认端口  

3.检测D-Bus  

4.检测/proc/pid/maps映射文件  

5.检测/proc/pid/tast/tid/stat或/proc/pid/tast/tid/status    

6.双进程保护  


前两种可以通过修改frida-server文件名,改默认端口绕过。双进程可以通过-f spawn模式启动绕过。其他的需要去hook修改。  


定位


先针对简单的几个可能检测的方式,我修改了文件名,改了端口,也尝试了spawn启动,均会在启动后不久闪退。  

这时考虑到其他几种检测。  

首先用frida去看看载入了哪些so,看看是哪里检测了,看了个寂寞。  


  function fridaProcess(){
      Java.perform(function () {
        var enumMoudle = Process.enumerateModules();
        for (var i = 0; i < enumMoudle.length; i++){
          console.log("", enumMoudle[i].name)
        }
      });
    }
  setImmediate(fridaProcess,0)

739e14ae20913b7f5907903a0e5927a2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


因为so载入的时候,底层最后open去打开的。  

所以再用frida去hook应用中的open函数,看看读取了哪些so或者文件,可以看到最后断在了/proc/self/maps。  


var pth = Module.findExportByName(null,"open");
    Interceptor.attach(ptr(pth),{
        onEnter:function(args){
            this.filename = args[0];
            console.log("",this.filename.readCString())
            if (this.filename.readCString().indexOf(".so") != -1){
                args[0] = ptr(0)
            }
        },onLeave:function(retval){
            return retval;
        }
    })

adace110ab28099147c25a23d61ac94f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png



稍稍深入


这里当挂上frida后对应的maps文件中会出现re.frida.server之类的特征,这是在使用frida server的时候自动创建的,其中存放着frida的功能模块,可以在载入so的hook脚本输出中能看到最后也是断在frida-agent.so。  


ab53532a61dd6a613731405124d0caab_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


这里要绕过这个检测,我是通过备份一个正常启动时的maps文件(这里前面也讲到app不使用frida是能正常启动不闪退的)。


function main() {
  const openPtr = Module.getExportByName('libc.so', 'open');
  const open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
  var readPtr = Module.findExportByName("libc.so", "read");
  var read = new NativeFunction(readPtr, 'int', ['int', 'pointer', "int"]);
  var fakePath = "/data/data/com.app/maps";
  var file = new File(fakePath, "w");
  var buffer = Memory.alloc(512);
  Interceptor.replace(openPtr, new NativeCallback(function (pathnameptr, flag) {
      var pathname = Memory.readUtf8String(pathnameptr);
      var realFd = open(pathnameptr, flag);
      if (pathname.indexOf("maps") >= 0) {
          while (parseInt(read(realFd, buffer, 512)) !== 0) {
              var oneLine = Memory.readCString(buffer);
              if (oneLine.indexOf("tmp") === -1) {
                  file.write(oneLine);
              }
          }
          var filename = Memory.allocUtf8String(fakePath);
          return open(filename, flag);
      }
      var fd = open(pathnameptr, flag);
      return fd;
  }, 'int', ['pointer', 'int']));
}
setImmediate(main)

7c17bae9133355b9d9886cc616ced948_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


然后就可以继续调试了。


总结


这只是一个简单的例子,但是确实在这个bypass的过程中学到了东西,只要花时间是去分析,总能找到对应的突破口。  


相关文章
|
安全 Windows
4.4 x64dbg 绕过反调试保护机制
在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对其进行软件逆向与漏洞分析,我们以第一种`IsDebuggerPresent`反调试为例,该函数用于检查当前程序是否在调试器的环境下运行。函数返回一个布尔值,如果当前程序正在被调试,则返回True,否则返回False。函数通过检查特定的内存地址来判断是否有调试器在运行。具体来说,该函数检查了`PEB(进程环境块)`数据结构中的`_PEB_LDR_DATA`字段,该字段标识当前程序是否处于调试状态。如果该字段的值为1,则表示当前程序正在被调试,否则表示当前程序没有被调试。
332 0
4.4 x64dbg 绕过反调试保护机制
|
安全 Windows
【工具分享】免杀360&火绒的shellcode加载器
【工具分享】免杀360&火绒的shellcode加载器
387 0
|
安全 网络安全 数据安全/隐私保护
Invoke-Obfuscation混淆免杀过360和火绒(上)
Invoke-Obfuscation混淆免杀过360和火绒
209 0
|
Windows
Invoke-Obfuscation混淆免杀过360和火绒(下)
Invoke-Obfuscation混淆免杀过360和火绒
163 0
|
小程序 JavaScript 安全
小程序逆向分析 (一)
小程序逆向分析 (一)
小程序逆向分析 (一)
|
IDE API 开发工具
AirtestIDE有哪些好用但是非常隐蔽的小功能?
AirtestIDE有哪些好用但是非常隐蔽的小功能?
329 0
|
安全 Linux 测试技术
Metasploit 实现木马生成、捆绑及免杀
在渗透测试的过程中,避免不了使用到社会工程学的方式来诱骗对方运行我们的木马或者点击我们准备好的恶意链接。木马的捆绑在社会工程学中是我们经常使用的手段,而为了躲避杀毒软件的查杀,我们又不得不对木马进行免杀处理。本次实验我们将学习如何通过Metasploit的msfvenom命令来生成木马、捆绑木马以及对木马进行免杀处理。木马文件风险高,想要免杀需要用shellter工具捆绑下,但是处理后木马文件还是能被360检测到拦截下来。
|
安全 前端开发 JavaScript
Frida:一款可以绕过越狱检测的工具
本文讲的是Frida:一款可以绕过越狱检测的工具,Frida——移动应用程序进行安全分析的主要工具,即使你从未使用过Frida,读完这篇文章,你也将对它有充分的了解。
3899 0
|
监控 测试技术
如何利用sdclt.exe绕过UAC?
本文讲的是如何利用sdclt.exe绕过UAC?,Matt Nelson‏ @enigma0x3在最近的文章中公开了一个绕过Win10 UAC的技巧,通过修改HKCU下的注册表键值实现对UAC的绕过
2073 0
|
安全 rax 前端开发
HEVD 内核攻击: 编写Shellcode(三)
本文讲的是HEVD 内核攻击: 编写Shellcode(三),在上一篇文章中,我们已经能以可控的方式使用内核了。但是,当创建Windows内核漏洞利用时,目标通常都是希望以某种方式获得更高的权限,通常是SYSTEM权限。这时我们就必须用到内核有效载荷。
1724 0