尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Frida-Labs0x3-0xB WP

Frida-Labs0x3-0xB WP
📅 发布时间:2026/6/20 0:15:38
Frida-Labs0x3-0xB WP

Frida-0x3

解法一

Java.perform(function (){var a = Java.use("com.ad2001.frida0x3.Checker");a.code.value = 512;
})

解法二

Java.perform(function(){var Checker =Java.use("com.ad2001.frida0x3.Checker");Checker.code.value=0;console.log("code当前的值是"+Checker.code.value);for(var i=0;i<256;i++){Checker.increase();}console.log("触发函数后的值为"+Checker.code.value);})
模板
Java.perform(function (){var <class_reference> = Java.use("<package_name>.<class>");<class_reference>.<variable>.value = <value>;})

Frida-0x4

解法

 Java.perform(function(){var a =Java.use("com.ad2001.frida0x4.Check");var a1= a.$new(); /创建实例var b=a1.get_flag(1337); /传入参数1337console.log("FLAG "+b); /打印结果
});
模板
Java.perform(function() {var <class_reference> = Java.use("<package_name>.<class>");var <class_instance> = <class_reference>.$new(); // Class Object<class_instance>.<method>(); // Calling the method})

Frida-0x5

解法

Java.perform(function(){Java.choose("com.ad2001.frida0x5.MainActivity",{onMatch:function(a){a.flag(1337)},onComplete:function(){console.log("ok")}})
})

居然没有;也可以

模板
Java.performNow(function() {Java.choose('<Package>.<class_Name>', {onMatch: function(instance) {// TODO},onComplete: function() {}});
});
  1. onMatch:onMatch 回调函数针对在 Java.choose作期间找到的指定类的每个实例执行。该回调函数接收当前实例作为其参数。可以在 onMatch 回调中定义要对每个实例执行的自定义操作。
  2. onComplete 回调在 Java.choose作完成后执行作或清理任务。此块是可选的,如果您在搜索完成后不需要执行任何特定作,则可以选择将其留空。

Frida-0x6

试错一

 Java.perform(function(){Java.choose("com.ad2001.frida0x6.MainActivity",{onMatch:function(instance){instance.get_flag(1234)instance.get_flag(4321)console.log("good")},onComplete:function(){console.log("better")}})})

错误原因:Checker 类的 num1 和 num2 是实例字段,不是静态字段,需要创建一个 Checker 的实例才能修改这些字段

试错二

 Java.perform(function(){var Checker = Java.use("com.ad2001.frida0x6.Checker");var checker = Checker.$new();checker.num1.value = 1234;checker.num2.value = 4321;console.log("ok");return checker;
});

错误原因:get_flag() 是 MainActivity 实例的成员方法,必须通过实例调用

修复过程

  1. 首先创建实例checker=Checker.$new()
  2. 传入num1、num2参数数值
  3. 使用 instance 调用get_flag(checker)

解法

 Java.perform(function(){Java.choose("com.ad2001.frida0x6.MainActivity",{onMatch:function(instance){var Checker = Java.use("com.ad2001.frida0x6.Checker");checker=Checker.$new()checker.num1.value=1234checker.num2.value=4321console.log("good")instance.get_flag(checker)},onComplete:function(){console.log("better")}})})

0x6&0x7:MainActivity中不能随意创建实例,而普通的Java方法可以创建实例

Frida-0x7

试错一:

Java.perform(function(){Java.choose("com.ad2001.frida0x7.onCreate",{onMatch:function(instance){var Checker=Java.use("com.ad2001.frida0x7.Checker")checker=Checker.$new()checker.num1.value(555)checker.num2.value(555)},onComplete:function(){console.log("good")}})

错误分析:checker方法是同时接收两个参数,我这里是模仿0x6的一个个接收参数

解法一

Java.perform(function(){Java.choose("com.ad2001.frida0x7.MainActivity",{onMatch:function(instance){var Checker=Java.use("com.ad2001.frida0x7.Checker")checker=Checker.$new(555,555)instance.flag(checker)},onComplete:function(){console.log("good")}})
})

试错二

先进行:frida -U -f com.ad2001.frida0x7 再在 终端输入代码进行hook

错误原因:$init在应用初始化阶段就已经完成,想要拦截并传入新的参数必须在app进程开始前完成调用

改正:frida -U -f com.ad2001.frida0x7 -l D:\damn\JavaScript\1.js

解法二:

Java.perform(function(){var a=Java.use("com.ad2001.frida0x7.Checker")a.$init.implementation=function(param){this.$init(600,600)}
})
模板
Java.perform(function(){
var <class_reference> = Java.use("<package_name>.<class>")
<class_reference>.$init.implementation=function<args>{
// TODO
}
})
知识点

构造函数

它的核心是 直接拦截 Checker 类的构造函数($init),强制用满足条件的参数(600,600)初始化实例

$init 是什么?

  • 在 Frida 中,Java 类的 构造函数 统一用 $init 表示(因为 Java 构造函数没有返回值、名字和类名一致,Frida 用 $init 标准化)。
  • 比如 Java 里的 Checker(int a, int b) 构造函数,在 Frida 中对应的就是 Checker.$init(参数为两个 int)。

Frida0x8

试错一

Module.enumerateExports("libfrida0x8.so")[0]

umerate:重计数

错误原因:1.必须用Frida -U -F com.ad2001.frida0x8 2.modulename必须带引号

改正:

[Android Emulator 5554::Frida 0x8 ]-> Module.enumerateExports("libfrida0x8.so")[0]
{"address": "0x7fff59a6e8c0","name": "Java_com_ad2001_frida0x8_MainActivity_cmpstr","type": "function"
}

使用另外的API函数查找函数地址

[Android Emulator 5554::Frida 0x8 ]-> Module.getExportByName("libfrida0x8.so","Java_com_ad2001_frida0x8_MainActivity_cm
pstr")
"0x7fff59a6e8c0"

模块基地址+偏移量

[Android Emulator 5554::Frida 0x8 ]-> Module.getBaseAddress("libfrida0x8.so")
"0x7fff59a6e000"
知识点
  1. Module.enumerateExports("moduleName")

    作用:枚举指定模块的所有的导出函数/符号

    导出函数

  2. Module.getExportByName("moduleName","exportName")

    Module.findExportByname("moduleName","exportName")

    通过名称查找导出函数的地址

  3. Module.getBaseAddress("modelName")

    获取模块的基地址(加载地址

下一步进行编写代码

试错二

Interceptor.attach(0x7fff592ca8c0,{OnEnter:function(args){console.log("yes,entering it")},OnLeave:function(retval){console.log("retval")}
})

错误原因:1.targetAddress必须用ptr修饰,因为0x7fff592ca8c0是一个字符串,而ptr(0x7fff592ca8c0)是一个NativePointer对象,Frida所有的内存操作都需要NativePointerl类型

2.OnEnter:和OnLeave:开头都要小写

改正后:

Interceptor.attach(ptr(0x7fff592ca8c0),{onEnter:function(args){console.log("yes,entering it")},onLeave:function(retval){console.log("retval")}
})

小问题原因:他没有回显,因为咱们没有获得输出

解决方法一:

查看日志输出

相关命令:1.frida-ps -U /查看所有进程

​ 2.adb logcat --pid=pid /显示指定进程的Android的日志

然后就可以获得flag了

12-16 20:03:31.498 2783 2783 D input : 1
12-16 20:03:31.498 2783 2783 D Password: FRIDA{NATIVE_LAND}

解决方法二:

修改代码,直接输出参数二

试错一

Interceptor.attach(ptr(0x7fff592ca8c0),{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){console.log("out")}
})

错误原因:targetaddress的地址是Java_com_ad2001_frida0x8_MainActivity_cmpstr的地址,是是 JNI 函数。 args[0] 和 args[1]不是字符串。我们需要查找strcmp函数

改正:
Interceptor.attach(ptr(0x7ffff47a4ff0),{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){}
})

这样就可以获得flag了

完整代码

Java.perform(function(){var targetaddress=Module.getExportByName("libfrida0x8.so","strcmp")
Interceptor.attach(targetaddress,{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){}
})
})

模板

Interceptor.attach(targetAddress,{onEnter:function(args){console.log("Entering"+functionName)},onLeave:function(retval){console.log("Leaving" +functionName)}
})

Frida0x9

代码

Java.perform(function(){var targetaddress=Module.findExportByName("liba0x9.so","Java_com_ad2001_a0x9_MainActivity_check_1flag")Interceptor.attach(targetaddress,{onEnter:function(args){console.log("enter it")},onLeave:function(retval){retval.replace(1337)console.log("good")}})
})

Frida0xA

模板

var native_adr = new NativePointer(<address_of_the_native_function>);
const native_function = new NativeFunction(native_adr, '<return type>', ['argument_data_type']);
native_function(<arguments>);

一

var base=Module.findBaseAddress("libfrida0xa.so")var flag=base.add(0x206B0 )var na=new NativePointer(flag)const get_flag=new NativeFunction(na,'void',['int','int'])get_flag(1,2)

二

var na =Module.findExportByName("libfrida0xa.so","_Z8get_flagii")
const get_flag=new NativeFunction(na,'void',['int','int'])
get_flag(1,2)

Frida0xB

这一题我们主要要学习的是花指令的nop

解法一

Xwriter

试错

var jnz=Module.getBaseAddress("libfrida0xb.so").add(0x170ce)
var writer=new X86Writer(jnz)
try{writer.putNopPadding(6)writer.flush()
}finally{writer.dispose()
}

错误原因:该内存只能读取不能直接修改,

解决方法:修改内存权限

正确代码

var jnz=Module.getBaseAddress("libfrida0xb.so").add(0x170ce)
Memory.protect(jnz,6,"rwx")      /赋予写入权限
var writer=new X86Writer(jnz)  
try{writer.putNopPadding(6)  /向写入流中插入6个字节的90填充writer.flush()   /刷新缓冲区
}finally{writer.dispose()  /清理资源
}

总结收获:

  1. MainActivity中不能随意创建实例,而普通的Java方法可以创建实例
  2. 含static:静态方法 不含static:实例方法

相关新闻

  • MySQL架构长啥样?
  • Arbess从基础到实践(22) - 集成GitPuk+sourcefare+PostIn自动化部署
  • 2025 年最新客服机器人品牌有哪些,看这一篇就够了 - 品牌策略主理人

最新新闻

  • 2026年淮北市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY
  • 2026年日照市老百姓优先选择的五家贵金属回收门店 黄金回收白银回收铂金回收彩金回收合规靠谱门店测评合集+联系方式 - 亦辰小黄鸭
  • 2026年金华市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY
  • 三维SLAM实战指南:基于Velodyne VLP-16与A-LOAM的室内外建图全流程解析
  • 自动驾驶多任务感知的部分监督学习实战
  • 2026年晋城市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号