lsposed
lsposed模块开发
AndroidManifest.xml -> application 标签中加入以下内容
<meta-data android:name="xposedmodule" android:value="true" /><meta-data android:name="xposeddescription" android:value="xiaojianbang Hook Demo" /><meta-data android:name="xposedminversion" android:value="54" />
app -> build.gradle -> dependencies 中加入以下内容
compileOnly files('libs\\api.jar')
将 api.jar 放入 libs 目录下, 在 api.jar ...
androidSo
枚举各种let imports = Process.findModuleByName("libxiaojianbang.so").enumerateImports();for(let i =0; i<imports.length; i++){ let _import = imports[i]; if(_import.name.indexOf("pthread_create") !== -1){ console.log(JSON.stringify(_import)); }}let exports = Process.findModuleByName("libxiaojianbang.so").enumerateExports();for(let i =0; i<exports.length; i++){ let _export = exports[i]; if(_export.name.indexOf("Java ...
ARM汇编
寻址方式ARM汇编转换网站:https://armconverter.com/
寄存器间接寻址LDR指令将内存中的数据加载到寄存器中
ARM32: LDR R1, [R2] --> R1 = *R2处理器执行 LDR R1, [R2] 时,它会查看寄存器 R2 里存储的数值,将其作为一个内存地址,然后从这个内存地址对应的存储单元中读取数据,最后把读取到的数据存放到寄存器 R1 中。ARM64: LDR X1, [X2] --> X1 = *X2LDP X1, X2, [X0]从 X0 寄存器的值所表示的内存地址处,读取一个 64 位的数据,并将其存储到寄存器 X1 中。接着,从 X0 + 8(因为每个 64 位数据占 8 字节)所指向的内存地址处,再读取一个 64 位的数据,并将其存储到寄存器 X2 中。
STR指令将寄存器的数据存入内存中
ARM32: STR R1, [R2] --> *R2 = R1该指令会把寄存器 R1 里的数据存到以寄存器 R2 的值作为地址的内存单元中。比如,若 R1 中的值是 0x1234,R2 中的值是 0x40000000,那么就会 ...
ndk
学习目的:学会ndk编程编写基本c代码so中常用的log输出//引入头文件#include<android/log.h>//第一个参数为日志等级,第二个参数为tag,第三个参数为输出文本__android_log__print(int prio, const char* tag, const char* text);//为了方便起见,通常这样定义#define LOGD(......) __android_log__print(ANDROID_LOG_DEFAULT, TAG, __VA_ARGS__)
NDK多线程创建多线程//线程id,其实就是longpthread_t thread;//线程id 线程属性 函数 传递pthread_create(&thread, nullptr, myThread, nullptr);//等待线程执行完毕//默认的线程属性是joinable随着主线程结束而结束//线程属性是dettah,可以分离执行pthread_join(thread, nullptr);//子线程中使用它来退出线程pthread_exit(0)
传参 ...
frida的Python库使用
学习目标:了解frida的python库的使用为什么需要使用frida的python库
之前介绍的frida更多是用于手工调试阶段,如果要用代码自动化处理,还需要其他语言介入,比如python爬虫
后续介绍的frida算法转发方案的rpc也需要使用python,算法转发和rpc能给逆向带来无比便捷的体验
frida可以实时与python进行数据交互,可以把数据发送给python,等待python处理完后,接收返回值,frida再接着往下执行代码
python提供的各种库,让代码编写更为简单
包名注入# -*- coding: UTF-8 -*-import frida, sysjsCode = """ Java.perform(function(){ var RequestUtil = Java.use('com.dodonew.online.http.RequestUtil'); RequestUtil.encodeDesMap.overload('java.lang.Strin ...
某些app的逆向实战
x圈目标:逆向分析出其登录数据包中的各种字段抓包分析
发现了有一个加密字段codeSign
跑一下java层自吐算法脚本
Java.perform(function () { function showStacks() { console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.lang.Throwable").$new() ) ); } function logOutPut(msg) { Java.use("android.util.Log").d("xiaojianbang", "frida inject: " + msg); } var By ...
frida脚本开发
学习目标:能够使用frida开发出简单的脚本,hook系统函数工具函数的封装Java.perform(function () { function showStack(){ var log = Java.use("android.util.Log"); var throwable = Java.use("java.lang.Throwable"); console.log(log.getStackTraceString(throwable.$new())); } var ByteString = Java.use("com.android.okhttp.okio.ByteString"); function toBase64(tag, data) { console.log(tag + " Base64: ", ByteString.of(data).base64()); } ...
frida相关API详解
学习目标:熟练使用frida对Java层代码进行hook静态方法和实例方法的hook
不需要管修饰符,不需要区分静态和实例方法,都是使用Java.use
Java.perform(function(){ var money = Java.use("com.xiaojianbang.hook.Money"); money.getInfo.implementation = function () { var result = this.getInfo(); console.log("money.getInfo result: ", result) return result; } money.setFlag.implementation = function (a) { console.log("money.setFlag param: ", a); return this.setFlag(a); ...
Java层关键代码快速定位
学习目标:能使用frida快速定位到关键代码函数调用栈的打印function showStacks(){ var Log = Java.use("android.util.Log"); var Throwable = Java.use("java.util.Throwable"); console.log(Log.getStackTraceString(Throwable.$new()))}
常用系统关键函数java.util.HashMapputJava.perform(function(){ function showStack(){ var log = Java.use("android.util.Log"); var throwable = Java.use("java.lang.Throwable"); console.log(log.getStackTraceString(throwa ...
app的简单防护
学习目标:了解一些app的防护措施,能对自己写的app做一些简单防护反编译一个app时搜索不到关键字
HTML5的App
字符串被加密了
反射调用相关类
动态加载dex
热修复
简单的字符串加密的实现dex的字符串加密可以用代码自动实现,需要使用到dexlib2这个库
若是不加任何防护,在登陆操作时,我们将密码发送给服务器,攻击者再抓包后直接反编译然后搜索password便可以定位到关键代码
package com.example.encrypt;import android.os.Build;import android.os.Bundle;import androidx.activity.EdgeToEdge;import androidx.appcompat.app.AppCompatActivity;import androidx.core.graphics.Insets;import androidx.core.view.ViewCompat;import androidx.core.view.WindowInsetsCompat;import java.security. ...