偶然从看雪看到了一篇入门frida的题目,正好苦于没练手的东西,直接上手一波

1.第一题jadx打开,也没有壳和混淆,整体非常清晰,判断的逻辑也很简单

发现其实就是两个输入框,一个用户名一个密码,先拼接起来然后传入VVVVV.VVVV()方法中去校验,跟进去看一手

其实代码逻辑还是挺清晰的,手逆也不难,但是这里主要还是用hook来做,这里破解是非常容易的,直接hook VVVV()方法的返回值直接返回为true

,这样不管输入什么都只会通过,但是这边的话,我们还是选择要得到flag,所以选择在frida中进行爆破,求解,因为在方法中也可以调用原方法,而且

字符串的位数只有5位,爆破还是挺容易的,不过要注意的地方就是js的字符串和java的不太一样,所以我们需要通过hook java.lang.String类,然后

去实现java的字符串对象,进而调用原方法

function main()
{
Java.perform(function(){
var string_class=Java.use("java.lang.String");
Java.use("com.kanxue.pediy1.VVVVV").VVVV.implementation=function(t,y)
{
for(var i=0;i<=9;i++)
{
for(var j=0;j<=9;j++)
{
for(var k=0;k<=9;k++)
{
for(var w=0;w<=9;w++){
for(var x=0;x<=9;x++)
{
var res=string_class.$new(i.toString()+j.toString()+k.toString()+w.toString()+x.toString());
if(this.VVVV(t,res))
{
console.log("right answer:",res);
return true;
}else
{
console.log("wrong answer:",res);
}
}
}
}
}
} }
})
}
setImmediate(main);

frida -U --no-pause -f 包名 -l 注入的js。启动就等着结果出来就好了

第二题走起:

第二题有点热修复的意思,就是调用文件夹中dex中类的方法,

其实就是自定义了个classloader,只要hook就完事了,然后和第一题校验逻辑是一样的,爆破就好了

function main()
{
Java.perform(function(){
console.log("YenKoc");
Java.enumerateClassLoaders({
onMatch:function(loader){
try{
if(loader.findClass("com.kanxue.pediy1.VVVVV"))
//if(loader.toString().indexOf('dalvik.system.DexClassLoader')>-1)
{
console.log("find right classloader");
console.log(loader);
Java.classFactory.loader=loader;
hookVVVV();
return;
}
}catch(error)
{
console.log("find error"+error);
}
},
onComplete:function(){
console.log("end1");
}
}) })
}
function hookVVVV(){
Java.perform(function(){
console.log('loader',Java.classFactory.loader); for (var i = 0; i <= 9; i++) { for (var j = 0; j <= 9; j++) {
for (var k = 0; k <= 9; k++) {
for (var t = 0; t <= 9; t++) {
for (var y = 0; y <= 9; y++) {
var newInput = Java.use('java.lang.String').$new(i.toString()
+ j.toString()
+ k.toString()
+ t.toString()
+ y.toString())
//console.log(newInput)
console.log("tmp:",newInput);
var result = Java.use('com.kanxue.pediy1.VVVVV').VVVV(newInput)
if(result == true){
console.log('flag is ',newInput)
return;
}
}
}
}
}
} })
}
setImmediate(main);
//setTimeout(main,2000);

有几点坑的地方,第一个就是这个apk是测试用的apk,所以直接adb install是装不了的,我百度了下,修改androidmainfest.xml文件

把android:testOnly = "true"这个东西删了,二次重打包下,结果还是不行,我丢,然后我又重新adb install -t apk名字,可以安装了

这是安装测试apk的命令,然后就是这题frida -U --no-pause 包名 -l hook注入的js名字,不要在包名加-f了,加-f是spawn,开始就自启动

这样会导致找不到classloader的,所以我们要attach上去,之后才能找到。

第三题:

和第二题相比就是加了检测frida的方法,init()是native方法,我们用ida打开发现是动态注册,先去找一手jni_onload因为动态注册肯定

先调用这个方法的,

动态注册的话,其实本质就是换了个名字,之前静态注册的话,特征太明显了,java_包名_类名_native方法,所以出现了

动态注册,利用jninativeMethod这个结构体来存储native方法和本地函数的关联

//JNINativeMethod结构体
typedef struct {
const char* name; //Java中native方法的名字
const char* signature; //Java中native方法的描述符
void* fnPtr; //对应JNI函数的指针
} JNINativeMethod; /**
* @param clazz java类名,通过 FindClass 获取
* @param methods JNINativeMethod 结构体指针
* @param nMethods 方法个数
*/
jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, jint nMethods) //JNI_OnLoad
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);

这个就说的很清晰了。就不多bb了,

说明真正的native方法对应的本地函数是init,我们跟进去一下

发现就是新建了一个线程,检测frida是否占用了端口

这里处理方式

1.第一种是重打包,直接不调用init()这个方法了,这个androidkiller的话,很简单的,就不多bb了

2.直接hook native 方法

function hook_pthread_create(){
var pt_create_func = Module.findExportByName(null,'pthread_create');
var detect_frida_loop_addr = null;
console.log('pt_create_func:',pt_create_func); Interceptor.attach(pt_create_func,{
onEnter:function(){
if(detect_frida_loop_addr == null)
{
var base_addr = Module.getBaseAddress('libnative-lib.so');
if(base_addr != null){
detect_frida_loop_addr = base_addr.add(0xe9c)
console.log('this.context.x2: ', detect_frida_loop_addr , this.context.x2);
if(this.context.x2.compare(detect_frida_loop_addr) == 0) {
hook_anti_frida_replace(this.context.x2);
}
} } },
onLeave : function(retval){
// console.log('retval',retval);
}
})
}
function hook_anti_frida_replace(addr){
console.log('replace anti_addr :',addr);
Interceptor.replace(addr,new NativeCallback(function(a1){
console.log('replace success');
return;
},'pointer',[])); }

这里hook native的手法,我还不太熟悉,直接搬肉丝表哥的代码的233,晚上研究一手

3.还有就是修改硬编码so,直接就是patch,爆破那种思路,各位大佬也是有手就行

从三道题目入门frida的更多相关文章

  1. 漫谈C指针:参数传递的三道题目

    漫谈C指针:参数传递的三道题目 2009-07-02 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: [c] view plaincopy ...

  2. CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解

    目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...

  3. 《算法C语言实现》————三道题目

    1.对于N = 10,100和1000,记录你的运行环境中分别运行一下程序所花费的时间.(用python) import datetime global a a = 0 def time_1(s): ...

  4. 27号华为笔试(三道ac两道)

    三道题目case:100,100,0: 三个题目: 前两个都全部ac了,第三题没时间: 记录一下大概的思路: 第一题 主要通过Java中的字符串处理函数:然后控制字符串输入格式: 卡bug的点: 1: ...

  5. 一步步学习javascript基础篇(6):函数表达式之【闭包】

    回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; }  //函数声明语法定义 2. var sum = funct ...

  6. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...

  7. April Fools Day Contest 2014

    April Fools Day Contest 2014 A.C.H三道题目 ============================================================= ...

  8. HDU 1828 Picture(线段树扫描线求周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

随机推荐

  1. Bootstrap Bootstrap3 与 Bootstrap4 的区别

    Bootstrap3 与 Bootstrap4 官网地址 Bootstrap3 官网:https://v3.bootcss.com Bootstrap4 官网:https://v4.bootcss.c ...

  2. SUSE12 操作系统安装

    今天开发同事需要一个客户的SUSE环境,原来没有安装过这个操作系统,网络配置方面有些问题见下一篇 镜像:SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso 安装过程: 选 ...

  3. MyBatis的Example如何按条件排序(Day_35)

    MyBatis的Example如何按条件进行排序? 背景:有时我们在使用mybatis example 进行查询时,需要进行相应的业务排序.本博客以下图为例 @Override public List ...

  4. Redis SWAPDB 命令背后做了什么

    Redis SWAPDB 命令背后做了什么 目录 Redis SWAPDB 命令背后做了什么 0x00 摘要 0x01 SWAPDB 基础 1.1 命令说明 1.2 演示 0x02 预先校验 0x03 ...

  5. SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

    全局配置文件 全局配置文件能够对一些默认配置值进行修改.SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件, ...

  6. 搞定Redis(一)Redis的安装和五大基本数据类型

    一.Redis概述及安装 1.概述: 1.1.Redis是一个开源的key - value存储系统. 1.2.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). ...

  7. GO语言常用标准库03---time包

    package main import ( "fmt" "time" ) func main021() { nowTime := time.Now() fmt. ...

  8. Go语言流程控制02--选择结构之switch

    package main import "fmt" /* @星座诊所2(switch) 根据用户输入的出生月份猜测其星座: ·白羊(4) 金牛(5) 双子(6) 巨蟹(7) 狮子( ...

  9. javascript数组排序算法之选择排序

    前言 作为一名程序员数组的排序算法是必须要掌握的,今天来图解----选择排序 选择排序原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大) ...

  10. deepstream-开放式实时服务器

    deepstream-开放式实时服务器 deepstream是一款开源服务器,其灵感来自金融交易技术背后的概念.它允许客户端和后端服务同步数据.发送消息并以非常高的速度和规模规划rpc. 参考:htt ...