服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Frida-server运行报错问题的解决

日期: 来源:看雪学苑收集编辑:madsu

本文为看雪论坛优秀文章
看雪论坛作者ID:madsu

刚刚开始学Android逆向,发现Frida是个好东西,于是赶紧下载研究一番。
下载源码编译,切换到最新版16.0.11, 编译之前注意先更新nodejs。

wget -qO- https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

然后执行:

make core-android-arm64
make tools-linux-x86_64 PYTHON=$HOME/miniconda3/bin/python

就可以成功生成frida-server以及frida相关tools,于是push到手机上执行。

redfin:/data/local/tmp # ./frida-server
{"type":"error","description":"Error: Java API not available","stack":"Error: Java API not available\n at _checkAvailable (frida/node_modules/frida-java-bridge/index.js:298:1)\n at _.perform (frida/node_modules/frida-java-bridge/index.js:203:1)\n at /internal-agent.js:490:6","fileName":"frida/node_modules/frida-java-bridge/index.js","lineNumber":298,"columnNumber":1}

报错了,继续往下试试。
 
把手机上的名为com.example.myapplication的demo app放到前台,然后注入一个helloword级别的js。

setTimeout(
function() {
Java.perform(function() {
console.log("Hello frida!")
})
}
)

//test.js

然后执行:

(base) /data/code/OpenSource/crack/frida/build/frida-linux-x86_64/bin (16.0.11 ✔) ./frida -U -l ../../../../frida_script/test.js com.example.myapplication
____
/ _ | Frida 16.0.11 - A world-class dynamic instrumentation toolkit
| (_| |
> _ | Commands:
/_/ |_| help -> Displays the help system
. . . . object? -> Display information about 'object'
. . . . exit/quit -> Exit
. . . .
. . . . More info at https://frida.re/docs/home/
. . . .
. . . . Connected to AOSP on redfin (id=0A051FDD4003BW)
Failed to spawn: cannot read properties of undefined (reading 'getRunningAppProcesses')

咳,出师不利,不过反正我也是做c++开发的,虽然不懂javascript, 连蒙带猜也能看个差不多,那就研究研究报错原因吧。
 
从现有信息来看,第一怀疑对象应该是那个报错"Error: Java API not available", 也指明了报错位置at _checkAvailable (frida/nodemodules/frida-java-bridge/index.js:298:1) at.perform (frida/node_modules/frida-java-bridge/index.js:203:1)\n ,那就在源码里搜索下。

发现这个index.js位于build/tmp-android-arm64/frida-gum/bindings/gumjs/node_modules/frida-java-bridge目录。然后看下perform实现:

perform (fn) {
this._checkAvailable();

if (!this._isAppProcess() || this.classFactory.loader !== null) {
try {
this.vm.perform(fn);
} catch (e) {
Script.nextTick(() => { throw e; });
}
} else {
this._pendingVmOps.push(fn);
if (this._pendingVmOps.length === 1) {
this._performPendingVmOpsWhenReady();
}
}
}

这个函数第一行就是_checkAvailable,跟进去看看。

_checkAvailable () {
if (!this.available) {
throw new Error('Java API not available');
}
}

果然报错就是在这里,那么关键的判断就是available了,再跳过去看看。
  

get available () {
return this._tryInitialize();
}

_tryInitialize () {
if (this._initialized) {
return true;
}

if (this._apiError !== null) {
throw this._apiError;
}

let api;
try {
api = getApi();
this.api = api;
} catch (e) {
this._apiError = e;
throw e;
}
if (api === null) {
return false; //只有这里返回为false
}

const vm = new VM(api);
this.vm = vm;

Types.initialize(vm);
ClassFactory._initialize(vm, api);
this.classFactory = new ClassFactory();

this._initialized = true;

return true;
}

那么只有一种可能,就是getApi()返回为null,再跟进去看看,这个getApi的有几层跳转如下:

// index.js
const getApi = require('./lib/api');

// ./lib/api.js
let { getApi, getAndroidVersion } = require('./android');
try {
getAndroidVersion();
} catch (e) {
getApi = require('./jvm').getApi;
}
module.exports = getApi;

// ./lib/android.js
function getApi () {
if (cachedApi === null) {
cachedApi = _getApi();
}
return cachedApi;
}

function _getApi () {
const vmModules = Process.enumerateModules()
.filter(m => /^lib(art|dvm).so$/.test(m.name))
.filter(m => !/\/system\/fake-libs/.test(m.path));
if (vmModules.length === 0) {
return null; // 这里返回了null
}

//以下代码省略...
}

看代码的意思是进程内没找到加载的libart.so或者libdvm.so,真奇怪了,你可是android进程,没有虚拟机咋跑的?
 
那就看下这个进程加载了什么,首先找到进程id。

redfin:/ # ps -ef | grep com.example.myapplication
u0_a108 27168 21776 0 11:18:29 ? 00:00:03 com.example.myapplication
root 28255 28250 35 14:11:06 pts/1 00:00:00 grep com.example.myapplication

然后检查下maps。

redfin:/ # cat /proc/27168/maps | grep libart.so
1|redfin:/ #

果然没有,我把maps的输出保存下来,在编辑器里查看才发现了端倪,原来进程加载的so里有一个libartd.so,因为这个手机是pixel5,系统是我自己下载AOSP编译的,选择的是eng版,这样编出来的系统so都是debug版,也就意味着后缀都有一个d,难怪frida找不到。
 
知道了原因,那解决方案就简单了,把那段查找libart.so的代码改成查找libartd.so即可。不过还有一个问题,这个frida-java-bridge是编译的时候从网上下载的,我们本地修改会被覆盖,那么就得研究下frida的编译系统了,让它使用我们本地的frida-java-bridge。
 
首先在源码里搜索frida-java-bridge,果不其然,是在一个generate-runtime.py里面,代码如下:

XACT_DEPS = {
"frida-java-bridge": "6.2.3",
"frida-objc-bridge": "7.0.2",
"frida-swift-bridge": "2.0.6"
}


def generate_runtime(backends, arch, endian, input_dir, gum_dir, capstone_incdir, libtcc_incdir, quickcompile, output_dir):
frida_compile = output_dir / "node_modules" / ".bin" / make_script_filename("frida-compile")
if not frida_compile.exists():
pkg_files = [output_dir / "package.json", output_dir / "package-lock.json"]
for f in pkg_files:
if f.exists():
f.unlink()
(output_dir / "tsconfig.json").write_text("{ \"files\": [], \"compilerOptions\": { \"typeRoots\": [] } }", encoding="utf-8")

node_modules = output_dir / "node_modules"
if node_modules.exists():
shutil.rmtree(node_modules)

npm = os.environ.get("NPM", make_script_filename("npm"))
try:
subprocess.run([npm, "init", "-y"],
capture_output=True,
cwd=output_dir,
check=True)
subprocess.run([npm, "install"] + [f"{name}@{version_spec}" for name, version_spec in RELAXED_DEPS.items()],
capture_output=True,
cwd=output_dir,
check=True)
subprocess.run([npm, "install", "-E"] + [f"{name}@{version_spec}" for name, version_spec in EXACT_DEPS.items()],
capture_output=True,
cwd=output_dir,
check=True) <=========这里下载了EXACT_DEPS里面的依赖项

看来是编译的时候,用npm install -E把frida-java-bridge下载下来了,那么接下来就是要把这个依赖项改成我们本地的。

首先下载一个到本地:

git clone https://github.com/frida/frida-java-bridge.git

然后全局查找libart.so,改成libartd.so。

 
这时候需要用到npm link把我们本地的frida-java-bridge注册到系统中。

(base) /data/code/OpenSource/crack/frida/frida-java-bridge (main ✗) npm link

up to date, audited 3 packages in 574ms

found 0 vulnerabilities

(base) /data/code/OpenSource/crack/frida/frida-java-bridge (main ✗) npm install

added 214 packages, and audited 215 packages in 1s

62 packages are looking for funding
run `npm fund` for details

found 0 vulnerabilities

然后要让frida中的编译脚本指向我们这个,也就是不要用npm install了,需要改成npm link, 修改generate-runtime.py代码如下:

 
然后再重新编译, 生成后推到手机执行。

 
果然没有报错了,非常完美!




看雪ID:madsu

https://bbs.kanxue.com/user-home-975816.htm

*本文由看雪论坛 madsu 原创,转载请注明来自看雪社区


# 往期推荐

1、在 Windows下搭建LLVM 使用环境

2、深入学习smali语法

3、安卓加固脱壳分享

4、Flutter 逆向初探

5、一个简单实践理解栈空间转移

6、记一次某盾手游加固的脱壳与修复




球分享

球点赞

球在看

相关阅读

  • 如何在模拟器里面脱360的壳

  • 1.准备环境1.夜神模拟器2.pyhton3.83.frida的版本 16.0.174.frida-dexdump2.设置adb连接我们打开夜神模拟器所在的文件夹,里面有自带的adb,我们在这个文件夹里面打开cmd。在里
  • 一个插件,让你的 ChatGPT 不再报错!

  • 公众号关注 “GitHubDaily”设为 “星标”,每天带你逛 GitHub!最近几天,相信大家都发现了 ChatGPT 一个问题,就是官网报错越来越频繁了。当你需用 ChatGPT 来处理一些比较琐碎的
  • DynamoRIO源码分析——劫持进程

  • 本文为看雪论坛优秀文章看雪论坛作者ID:DriverUnload一前言本系列将以官网资料为基础主要通过动态跟踪来解析DynamoRIO的源代码。因为如果不结合实例只是将各函数的作用写出
  • 最实用的应急响应笔记思路总结

  • 0x00 事件应急响应的流程分析事件整个类型大致归类于:事件表现-信息收集-确认攻击类型-事件追查-修复1)事件的表现:网站类型:被篡改,信息丢失,乱码等文件类型:被篡改,丢失,泄露等系统
  • Linux操作系统二十问,这些问题你都懂么?

  • Q1.Linux系统由哪几部分组成?Linux内核处于什么位置?A:1)Linux系统由四个部分组成:用户进程,系统调用接口、Linux内核子系统和硬件;2)Linux内核处于用户进程和硬件之间,包括系统调
  • CTFHUB-UnsortedBin Attack

  • 本文为看雪论坛优秀文章看雪论坛作者ID:LeaMov一程序分析1、IDA静态分析(1)伪代码分析main()函数:int __cdecl __noreturn main(int argc, const char **argv, const char **env
  • 浏览器渲染原理与弹幕

  • 本期作者雪人哔哩哔哩资深开发工程师背景随着弹幕数量越来越多,以及我们会不断的往视频上面添加越来越多的动画,如何让各种弹幕流畅的展示给我们的用户,成为了我们必须要考虑的
  • 利用 Python 开发 App 实战!

  • ↓推荐关注↓来源:网络Python语言虽然很万能,但用它来开发app还是显得有点不对路,因此用Python开发的app应当是作为编码练习、或者自娱自乐所用,加上目前这方面的模块还不是特别
  • 实战中各种SQL注入的绕过姿势

  • 这篇文章搜集整理自@Junehck师傅的Github,记录了他在实战中遇到的各种WAF拦截SQL注入的场景和绕过姿势,文章并不是完整的,仅记录了Bypass部分。https://github.com/Junehck/SQL

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四
  • 美国对华2000亿关税清单,到底影响有多大?

  • 1 今天A股大跌,上证最大跌幅超过2%。直接导火索是美国证实计划对华2000亿美元产品加征25%关税。 听起来,2000亿美元数目巨大,我们来算笔账。 2000亿美元,按现在人民币汇率

最新文章

  • Frida-server运行报错问题的解决

  • 本文为看雪论坛优秀文章看雪论坛作者ID:madsu刚刚开始学Android逆向,发现Frida是个好东西,于是赶紧下载研究一番。下载源码编译,切换到最新版16.0.11, 编译之前注意先更新nodejs
  • 对APK的一次插桩记录

  • 本文为看雪论坛优秀文章看雪论坛作者ID:oacia受好友nameless的委托,对一个名叫nokelock的apk进行插桩,希望在日志中打印出蓝牙加密包的密文,密钥与明文,由于本人是第一次对apk进
  • 赋能企业安全!系统0day安全-二进制漏洞攻防

  • 二进制漏洞是可执行文件(PE、ELF文件等)因编码时考虑不周,造成软件执行了非预期的功能。由于二进制漏洞大都涉及到系统层面,所以危害程度比较高。因此,二进制漏洞的挖掘和分析就
  • 五一,他们获奖章!

  • 劳动创造幸福,实干成就伟业。2023年五一国际劳动节前夕,中华全国总工会决定,授予207个集体和1035名个人全国五一劳动奖状、奖章,授予1044个集体获全国工人先锋号。据校友总会不
  • “我从高职毕业,当了清华老师”

  • 陕西姑娘邢小颖高职毕业后,以专业排名第一的成绩,在清华大学担任实践教学指导老师。今年29岁的她,已在清华任教9年。此前,她的讲课视频在网上播放量过亿。火出圈的她,引来更多关