首页 > 其他分享 >学习笔记-Frida上手和逆向三段

学习笔记-Frida上手和逆向三段

时间:2022-11-11 09:33:11浏览次数:37  
标签:function Java log arg1 三段 result 上手 fun Frida

Frida上手和逆向三段

  1. FRIDA基本操作:参数,调用栈,返回值
  2. frida精髓2:方法重载,参数构造,动静态处理
  3. frida精髓3:主动调用,忽略内部细节,直接返回结果
  4. 逆向三段: (hook invoke) rpc

0x01 在kali上安装androidstudio,然后新建一个app项目,开始测试frida

1. 小试牛刀

app中的主代码

m.example.lesson4one;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
fun(50,80);
}
}
int fun(int x,int y)
{
Log.d("YenKoc",String.valueOf(x+y));
return x+y;
}
}

hook的js文件,这里和肉丝在github上有点区别,肉丝在github上发的文章上的话,是利用python来作为一个载体执行js,盲猜可能是后面rpc才会用到,这种js直接启动真的香
这里编写js文件,我选择是在FRIDA-AGENT-EXAMPLE中的agent文件夹下编写,没有为什么,问就是有智能提示2333

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
console.log("arg1,arg2,result",arg1,arg2,result);
return result;
}
})
}
setImmediate(main)

在vscode中打开终端(Terminal在界面的左上),先进入(cd)js所在目录后,然后输入命令:
frida -U 包名 -l xxx.js
发现参数和返回值都打印出来了
# 2. 改变参数和返回值,修改一个app代码

package com.example.lesson4one;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int m=fun(50,80);
Log.d("kanxue m =", String.valueOf(m));
}
}
int fun(int x,int y)
{
Log.d("YenKoc",String.valueOf(x+y));
return x+y;
}

}

把js代码也修改一下

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
})
}
setImmediate(main)

同样执行后,发现log中的返回值发生了改变了,说明hook成功了

3. 方法的重载处理

修改一下app代码,增加一个重载方法以及一个未被调用的方法

package com.example.lesson4one;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
private String total="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int m=fun(50,80);
Log.d("YenKoc m =", String.valueOf(m));
Log.d("YenKoc tolowercase", fun("LOWERCASEME!"));
}
}
String fun(String x)
{
total+=x;
return x.toLowerCase();
}
int fun(int x,int y)
{
Log.d("YenKoc",String.valueOf(x+y));
return x+y;
}
String secret()
{
return total;
}


}

这里再运行之前的js代码肯定会报错,因为有方法的重载,这里需要重新处理,重新修改后的js代码

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.overload('int', 'int').implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
//console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
Java.use("com.example.lesson4one.MainActivity").fun.overload('java.lang.String').implementation=function(arg1)
{
var result=this.fun(arg1);
console.log("arg1 result",arg1,result);
return result;
}
})
}
setImmediate(main)

overload都是从报错信息中复制粘贴的,真香
接下来修改参数或返回值:

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.overload('int', 'int').implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
//console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
Java.use("com.example.lesson4one.MainActivity").fun.overload('java.lang.String').implementation=function(arg1)
{
var result=this.fun("NIHAO");
console.log("arg1 result",arg1,result);
return result;
}
})
}
setImmediate(main)

这里又引出了一个frida启动spawn的方法,重新自启动 frida -U -f 包名 -l xxxx.js执行后,再执行%resume,重新执行
这里的字符串不是java的字符串而是js的,虽然有自动转换,最好还是直接使用java的api生成字符串

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.overload('int', 'int').implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
//console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
Java.use("com.example.lesson4one.MainActivity").fun.overload('java.lang.String').implementation=function(arg1)
{
var result=this.fun(Java.use("java.lang.String").$new("NIHAOJAVA"));
console.log("arg1 result",arg1,result);
return result;
}
})
}
setImmediate(main)

4. 这里额外插一个调用栈的代码

function main()
{
Java.perform(function(){
Java.use("com.example.lesson4one.MainActivity").fun.implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
})
}
setImmediate(main)

上面的不知道为啥感觉不够稳,老报错,慎重,还是objection香 # 5. 方法的主动调用 1. 实例方法的主动调用
调用app中的secret()方法,思想就是先去搜索对象实例,然后再调用实例方法

{
Java.perform(function(){
/*
Java.use("com.example.lesson4one.MainActivity").fun.overload('int', 'int').implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
//console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
Java.use("com.example.lesson4one.MainActivity").fun.overload('java.lang.String').implementation=function(arg1)
{
var result=this.fun(Java.use("java.lang.String").$new("NIHAOJAVA"));
console.log("arg1 result",arg1,result);
return result;
}
*/
Java.choose("com.example.lesson4one.MainActivity",{
onMatch:function(instance){
console.log("found instance :",instance);
console.log("found instance:",instance.secret());
},onComplete:function(){}
})
})
}
setImmediate(main)

  1. 静态方法的调用
    在app中创建一个静态方法

package com.example.lesson4one;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
private static String total="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int m=fun(50,80);
Log.d("YenKoc m =", String.valueOf(m));
Log.d("YenKoc tolowercase", fun("LOWERCASEME"));
}
}
String fun(String x)
{
total+=x;
return x.toLowerCase();
}
int fun(int x,int y)
{
Log.d("YenKoc",String.valueOf(x+y));
return x+y;
}
String secret()
{
return total;
}
public static String secret2()
{
return total;
}


}

在js代码中也进行了修改

function main()
{
Java.perform(function(){
/*
Java.use("com.example.lesson4one.MainActivity").fun.overload('int', 'int').implementation=function(arg1,arg2)
{
var result=this.fun(arg1,arg2);
//console.log(Java.use('android.util.log').getStackTraceString(Java.use("java.lang.Throwable").$new()));
console.log("arg1,arg2,result",arg1,arg2,result);
return 800;
}
Java.use("com.example.lesson4one.MainActivity").fun.overload('java.lang.String').implementation=function(arg1)
{
var result=this.fun(Java.use("java.lang.String").$new("NIHAOJAVA"));
console.log("arg1 result",arg1,result);
return result;
}

Java.choose("com.example.lesson4one.MainActivity",{
onMatch:function(instance){
console.log("found instance :",instance);
console.log("found instance:",instance.secret());
},onComplete:function(){}
})
*/
var result=Java.use("com.example.lesson4one.MainActivity").secret2();
console.log("result:",result);
})
}
setImmediate(main)

6.通过上一节课的案例,加深frida的使用

这里思路很巧妙,有时候无法从自动就开始hook到方法,可以先进行hook,然后通过回掉函数主动调用hook的方法,自产自销,秒,不过注意的一点就是回调函数的可以由进入frida后命令行直接进行调用,也可以使用setTimeout(函数名,时间),延迟调用

function main()
{
Java.perform(function(){
Java.use("net.sqlcipher.database").getWritableDatabase.overload("java.lang.String").implementation=function(arg1){
var result=this.getWritableDatabase(arg1);
console.log("arg1:",arg1);
return result;
}
})
}
setImmediate(main)
function voke()
{
Java.perform(function(){
Java.choose("com.example.yaphetshan.tencentwelcome.MainActivity",{
onMatch:function(instance){
console.log("found instance",instance);
console.log("invoke instance.a",instance,a());
},onComplete:function(){console.log("search completed!")}
})
})
}

 

 

 

点击关注,共同学习!
[安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)


[github haidragon](https://github.com/haidragon)


https://github.com/haidragon

标签:function,Java,log,arg1,三段,result,上手,fun,Frida
From: https://www.cnblogs.com/haidragon/p/16879561.html

相关文章

  • 学习笔记-Frida反调试思路和hook native
    用户代码nativehookFrida反调试与反反调试基本思路(Java层API,Native层API,Syscall)六月题的Frida反调试的实现以及Native函数的Javahook以及主动调用静态注册函......
  • 快速上手VueX
    前言本文主要介绍了VueX状态管理器、VueX的核心概念、store.js以及vuex的工作流程。理解了这些概念可以让我们快速上手使用VueX,实现对Vue的状态管理。VueXVueX是对Vue的......
  • 30分钟上手 Koa2 + MySQL 开发
    30分钟上手Koa2+MySQL开发 转载https://blog.51cto.com/u_15478221/4925103趣谈前端2022-01-1410:00:53文章标签中间件数据库javapython编程语言文章分类其它......
  • 02python快速上手
    这一篇是环境准备,主要是说明如何安装Python和运行交互式环境。安装和运行交互式解析器如果你使用的是MacOS和Linux/UNIX机器的话,大部分都默认安装了Python,不过需要注意的......
  • 基于VUEX的公共存储器store的快速上手流程
    vuex的快速安装与使用​​store公共存储器​​​​state.js添加数据元​​​​mutations.js创建一个方法​​​​在组件中提交:​​​​在组件中使用:​​store公共存储器在使......
  • 十分钟上手 Next.js
    十分钟上手Next.js写代码的海怪​腾讯前端工程师​关注他 28人赞同了该文章前言Next.js 已经出来很久了,但是一直没机会看这个框架。以前一......
  • Citus 11 官方手册脑图 - PostgreSQL 超大规模分布式数据库解决方案上手指南
      官方手册:https://docs.citusdata.com  脑图大纲入门什么是Citus?Citus可以扩展多远?何时使用Citus多租户数据库实时分析使用注意事项何时Citus......
  • 如何简易的上手mybatis
    前段时间发现了一个比较投机的方式来使用mybatis,这种方式可以让人觉得我确实是使用的mybatis啊的感觉,实际上又不是。我们都知道,Mybatis相比于直接用sql语句来查询写起来有点......
  • frida rpc调用之某软件商店
    一.什么是fridarpcrpc就是RemoteProcedureCall(远程过程调用),用数据线连手机电脑,启动爬*虫,hook自动调用so函数,省的分析so天书了.二.demo讲解包名:co......
  • 3.快速上手
    1.输入输出1.1输出将文本信息展示出来1defprint(self,*args,sep='',end='\n',file=None):2"""3Printsthevaluestoastream,ortosys.stdout......