对某旅行APP的检测以及参数计算分析【新手向-准备篇】

本文讲述了作者在使用Frida进行应用动态分析时遇到的问题,包括通过Socket抓包定位通信流程,使用Antiantifrida对抗反调试,以及对libmsaoaidsec.so的检测和绕过策略。同时提到了r0capture、protobuf和处理花指令等技术的运用。
摘要由CSDN通过智能技术生成

前言

本文预计共会写3到4篇文章,总结学习过程中遇到的问题与解决的思路。
涉及到的so主要有两个,一个是libmsaoaidsec.so 另一个是scmain.so
版本为今年过年期间的版本。
本篇主要会涉及到anti frida、socket抓包定位、simpxxxxxx参数的前置准备。
frida 版本: 16.1.0

一、 浅说一下抓包的问题
  • Socket
    网上烂大街的方案,因为我使用的是M2的Mac,wireshark也没有办法使用,使用了肉丝的r0capture,r0capture的功能性很强但是python运行会有一些问题,spawn启动对于目标app做了frida检测,检测放到后面说,我推荐比较省事的办法,将script.js摘出来,send改为console.log。配合frida的anti anti frida进行抓包(anti anti frida下面会说)。
  • 定位
    我们可以在r0capture中的hook java函数中加入打印调用栈的代码,我是用到了r0的打印调用栈配合jadx的搜索功能来定位的。
    在jadx中打开目标app,搜索Socket socket =


    我们推测,Socket一定是要循环来发送接收消息的,所以我们在搜索结果中优先定位在while循环中的Socket实例化的代码。有run()就优先找run函数


    小技巧:优先看参数,参数是方法的点进去看有没有关联,确认过后再看外层的方法。

    f.a()

继续深入,到一个接口类,可以用frida来查找实现类,也可以在jadx中搜索:impelements f.b
 


继续点,最后到这里
 


刚才我们说过,先看参数内容,发现第一个参数是一个函数,查看
 


到此,我们基本定位好收发包的大体流程了。下一步对GzipUtil、SecurityUtil等类进行hook就可以把参数拼接过程找到,此app还用了protobuf,不过这些都可以自行解决了。Request也可以用此方式定位的到,包括压缩、解压、异或运算等。抓包内容到此告一段落,主要就是多hook,多分析就能找到。

二、 Anti Anti Frida
  • 对于libmsaoaidsec.so最近很多人已经发了文章说了绕过的方法了。我发一个我4月份在分析这个so时候做的思维导图,并没有特别完全,但是大体检测的结构总结了出来。见附件。
    这个so在我分析的时候只在网上看到了NOP掉load此so的方式,但是并不适用于此app。主要检测了frida的各种字段,字符串等于,字符串比较等方式都有使用,还有prettyMethod检测,我曾尝试把这些检测的函数全部hook掉,可以通过检测,但是后续app会有很大几率卡住卡死,后续只能把线程函数nop掉。但是so中还有其他检测,对linker的操作动作很多,但是没有作为anti使用。猜测后续版本可能会出。
  • NOP记得区分ARM版本(现版都是ARM64)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function nop(addr) {

  Memory.patchCode(ptr(addr), 4, code => {

      const cw = new Arm64Writer(code, { pc: ptr(addr) });

      cw.putNop();

      cw.putNop();

      cw.putNop();

      cw.putNop();

      cw.flush();

  });

}

function antiPthread_create(){

  let module = Process.findModuleByName("libmsaoaidsec.so")

  nop(module.base.add(0x17FC8))

  nop(module.base.add(0x16EF4))

  nop(module.base.add(0x16A74))

}

将此代码放到r0capture的script.js中,hook init_array中以spawn启动.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

if (Process.pointerSize == 4) {

  var linker = Process.findModuleByName("linker");

else {

  var linker = Process.findModuleByName("linker64");

}

var addr_call_function = null;

var addr_g_ld_debug_verbosity = null;

var addr_async_safe_format_log = null;

if (linker) {

  var symbols = linker.enumerateSymbols();

  for (var i = 0; i < symbols.length; i++) {

    var name = symbols[i].name;

    if (name.indexOf("call_function") >= 0) {

      addr_call_function = symbols[i].address;

    }

    else if (name.indexOf("g_ld_debug_verbosity") >= 0) {

      addr_g_ld_debug_verbosity = symbols[i].address;

      ptr(addr_g_ld_debug_verbosity).writeInt(2);

    else if (name.indexOf("async_safe_format_log") >= 0 && name.indexOf('va_list') < 0) {

      addr_async_safe_format_log = symbols[i].address;

    }

  }

}

if (addr_async_safe_format_log) {

  Interceptor.attach(addr_async_safe_format_log, {

    onEnter: function (args) {

      this.log_level = args[0];

      this.tag = ptr(args[1]).readCString()

      this.fmt = ptr(args[2]).readCString()

      if (this.fmt.indexOf("c-tor") >= 0 && this.fmt.indexOf('Done') < 0) {

        this.function_type = ptr(args[3]).readCString(), // func_type

          this.so_path = ptr(args[5]).readCString();

        var strs = new Array(); //定义一数组

        strs = this.so_path.split("/"); //字符分割

        this.so_name = strs.pop();

        this.so_base_addr = Module.findBaseAddress(this.so_name);

        if (this.so_name.indexOf("libmsaoaidsec.so") != -1) {

          console.log("start hook!");

          //此处添加nop方法,后续我们对so进行frida trace也要在此处。

        }

      }

    },

    onLeave: function (retval) {

    }

  })

}

三、 simpxxxxxx的前置

IDA 7.7
Library : libscmain.so
Frida Stalker
Frida Hook Libart : hook_RegisterNatives.js
Target Parm : simpleSign

本篇文章暂时不对生成过程的细节做分析学习,先了解如何分析,怎么分析。

    1. simpleSign是一个native函数生成的,所以我们可以使用yang神的脚本确定此函数在so中的偏移地址
    1. 根据偏移,我们要使用ida pro去反汇编观察


      第一眼我们遇到了花指令,一般情况下我个人喜欢先去trace汇编指令流,再去决定怎么去花。这时就是使用stalker的时候了。具体使用方法,可以看一下yang神的帖子我是链接
      有一些花指令比如BR系列的,根据前后文即可推导出正确的跳转地址。
      再比如某音的跳转方式,与此次的app大差不差。
      因为篇幅的原因,更因为个人能力的原因,还是推荐去看一下龙哥的花指令教程,写的很详细。下面是去花后的反汇编


      frida trace的代码要记得在libscmain.so加载完成后开启,做一个计数器是最好的选择。

1

2

3

4

if(scmain_load_count > 4){

   console.log('set trace')

   ZY_trace_Stalker_begin('libscmain.so', 起始位置, 长度)

}

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
某flutter-app逆向分析是指对于一个使用flutter框架开发的应用进行逆向工程分析逆向工程是通过分析应用的代码、二进制文件等来了解其内部实现细节。 首先,我们需要获取该应用的安装包文件(APK或IPA文件),然后进行解包操作,将其转换为可读取的文件目录结构。 接下来,我们可以使用一些工具来提取应用的资源文件、代码文件等。对于flutter-app来说,可以提取出dart文件,这是flutter的主要代码文件,其中包含了应用的逻辑实现。 通过阅读dart文件,我们可以了解应用的代码结构、数据模型、界面设计等。可以分析应用的逻辑实现方法,包括各种函数、类、方法的调用关系。 同时,还可以通过分析相关配置文件、资源文件等来了解应用的各种设置、资源加载方式等。 在逆向过程中,还可以使用一些调试工具来进一步了解应用的运行机制。例如,hook工具可以拦截应用的函数调用,并捕获输入输出数据,用于进一步分析逆向分析的目的可以有很多,比如了解应用的工作原理、发现潜在的漏洞或安全问题、提供参考用于自己的开发等。 需要注意的是,逆向分析需要遵守法律规定。未经授权的逆向分析可能侵犯他人的知识产权,涉及到隐私等方面的问题。因此,在进行逆向分析之前,应该了解并遵守当地相关法律法规,避免产生法律纠纷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值