10月份课时2

objection hook一般是用Java.choose实现

  1. 内存漫游

根据文件启动时批量执行命令:
objection -g 包名 explore explore -c “文件”
文件如:android hooking watch class 类名1
android hooking watch class 类名2

10月份课时3

trace:批量hook

  1. hook类打印调用栈

https://github.com/hluwa/ZenTracer
运行ZenTracer.py-》action-》match regex-》E:java.io.File会hook以这个开头的所有类和子类
hook类过多app会闪退

10月份课时4

  1. RPC

https://github.com/frida/frida-python

10月份课时5

主动调用并暴露到公网

  1. 配置
    1. function hook01(){
    2. var res=null
    3. Java.perform(function () {
    4. res=Java.use("com.wzyk.zgyjb.utils.FhfxUtil").createSign('sss','aaaaaa','s3')
    5. //console.log(res)
    6. })
    7. return res;
    8. }
    9. function hook02(){
    10. var res=null
    11. Java.perform(function () {
    12. Java.use("com.wzyk.zgyjb.utils.FhfxUtil").createSign.implementation = function(s1,s2,s3) {
    13. res=this.createSign(s1,s2,s3)
    14. console.log('hook02:'+res)
    15. return res
    16. }
    17. })
    18. return res;
    19. }
    20. console.log('hook01:'+hook01())
    21. hook02()
    22. //暴露方法到公网
    23. rpc.exports={
    24. hook01:hook01,
    25. hook02:hook02,
    26. }
    启动frida:./frida-x64 -l 0.0.0.0:9999
    启动脚本:frida -H “192.168.31.77:9999” -F -l D:\pythonProject\app\jinjie\test.js
    python脚本方式启动 ```python import os

import frida, sys

def on_message(message, data): if message[‘type’] == ‘send’: print(“[*] {0}”.format(message[‘payload’])) else: print(message)

jscode=open(‘./test.js’,’r’,encoding=’utf-8’).read()

jscode=open(‘./test.js’,encoding=’utf-8’).read()

process = frida.get_remote_device().attach(‘com.example.seccon2015.rock_paper_scissors’)

os.system(“adb forward tcp:27042 tcp:27042”) os.system(“adb forward tcp:27043 tcp:27043”)

通过ip获取设备,有多个可以用列表放多个

device=frida.get_device_manager().add_remote_device(‘192.168.31.77:9999’)

device=frida.get_remote_device()

获取pid

pid=device.get_frontmost_application().pid

根据pid获取进程

session=device.attach(pid)

加载脚本

script = session.create_script(jscode) print(‘开始’)

打印日志

script.on(‘message’, on_message)

执行脚本

script.load()

脚本执行完不直接结束

sys.stdin.read()

  1. objection方式启动:objection -N -h 192.168.31.77 -p 9999 -g com.wzyk.zgyjb explore
  2. 2. flask暴露到公网
  3. ```python
  4. import os
  5. import frida
  6. import json
  7. from flask import Flask, jsonify, request
  8. import frida, sys
  9. def on_message(message, data):
  10. if message['type'] == 'send':
  11. print("[*] {0}".format(message['payload']))
  12. else:
  13. print(message)
  14. jscode=open('./test.js','r',encoding='utf-8').read()
  15. # jscode=open('./test.js',encoding='utf-8').read()
  16. # process = frida.get_remote_device().attach('com.example.seccon2015.rock_paper_scissors')
  17. os.system("adb forward tcp:27042 tcp:27042")
  18. os.system("adb forward tcp:27043 tcp:27043")
  19. # 通过ip获取设备
  20. device=frida.get_device_manager().add_remote_device('192.168.31.77:9999')
  21. # device=frida.get_remote_device()
  22. # 获取pid
  23. pid=device.get_frontmost_application().pid
  24. # 根据pid获取进程
  25. session=device.attach(pid)
  26. # 加载脚本
  27. script = session.create_script(jscode)
  28. print('开始')
  29. # 打印日志
  30. script.on('message', on_message)
  31. # 执行脚本
  32. script.load()
  33. # print(script.exports.hook01('aaaaaaa'))
  34. # 脚本执行完不直接结束
  35. # sys.stdin.read()
  36. app = Flask(__name__)
  37. # 访问地址
  38. @app.route('/decrypt', methods=['POST']) # data解密
  39. def decrypt_class():
  40. data = request.get_data()
  41. json_data = json.loads(data.decode("utf-8"))
  42. postdata = json_data.get("data")
  43. res = script.exports.hook01(postdata)
  44. return res
  45. if __name__ == '__main__':
  46. app.run()

postman调用:http://127.0.0.1:5000/decrypt,body:{“data”:”fff”}

10月份课时6

  1. 主动调用测试

so函数得到的参数是地址,转字符串:Java.vm.getEnv().getStringUtfChars(args[0],null).readCString()
args[0]:第一个参数

  1. var aes_addr = Module.findExportByName('libwtf.so','Java_com_sichuanol_cbgc_util_SignManager_getSign');
  2. console.log("aes_addr:",aes_addr);
  3. // pointer:对应string类型
  4. //创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
  5. var get_sign = new NativeFunction(aes_addr , 'pointer', ['pointer', 'pointer', 'pointer']);
  6. var text = Memory.allocUtf8String("aaaabbbb");//创建字符串
  7. console.log("The result is: ",Memory.readCString(get_sign(text,text,text)));//调用函数
  1. 脱离app单独调用so,如果so反射调用java将无法使用

    1. // 加载so,需要放在手机目录下
    2. var so=Module.load("/data/local/so/libwtf.so")
    3. console.log(so);
    4. // 获取函数地址
    5. var fun1=so.findExportByName("getSign")
    6. //创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
    7. var get_sign = new NativeFunction(fun1 , 'pointer', ['pointer', 'pointer', 'pointer']);
    8. var text = Memory.allocUtf8String("aaaabbbb");//创建字符串
    9. console.log("The result is: ",Memory.readCString(get_sign(text,text,text)));//调用函数

    11月课时1

  2. 环境

xposed本质就是app
xposed网上教程:https://www.freebuf.com/articles/terminal/189021.html
过滤子进程:loadPackageParam.processName

  1. Xposed Hook打印调用堆栈

https://blog.csdn.net/QQ1084283172/article/details/79378374
可以在xposed日志下查看模块打印
把xposed日志输出到Android studio:logcat下会自动打印输出

  1. hook修改

beforeHookedMethod:方法执行前函数,一般用于修改参数
MethodHookParam.args:参数,根据下标获取从0开始
afterHookedMethod:方法执行后函数,用于修改返回值

  1. // 添加对应参数需要在方法名后面加参数列表
  2. XposedHelpers.findAndHookMethod(clazz, "toastMessage",String.class, new XC_MethodHook() {
  3. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  4. // 打印参数,从0开始
  5. XposedBridge.log("param:"+ param.args[0]);
  6. // 修改参数
  7. param.args[0]="你已被劫持";
  8. super.beforeHookedMethod(param);
  9. }
  10. }
  1. // 方法执行后执行的方法
  2. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  3. // 获取返回值
  4. Log.d("返回值:",(String) param.getResult());
  5. // 修改返回值
  6. param.setResult("你已被劫持");
  7. }
  1. GravityBox

https://github.com/GravityBox/GravityBox
如果项目导入报:ERROR: This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 4.1 or newer.,需要更新android studio版本

11月课时2

xposed api:https://api.xposed.info/reference/de/robv/android/xposed/XposedHelpers.html

  1. java反射

getClasses():返回一个数组,获得包含类信息的类对象
getClassLoader():获得类加载器

11月份课时3

frida枚举指定的所有类

  1. Java.enumerateLoadedClasses({
  2. onMatch:function(className){
  3. if(className.indexOf("java.lang")!=-1){
  4. console.log("找到:"+className.toString())
  5. }
  6. },onComplete:function(){
  7. console.log("ok...")
  8. }
  9. })

12月份课时3

  1. 环境

(1)aosp
aosp源码地址:https://pan.baidu.com/s/1zAYliYbkagdUUsykww_L4g 提取码:vv5u
aosp目录下,aosp810r1的4个文件全下载
(2)openjdk
openjdk8下载地址:https://pan.baidu.com/s/1viksn3y3zfGqiYpS3TWHCw 提取码: urhd
(3)下载对应手机驱动
https://developers.google.cn/android/drivers#sailfishopm1.171019.011
pixel 1对应:Pixel binaries for Android 8.1.0 (OPM1.171019.012),第一个link