app安全之安卓native层安全分析(二):unidbg+ida使用+过签名校验

这篇具有很好参考价值的文章主要介绍了app安全之安卓native层安全分析(二):unidbg+ida使用+过签名校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

继续跟着龙哥的unidbg学习:SO入门实战教程二:calculateS_so _白龙~的博客-CSDN博客

还是那句,我会借鉴龙哥的文章,以一个初学者的角度,加上自己的理解,把内容丰富一下,尽量做到不在龙哥的基础上画蛇添足,哈哈。感谢观看的朋友

分析

首先抓包分析:

unidbg 使用,安卓安全分析,android,安全,java

其中,里面的s就是今天的需要分析的加密参数了。

调试

老样子,打开jadx,发现没壳,可以的,直接看吧,拿着这几个参数一顿搜,直接搜【p】

unidbg 使用,安卓安全分析,android,安全,java

感觉有两个地方很可疑,进去一看:

unidbg 使用,安卓安全分析,android,安全,java

跟下调用栈,很快就找到这里:

unidbg 使用,安卓安全分析,android,安全,java

ok,用objection hook下,发现确实调用了这里

unidbg 使用,安卓安全分析,android,安全,java

再仔细看看这里,明显这里很奇怪了

unidbg 使用,安卓安全分析,android,安全,java

unidbg 使用,安卓安全分析,android,安全,java

ok,终于到这里了,这里就跟龙哥给的位置一致了

unidbg 使用,安卓安全分析,android,安全,java

先不急着用unidbg,先调试下,hook下这个方法,哎哟,我擦,这直接就对上了

unidbg 使用,安卓安全分析,android,安全,java

看看这三个参数 ,一个是context,上下文,又叫寄存器,第二个是账号密码加起来,第三个就是一个特殊的值,大概率是加的盐,刺激。

unidbg调试

1.ida分析

先用ida打开看看:发现是静态注册的,可以的

unidbg 使用,安卓安全分析,android,安全,java

选中a1

unidbg 使用,安卓安全分析,android,安全,java

然后按键盘【y】 ,把第一个参数的类型改成JNIEnv *,这样就可以更好的反编译c代码:

unidbg 使用,安卓安全分析,android,安全,java

点ok,瞬间这段代码的可读性就更强了

unidbg 使用,安卓安全分析,android,安全,java

大概看了一眼,反正前面有个if判断,然后就进入主逻辑,然后返回

选到这个函数

unidbg 使用,安卓安全分析,android,安全,java

然后按【tab】 键:这个0x1E7C就是这个函数的地址了。记一下,后面会用到

unidbg 使用,安卓安全分析,android,安全,java

2.搭架子

开始搭建unidbg的架子,新建一个文件,然后把apk和目标so文件放进去

unidbg 使用,安卓安全分析,android,安全,java

先把架子搭起来,这里我们直接复制前面oasis的:

  

package com.weibo;



import com.github.unidbg.AndroidEmulator;

import com.github.unidbg.Module;

import com.github.unidbg.linux.android.AndroidEmulatorBuilder;

import com.github.unidbg.linux.android.AndroidResolver;

import com.github.unidbg.linux.android.dvm.*;

import com.github.unidbg.memory.Memory;

import com.github.unidbg.pointer.UnidbgPointer;

import com.github.unidbg.utils.Inspector;

import com.sun.jna.Pointer;

import keystone.Keystone;

import keystone.KeystoneArchitecture;

import keystone.KeystoneEncoded;

import keystone.KeystoneMode;



import java.io.File;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;



public class international extends AbstractJni {

    private final AndroidEmulator emulator;

    private final VM vm;

    private final Module module;



    international() {

        // 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验

        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.weibo.international").build();

        // 获取模拟器的内存操作接口

        final Memory memory = emulator.getMemory();

        // 设置系统类库解析

        memory.setLibraryResolver(new AndroidResolver(23));

        // 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作

        vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\weibo\\sinaInternational.apk"));

        // 加载目标SO

        DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\weibo\\libutility.so"), true); // 加载so到虚拟内存

        //获取本SO模块的句柄,后续需要用它

        module = dm.getModule();

        vm.setJni(this); // 设置JNI

        vm.setVerbose(true); // 打印日志

//        dm.callJNI_OnLoad(emulator); // 调用JNI OnLoad

    }



    public static void main(String[] args) {

        international test = new international();

        System.out.println(test);

    }

     



}

unidbg 使用,安卓安全分析,android,安全,java

运行下,没啥问题

unidbg 使用,安卓安全分析,android,安全,java

2.地址调用

方法先写好,参数还是用list,然后用vm.addLocalObject包装一下添加进去,第一个参数是context,直接给个空就行,剩下的参数直接复制hook到的放进去

unidbg 使用,安卓安全分析,android,安全,java

好的,现在运行一下

unidbg 使用,安卓安全分析,android,安全,java

3.找异常执行原因——签名校验,以及绕过 

 可以的,跟龙哥的博客一样,报错了,然后找找日志,看看上面的一个

unidbg 使用,安卓安全分析,android,安全,java

复制这个地址,ida里,按键盘【g】输入地址跳转过去

unidbg 使用,安卓安全分析,android,安全,java

跳转到这里:

unidbg 使用,安卓安全分析,android,安全,java

 改下JNIEnv

unidbg 使用,安卓安全分析,android,安全,java

 好的,根据龙哥说的,有packagemanagger之类的,大概率是签名检测

unidbg 使用,安卓安全分析,android,安全,java

选中这个方法,按【x】找交叉引用

unidbg 使用,安卓安全分析,android,安全,java

很有缘分的又看到了这个sub_1c60

unidbg 使用,安卓安全分析,android,安全,java

进去看:

unidbg 使用,安卓安全分析,android,安全,java

再回到这里,应该就是这个判断了

unidbg 使用,安卓安全分析,android,安全,java

按下tab键,记住地址,就是这个0xFFF7EBFE了

unidbg 使用,安卓安全分析,android,安全,java

要能返回是true才给过,ok,直接把这里hook下,也就是直接这么改下,

unidbg 使用,安卓安全分析,android,安全,java

在java层里,我们直接hook这个方法修改返回值为1就行,但是在这里,是在so里面,怎么搞呢?根据龙哥说的,用arm指令修改就行

Online ARM to HEX Converter (armconverter.com)

unidbg 使用,安卓安全分析,android,安全,java

用上面的地址,写个过验证的:

unidbg 使用,安卓安全分析,android,安全,java

龙哥还给了另一种patch的方法:

  

public void patchverfify(){

        int patchCode = 0x4FF00100;

        emulator.getMemory().pointer(module.base+0x1E86).setInt(0,patchCode);

    }



    public void patchVerify1(){

        Pointer pointer = UnidbgPointer.pointer(emulator, module.base + 0x1E86);

        assert pointer != null;

        byte[] code = pointer.getByteArray(0, 4);

        if (!Arrays.equals(code, new byte[]{ (byte)0xFF, (byte) 0xF7, (byte) 0xEB, (byte) 0xFE })) { // BL sub_1C60

            throw new IllegalStateException(Inspector.inspectString(code, "patch32 code=" + Arrays.toString(code)));

        }

        try (Keystone keystone = new Keystone(KeystoneArchitecture.Arm, KeystoneMode.ArmThumb)) {

            KeystoneEncoded encoded = keystone.assemble("mov r0,1");

            byte[] patch = encoded.getMachineCode();

            if (patch.length != code.length) {

                throw new IllegalStateException(Inspector.inspectString(patch, "patch32 length=" + patch.length));

            }

            pointer.write(0, patch, 0, patch.length);

        }

    }

然后执行下,ok,这就出来了,舒服: 

unidbg 使用,安卓安全分析,android,安全,java

但是好像跟hook到的返回不一样:

unidbg 使用,安卓安全分析,android,安全,java

不急,再来看看,擦,复制的时候,激动了,把逗号复制进去了

unidbg 使用,安卓安全分析,android,安全,java

ok,这下对上了,跟hook的结果一致

unidbg 使用,安卓安全分析,android,安全,java

代码

  

package com.weibo;



import com.github.unidbg.AndroidEmulator;

import com.github.unidbg.Module;

import com.github.unidbg.linux.android.AndroidEmulatorBuilder;

import com.github.unidbg.linux.android.AndroidResolver;

import com.github.unidbg.linux.android.dvm.*;

import com.github.unidbg.memory.Memory;

import com.github.unidbg.pointer.UnidbgPointer;

import com.github.unidbg.utils.Inspector;

import com.sun.jna.Pointer;

import keystone.Keystone;

import keystone.KeystoneArchitecture;

import keystone.KeystoneEncoded;

import keystone.KeystoneMode;



import java.io.File;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;



public class international extends AbstractJni {

    private final AndroidEmulator emulator;

    private final VM vm;

    private final Module module;



    international() {

        // 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验

        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.weibo.international").build();

        // 获取模拟器的内存操作接口

        final Memory memory = emulator.getMemory();

        // 设置系统类库解析

        memory.setLibraryResolver(new AndroidResolver(23));

        // 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作

        vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\weibo\\sinaInternational.apk"));

        // 加载目标SO

        DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\weibo\\libutility.so"), true); // 加载so到虚拟内存

        //获取本SO模块的句柄,后续需要用它

        module = dm.getModule();

        vm.setJni(this); // 设置JNI

        vm.setVerbose(true); // 打印日志

//        dm.callJNI_OnLoad(emulator); // 调用JNI OnLoad

    }



    public static void main(String[] args) {

        international test = new international();

        test.patchverfify();

        System.out.println(test.calculateS());

    }

    public void patchverfify(){

        int patchCode = 0x4FF00100;

        emulator.getMemory().pointer(module.base+0x1E86).setInt(0,patchCode);

    }



    public void patchVerify1(){

        Pointer pointer = UnidbgPointer.pointer(emulator, module.base + 0x1E86);

        assert pointer != null;

        byte[] code = pointer.getByteArray(0, 4);

        if (!Arrays.equals(code, new byte[]{ (byte)0xFF, (byte) 0xF7, (byte) 0xEB, (byte) 0xFE })) { // BL sub_1C60

            throw new IllegalStateException(Inspector.inspectString(code, "patch32 code=" + Arrays.toString(code)));

        }

        try (Keystone keystone = new Keystone(KeystoneArchitecture.Arm, KeystoneMode.ArmThumb)) {

            KeystoneEncoded encoded = keystone.assemble("mov r0,1");

            byte[] patch = encoded.getMachineCode();

            if (patch.length != code.length) {

                throw new IllegalStateException(Inspector.inspectString(patch, "patch32 length=" + patch.length));

            }

            pointer.write(0, patch, 0, patch.length);

        }

    }

    public String calculateS() {

        List<Object> list = new ArrayList<>(10);

        list.add(vm.getJNIEnv()); // arg1,env

        list.add(0); // arg2,jobject

        DvmObject<?> context = vm.resolveClass("android/content/Context").newObject(null);

        list.add(vm.addGlobalObject(context));

        list.add(vm.addLocalObject(new StringObject(vm, "135691695686123456789")));

        list.add(vm.addLocalObject(new StringObject(vm, "CypCHG2kSlRkdvr2RG1QF8b2lCWXl7k7")));

        Number number = module.callFunction(emulator, 0x1E7C + 1, list.toArray());



        String result = vm.getObject(number.intValue()).getValue().toString();

        return result;

    }





}

4.符号调用

 前面都是地址调用,而龙哥自己也说过,他喜欢用地址调用。不过这里,总要学习下,怎么符号调用

怎么找符号,首选选中这个方法:

unidbg 使用,安卓安全分析,android,安全,java

然后按tab键,进入汇编页面:

unidbg 使用,安卓安全分析,android,安全,java

然后再按空格,然后这个export就是要用的符号表了,注意了,这是只是刚好都一样,很多时候,这三个,不一样的,找准export的才行

unidbg 使用,安卓安全分析,android,安全,java

 开始调用,就换了下名字,其他都没变,对比两个不同的调用方式,结果一样,没毛病

unidbg 使用,安卓安全分析,android,安全,java

代码:

  

package com.weibo;



import com.github.unidbg.AndroidEmulator;

import com.github.unidbg.Module;

import com.github.unidbg.linux.android.AndroidEmulatorBuilder;

import com.github.unidbg.linux.android.AndroidResolver;

import com.github.unidbg.linux.android.dvm.*;

import com.github.unidbg.memory.Memory;

import com.github.unidbg.pointer.UnidbgPointer;

import com.github.unidbg.utils.Inspector;

import com.sun.jna.Pointer;

import keystone.Keystone;

import keystone.KeystoneArchitecture;

import keystone.KeystoneEncoded;

import keystone.KeystoneMode;



import java.io.File;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;



public class international extends AbstractJni {

    private final AndroidEmulator emulator;

    private final VM vm;

    private final Module module;



    international() {

        // 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验

        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.weibo.international").build();

        // 获取模拟器的内存操作接口

        final Memory memory = emulator.getMemory();

        // 设置系统类库解析

        memory.setLibraryResolver(new AndroidResolver(23));

        // 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作

        vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\weibo\\sinaInternational.apk"));

        // 加载目标SO

        DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\weibo\\libutility.so"), true); // 加载so到虚拟内存

        //获取本SO模块的句柄,后续需要用它

        module = dm.getModule();

        vm.setJni(this); // 设置JNI

        vm.setVerbose(true); // 打印日志

//        dm.callJNI_OnLoad(emulator); // 调用JNI OnLoad

    }



    public static void main(String[] args) {

        international test = new international();

        test.patchverfify();

        System.out.println("offset===>:" + test.calculateS());

        System.out.println("symbol===>:" + test.calculateS1());

    }



     

     

    public String calculateS1() {

        List<Object> list = new ArrayList<>(10);

        list.add(vm.getJNIEnv()); // arg1,env

        list.add(0); // arg2,jobject

        DvmObject<?> context = vm.resolveClass("android/content/Context").newObject(null);

        list.add(vm.addGlobalObject(context));

        list.add(vm.addLocalObject(new StringObject(vm, "135691695686123456789")));

        list.add(vm.addLocalObject(new StringObject(vm, "CypCHG2kSlRkdvr2RG1QF8b2lCWXl7k7")));

        Number number = module.callFunction(emulator, "Java_com_sina_weibo_security_WeiboSecurityUtils_calculateS", list.toArray());

        String result = vm.getObject(number.intValue()).getValue().toString();

        return result;

    }



    public void patchverfify() {

        int patchCode = 0x4FF00100;

        emulator.getMemory().pointer(module.base + 0x1E86).setInt(0, patchCode);

    }



    public void patchVerify1() {

        Pointer pointer = UnidbgPointer.pointer(emulator, module.base + 0x1E86);

        assert pointer != null;

        byte[] code = pointer.getByteArray(0, 4);

        if (!Arrays.equals(code, new byte[]{(byte) 0xFF, (byte) 0xF7, (byte) 0xEB, (byte) 0xFE})) { // BL sub_1C60

            throw new IllegalStateException(Inspector.inspectString(code, "patch32 code=" + Arrays.toString(code)));

        }

        try (Keystone keystone = new Keystone(KeystoneArchitecture.Arm, KeystoneMode.ArmThumb)) {

            KeystoneEncoded encoded = keystone.assemble("mov r0,1");

            byte[] patch = encoded.getMachineCode();

            if (patch.length != code.length) {

                throw new IllegalStateException(Inspector.inspectString(patch, "patch32 length=" + patch.length));

            }

            pointer.write(0, patch, 0, patch.length);

        }

    }



    public String calculateS() {

        List<Object> list = new ArrayList<>(10);

        list.add(vm.getJNIEnv()); // arg1,env

        list.add(0); // arg2,jobject

        DvmObject<?> context = vm.resolveClass("android/content/Context").newObject(null);

        list.add(vm.addGlobalObject(context));

        list.add(vm.addLocalObject(new StringObject(vm, "135691695686123456789")));

        list.add(vm.addLocalObject(new StringObject(vm, "CypCHG2kSlRkdvr2RG1QF8b2lCWXl7k7")));

        Number number = module.callFunction(emulator, 0x1E7C + 1, list.toArray());



        String result = vm.getObject(number.intValue()).getValue().toString();

        return result;

    }





}

部署

有没有想过,搞的这个,如果想部署成一个web服务,以供后续的业务代码调用呢?不然这么个项目,部署在服务器上,然后 每次启动都调用unidbg,说实话不是太现实,所以这里就需要把unidbg打包成jar包:

最实用且简单的方法:

1.

unidbg 使用,安卓安全分析,android,安全,java

 2.

unidbg 使用,安卓安全分析,android,安全,java

 3.

unidbg 使用,安卓安全分析,android,安全,java

unidbg 使用,安卓安全分析,android,安全,java

 4.

unidbg 使用,安卓安全分析,android,安全,java

unidbg 使用,安卓安全分析,android,安全,java

 5.

unidbg 使用,安卓安全分析,android,安全,java

 6.

unidbg 使用,安卓安全分析,android,安全,java

等待结果:

unidbg 使用,安卓安全分析,android,安全,java

然后根目录就会多一个out目录:

unidbg 使用,安卓安全分析,android,安全,java

7.这个文件就是最后能直接通过java执行的:

unidbg 使用,安卓安全分析,android,安全,java

但是有个问题,我们写的apk和so文件,给定的地址是unidgb-android/src里的

unidbg 使用,安卓安全分析,android,安全,java

 要打包的话,就得改下路径,改成相对路径

unidbg 使用,安卓安全分析,android,安全,java

然后删除out文件夹,重新上面的打包操作,然后把apk和so放到跟unidbg-jar同级的目录:

unidbg 使用,安卓安全分析,android,安全,java

这样就好了, 终端执行看看,很好,结果也有的,这样就可以把这个out包整个打包 ,然后部署到服务器上就行了。

unidbg 使用,安卓安全分析,android,安全,java

还有更多的打包方式:

Unidbg打Jar包方式_unidbg打包成jar_Forgo7ten的博客-CSDN博客

知识点总结

1.ida,按y修改JNIEnv,IDA 7.5之前,JNIEnv需要导入jni.h,7.5之后不需要导入jni.h文件

2.ida,按g 输入地址跳转

3.ida,按x,查看交叉引用

4.ida,optional->generel,把这个改成4,可以查看架构模式,arm架构是固定4位,thumb架构是混合的

unidbg 使用,安卓安全分析,android,安全,java

5. 有签名校验的需要去patch,patch的时候不能+1,只有运行和hook的时候才+1

6.setJNIload方法只有动态注册方法的时候才执行,静态注册的不用执行

7.keystone,是将汇编语言转成地址的。capstone是将地址转成汇编语言的

8.在线汇编和地址互转的网站:https://armconverter.com/

9.参数的基本类型,比如int,long等,其他的对象类型一律要手动 addLocalObject,其中context对象用:

DvmObject<?> context = vm.resolveClass("android/content/Context").newObject(null);// context

list.add(vm.addLocalObject(context))

10.找准一行汇编,Alt+G快捷键,查看架构类型,值为1则是thumb,为0则是arm,如果ida解析有误,可以手动修改这个值

11.RM调用约定,入参前四个分别通过R0-R3调用,返回值通过R0返回

12.unidbg的项目可以打包成java包执行

结语

说实话,目前来说,不难,得后续的大厂项目才会很难文章来源地址https://www.toymoban.com/news/detail-799007.html

到了这里,关于app安全之安卓native层安全分析(二):unidbg+ida使用+过签名校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓APP证书Android签名证书.keystore文件制作生成

    将app发布到应用宝时,而上传安装包时提示如下图时, 但您或您的团队从未上传该应用,您可以通过认领功能认领应用。认领成功后该应用会自动转入您的账户下,同时保留应用全部数据,您可以在应用管理中进行管理。 1.点击认领应用 ,确认需认领应用的包名是否是你的

    2024年02月02日
    浏览(50)
  • APP备案,最新获取安卓签名文件中MD5等信息方法

    直接通过cmd执行命令 输入后回车会提示输入密码库口令,直接输入Keystore密码(输入过程中终端上不会显示,输完回车就行) 由于上述以前这种方式是可以打印出MD5,现在这种方式却没把MD5值打印出来,处理办法如下 直接在as中的Terminal工具在命令行中输入gradle命令: 1.导出

    2024年01月21日
    浏览(45)
  • 【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

    课程作业要求使用反编译技术,在游戏中实现无碰撞。正常情况下碰撞后角色死亡,修改为直接穿过物体不死亡。 il2CppDumper。 DnSpy。 IDA Pro。 AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_game}.zip,使用解压工具解压至文件夹{my_game}。(my_game为apk的文件

    2024年02月05日
    浏览(42)
  • unidbg-补签名环境MethodID问题

    methodID 可以通过log4j开启debug模式,循环去找;

    2024年02月11日
    浏览(41)
  • 玩机搞机---修改系统固件不开机 安卓13去除系统app签名验证的几种方法

        谷歌在安卓13中对系统应用添加了一层校验验证,你如果修改了系统app.那么原有的签名加载后过不去验证,会导致进不去系统卡第一屏或者进入系统后修改的app错误等等故障。 Android 13增加了新的apk签名校验机制,现在开机中它会对所有系统分区(可能包括system、system_

    2024年02月12日
    浏览(61)
  • [系统安全] 五十五.恶意软件分析 (7)IDA Python基础用法及CFG控制流图提取详解[上]

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更

    2024年01月23日
    浏览(43)
  • APP分发管理系统仿第八区分发系统|安卓apk苹果ipa封装网站,苹果免签封装网站,多语种下载页|内测分发|超及签名|企业签名|应用封装

    演示请联系我私信我 APP分发管理系统仿第八区分发系统|安卓apk苹果ipa封装网站,苹果免签封装网站,多语种下载页|内测分发|超及签名|企业签名|应用封装 平台特色 1. 支持自适应安卓和苹果设备分发,通过技术手段保障稳定安装。 2. 可以智能提取 APP 应用信息、自动生成

    2024年02月05日
    浏览(49)
  • 恶意代码分析实战--IDA pro的使用及课后练习l

    函数窗口 Functions window  位于左半部分 列举可执行文件中的所有函数,可以在众多函数中过滤出想要的函数。这个窗口也对每一个函数关联了一些标志(F L S等),这其中最有用的是L,指明是库函数。 字符串窗口 Strings window (Shift + F12) 显示所有的字符串,可以右键Setup来修

    2024年02月05日
    浏览(43)
  • 【安卓安全】透明代理定向抓APP包

    参考了以下大佬的文章: 文章一 文章二 文章三 工具:iptables + redsocks2 + Charles 要使用charles抓https的流量,就需要正确配置证书,并将证书设置为系统证书,这里开始踩了坑,我只是配置了用户证书,在安卓7之后的版本中,一般的直接安装证书,只是安装到用户证书,而要想

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包