关于安全:借你一双慧眼-Frida-Native-Trace

8次阅读

共计 2651 个字符,预计需要花费 7 分钟才能阅读完成。

一、指标

李老板:奋飞呀,最近没怎么更新呀?

奋飞:最近的 KPI 定的合不合理你心里没点 AC 数?我当初内卷到周三就开始写周报了,不然被新来的就给卷就业了。

遐想在古典 PC 互联网时代,咱也是 OD、IDA 玩的很溜的。

一日饮酒乐甚,突发奇想,IDA 辨认出所有函数,而后导出来给 OD,给这些函数下断点,触发之后先打日志,再主动勾销断点。这样程序运行的流程不就进去了?

理论跑起来发现,有些函数会频繁被调用,这样导致程序容易假死或者解体,所以还须要有个不便的过滤措施,过滤掉频繁调用的函数。

搞出了 PEStalker 之后,程序的运行流程就无所遁形了。

不过时代变了,挪动互联网时代的 AppStalker 怎么搞?

二、步骤

frida-trace

大胡子其实和咱们想到一块去了,他搞了个 frida-trace, 能够一次性监控一堆函数地址。

而后还能打印出比拟丑陋的树状图,不仅能够显示调用流程,还能显示调用档次。并且贴心的把不同线程调用后果用不同的色彩辨别开了。

当初就缺个数据源,把 IDA 的辨认后果导出来了。

trace_natives

https://github.com/Pr0214/trace_natives 是的,大佬曾经写好了,咱们又能够白嫖了。

跑起来

  • 下载 traceNatives.py 放到 ida 的 plugins 门路下,我是 mac 放在了 /Applications/IDA Pro 7.0/idabin/plugins 目录
  • Pr0214 可能用的是 IDA 7.x+ 和 python 3.x 的环境,在我的 IDA7.0 和 python2 下须要微调下代码
# search_result = [f"-a'{so_name}!{offset}'" for offset in search_result]
search_result = ["-a'{}!{}'".format(so_name,offset) for offset in search_result]

# with open(save_path, "w", encoding="utf-8")as F:
with open(save_path, "w")as F:

# print(f"frida-trace -UF -O {save_path}")
print("frida-trace -UF -O {} !".format(save_path))
  • IDA 关上之前 http://91fans.com.cn/post/ldqsignone/ 里的 libxxbitmapkit.so,Edit -> Plugins -> traceNatives。而后在剖析目录上面会生成 libxxbitmapkit_16250177xx.txt 这就是 frida-trace 要导入的数据了
  • 先把某电商程序的 App 跑起来,而后命令
frida-trace -UF -O /Users/fenfei/Desktop/xx/armeabi-v7a_9_4_6/libjdbitmapkit_1625017920.txt

跑起来即可,请留神 这里不要呈现中文门路,可能我的 frida-trace 是在 python2.7 下跑的,呈现中文门路就会载入失败。

最初 轻易点个商品详情页

后果还是很漂亮的。

加强一下

李老板:Android 的 so Trace 没问题,ios 的 App 咋不行?

奋飞:RTFS

Android so 的代码段 name 是 .text,ios 的代码段 name 是 __text , 所以咱们在 getSegAddr 里加个判断

...
if (idc.get_segm_name(seg)).lower() == '.text' or (idc.get_segm_name(seg)).lower() == 'text' or (idc.get_segm_name(seg)).lower() == '__text' :
...

李老板:吾有一函数,第一个入参必然是 2,然而不晓得是哪个?能够 Trace 进去吗?

奋飞:……&*%¥%……)(%$

咱们能够批改 __handlers__/libxxbitmapkit.so/xxx.js 上面的脚本来实现一些特地的操作,比方在 Trace 的时候把第一个参数是 2 的函数挑出来。

  onEnter(log, args, state) {log('sub_10d71()');
  },

// 改成

  onEnter(log, args, state) {if(args[0] == 2){log("======== I am here! ========");
    }
    log('sub_10d71()');
  },

当然成千上万个函数,手工去改,李老板会笑话我很二的。


def alter(file,old_str,new_str):
    """
    替换文件中的字符串
    :param file: 文件名
    :param old_str: 就字符串
    :param new_str: 新字符串
    :return:
    
    """file_data =""
    with open(file, "r", encoding="utf-8") as f:
        for line in f:
            if old_str in line:
                line = line.replace(old_str,new_str)
            file_data += line
    with open(file,"w",encoding="utf-8") as f:
        f.write(file_data)

def findAllFile(base):
    for root, ds, fs in os.walk(base):
        for f in fs:
            yield f

def main():
    strPath = '/Users/fenfei/Desktop/work/blogCode/trace/__handlers__/libxxbitmapkit.so'
    
    for i in findAllFile(strPath):
        print(i)
        alter(strPath +"/" + i, "onEnter(log, args, state) {", 'onEnter(log, args, state) {if(args[0] == 2){log(" ======== I am here! ========");}')

人生苦短,快用 Python。出工。

三、总结

和 PEStalker 的遇到的问题是一样的,hook 的函数太多,App 很容易解体,必须有个不便的过滤措施,把一些频繁调用的,不重要的函数过滤掉。这个还没想好怎么搞。

大胡子还有个玩具叫 https://github.com/oleavr/art-tracer 据说比拟牛叉,能够钻研下。

不说了,写周报去了。

我生平开车最恨两种人,一种是随便加塞的,另一种是不让我加塞的。[吃瓜]

正文完
 0