HNHuangJingYU 发表于 2023-8-1 00:36

YJ一款基于Frida的Android- SO动态库逆向命令行工具

本帖最后由 HNHuangJingYU 于 2024-1-17 23:03 编辑

## 前言

2024年 1月17日 星期三 23时00分15秒补充: 最新的源代码已经通过新仓库的形式上传,并提交了一些兼容代码,前段时间一直很忙很忙,不好意思大家

`YJ`是一款基于Frida框架的款`Native`层逆向分析的交互式工具,就像在`GUN-LINUX`上使用`GDB`工具一样,设计`YJ`的灵感来自`GNU-GDB`调试工具,它通过交互命令模式轻松地向展示你想要窥探的内存数据

`Frida`是一个底层hook工具及框架。提供了hook工具的同时也提供了大量的API操作,基于`Frida`框架的大多都是一些对`Java`代码层的一个Hook集成,而对于`Native`层方面较为全面的分析工具很零碎

## 安装

首先你得有`Frida`,我在开发和测试阶段分别采用了`frida-15.2.2`和`frida-16.0.0`,而在完成开发的阶段已经发布了`16.0.10`,最后采用`16.0.3`是出于`16.0.0`发布的`snapshots`功能,它能提高`YJ`加载到交互界面的性能,目前该功能还在测试阶段,在不久后将会发布

```bash
pip3 install frida==16.0.0
git clone https://github.com/yang-datong/YJ-3.git
```

## 使用

通过`ADB`连接上已经开启了`frida-server`的`Android`手机

```bash
cd YJ
python3 exp.py [你的目标应用名称]
```



看起来有点意思,这是一个简单的`内置shell`交互模式

> 试用了一些`python`的`内置shell`库都感觉不够轻量



`YJ`提供了一些在我用`GDB`调试时的一些常见命令,具体可以看`help`命令的输出文本,默认`YJ`启动的是`attach`模式直接附加到当前的App中:
> 可以通过`python3 exp.py --help`来查看`spawn`模式来调试目标进程,或者通过`load`来加载你的脚本(默认加载脚本为`model/main.js`)


- 如果你有明确的逆向分析函数的话你可以直接使用`breakpoint `来对目标地址下监控点(breakpoint支持对函数名、lib库名+具体偏移偏移、计算表达式下监控点,然后也可以删除当前监控点,重新监控到另一个地址)



- 如果没有明确分析具体的函数,那么可使用`watch`命令来监控具体的`lib库`内存,如下:





如果该`lib库`是个热点库,那么立马会回收到监控的内存空间具体调用信息,





找到目标地址后,`unwatch`停止内存监控,进入一下操作,通过`breakpoint `对目标地址下入监控点





当地址被执行时,那么就进入到我们的内存视图(arm64的寄存器非常多,这里一整页已经装不下了)








现在可以尽情享受了,你可以通过'print'、'hex'、'telescope'、'hexdump'等命令详细的查看指定的内存数据,比如



## 无Root

对于无root设备`frida`提供了`frida-gadget`库,之前将`gadget.so`用脚本一键注入到目标进行并使`YJ`调试上去的时候发现`apktool`重新打包的性能消耗太严重,考虑到稳定性现在只保留一键注入到`lib库`中,后续的打包以及绕过操作自行处理



通过`bash inject.sh `可以选择你的gadget执行的模式,如`监听模式`、`脚本模式`具体看https://frida.re/docs/gadget/

> 脚本模式中默认使用的脚本为`explore.js` 你可以在`main()`中定义你的规则

## 环境问题

电脑:目前只支持在`bash`、`python`环境中的机器,大众的来说`Mac OS`、`GUN-Linux`可用,`Windows`不可用(以后会考虑在powershell中实现类bash的功能)

手机:目前只支持Android

调试目标:目前只支持Android Native层调试,Java层无任何支持

## 后续

- 性能优化:会考虑热点功能函数使用全C实现
- 自定义插件入口:扩展功能编解码器中直接从内存抽帧
- 多平台支持:Windows
- 数据结构详细分析:堆链条、内核结构、更详细完整的内存信息

## 开源协议

!!!免责声明!!!

因为设计到了逆向安全领域,所以不得不慎重声明,本项目使用Apache License 2.0开源协议

1.授权使用者免费使用个人专利

2.使用者必须放置协议说明

3.使用者需要对修改部分声明

4.禁止用作者的名号进行商业广告

5.原作者不承担代码使用后风险

本项目仅作为学习使用,一切后果本人概不负责

爱飞的猫 发表于 2023-9-22 05:52

本帖最后由 爱飞的猫 于 2023-9-22 05:59 编辑

Hmily 发表于 2023-8-1 17:21
论坛只限制了最大尺寸,好像markdown的图片没有设置固定尺寸的方式。
截图应该是 200% (或更高)缩放下的截图,如果能用脚本在转换的时候处理一下就好了。即使用 `<img srcset="xxx.png 2x" >` 的写法。

Markdown 内确实没有这个支援,再加上论坛还是 Dz。也许可以扩展下渲染阶段,将文件名结尾为 `@2x.png` (包括其它后缀?)的附件图片自动将 `src` 改为带缩放信息的 `srcset`?(Dz 的图像元素下方有带原始文件名)

也可以加扩展,例如帖子顶部指定该贴所有图像的缩放值:

```text
`md:{"imgScale":"2x"}`
```

然后整个脚本读每个楼层的发帖,如果第一个元素是 `<code>` 且内容为 `md:` 开头,则进行图像缩放处理。处理完毕后删除该元素。

```js
// ==UserScript==
// @name          MD 图像缩放扩展
// @namespace    52pojie.爱飞的猫
// @version      0.1
// @description将 `src` 改为 `srcset` 并带上缩放因子。
// @author       爱飞的猫
// @match      https://www.52pojie.cn/*
// @grant      none
// @run-at       document.start
// ==/UserScript==

function main() {
const $$ = (query, root = document.body) => root.querySelectorAll(query);

for (const post of $$('')) {
    const config = {}; // 每个帖子都有自己的设定
    for (const md of $$(".parsedown-markdown", post)) {
      // 允许每一个 markdown 内容块更新扩展设定,应用到该帖当前和后续的内容。
      const configEl = md.firstElementChild?.firstElementChild; // p > code
      if (!configEl) continue;

      const configText = configEl.textContent?.trim() ?? "";
      if (configEl.tagName === "CODE" && configText.startsWith("md:{")) {
      try {
          Object.assign(config, JSON.parse(configText.slice(3)));
          configEl.remove();
      } catch (err) {
          console.error(" could not parse md-config %o: %o", configEl, err);
      }
      }

      if (typeof config.imgScale === "string" && config.imgScale.endsWith("x")) {
      // 处理图像缩放
      for (const img of $$("img", md)) {
          const imgUrl = img.getAttribute("file") ?? img.getAttribute("src");
          img.removeAttribute("src"); // none.gif 可以删了
          img.setAttribute("lazyloaded", "true"); // 防止论坛的 lazy load 干扰

          img.srcset = `${imgUrl} ${config.imgScale}`;
          img.loading = "lazy"; // 改成 lazy load
      }
      }
    }
}
}

addEventListener("DOMContentLoaded", main);
document.body && main();
```


`md:{"imgScale":"3x"}`

测试一下(3x):

![测试一下](https://attach.52pojie.cn/forum/202308/01/004416pljlc6lcciic6d5l.png)

`md:{"imgScale":"3.5x"}`

测试一下(3.5x):

![测试一下](https://attach.52pojie.cn/forum/202308/01/004416pljlc6lcciic6d5l.png)

故事散场 发表于 2023-10-12 14:04

请问大佬 提示
    process.enable_debugger()
AttributeError: 'Session' object has no attribute 'enable_debugger'
这是测试版吗?

device = frida.get_usb_device()
process = device.attach('抖音')
process.enable_debugger()

HNHuangJingYU 发表于 2023-8-1 00:51

这个图片好大啊,不知道怎么在这给它缩小显示。。。。。懂的朋友评论我再来修改。

永远的永远 发表于 2023-8-1 11:21

感谢老哥分享

Shadow1005 发表于 2023-8-1 15:09

謝謝分享

GaryZong 发表于 2023-8-1 15:09

謝謝分享

xixicoco 发表于 2023-8-1 15:38

很牛的工具啊,感谢lz原创

Hmily 发表于 2023-8-1 17:21

HNHuangJingYU 发表于 2023-8-1 00:51
这个图片好大啊,不知道怎么在这给它缩小显示。。。。。懂的朋友评论我再来修改。

论坛只限制了最大尺寸,好像markdown的图片没有设置固定尺寸的方式。

zbx91 发表于 2023-8-1 20:05

本帖最后由 zbx91 于 2023-8-1 20:07 编辑

楼主的库源码分享不全面,很多内容没有。

zbx91 发表于 2023-8-1 20:27

不知道,你能坚持多久??

阿清 发表于 2023-8-1 21:11

支持手游不
页: [1] 2 3 4
查看完整版本: YJ一款基于Frida的Android- SO动态库逆向命令行工具