# jadx 使用

直接用 jadx 打开 apk。

# 静态分析

# 1. 代码搜索

image-20220419214843370

activity 里面包含主要代码。其中在 main 之前的为主界面代码,这里只有 mainActivity.

image-20220419215044951

onCreate、onClick 为事件。

# Frida

# 启动:

连接到手机后,进入安装 frida-serve 的位置

adb shell
 su 
 cd /data/local/tmp/

ps -A | grep com

com 指代的是过滤条件,该指令可以展示当前进程名,也对应下图 xml 中的 package 名。

image-20220419221411727

import frida
import sys
#模板
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
#这里写要 hook 代码
test_t='''
Java.perform(
    function(){
        var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity')
        MainActivity.onClick.implementation = function(val){
            console.log('mmmm:'+this.m.value);
            console.log(this.n.value);
            
            this.onClick(val);
        };
        #下面是匿名类的hook方法,这里要把他自带的.改为$
         var test = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity$1')
        test.run.implementation = function(){
            console.log('this is test');
            this.run();
        }
    }
)
'''
#模板
#启动方式 1 attachH 后跟进程名
process = frida.get_usb_device(-1).attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(test_t)
script.on('message', on_message)
script.load()
sys.stdin.read()

匿名类可以通过 smali 代码判断。

在匿名函数访问外部类:
this.this$0.value.xxx.value


#打印调用堆栈
function printstack(){
    console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
}
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay