首页 > 其他分享 >【安卓逆向】从逆向登录协议开始到frida rpc的初探

【安卓逆向】从逆向登录协议开始到frida rpc的初探

时间:2024-04-17 23:23:17浏览次数:28  
标签:逆向 加密 String map ximalaya 安卓 rpc android com

本来是闲着无聊逆向一下喜马拉雅的登录协议

日常抓包,分析数据包,有一个password字段

想分析一下这个password这个字段,jadx搜索一下啊

 

经过frida多次的hook定位,发现这个方法便是加密过程,点进去

可以hook一下这个方法查看一下

function hook() {
    let LoginRequest = Java.use("com.ximalaya.ting.android.loginservice.LoginRequest");

    LoginRequest["a"].overload('androidx.fragment.app.FragmentActivity', 'com.ximalaya.ting.android.loginservice.base.d', 'java.util.Map', 'com.ximalaya.ting.android.loginservice.base.a').implementation = function (fragmentActivity, iRequestData, map, iDataCallBackUseLogin) {
        console.log(`LoginRequest.m65178a is called:`);

        if (map !== null) {
            if (map.containsKey("account")) {
                console.log(` - account: ${map.get("account")}`);
            }

            if (map.containsKey("password")) {
                console.log(` - password: ${map.get("password")}`);
            }
        }

        // 保留原始方法调用
        this["a"].call(this, fragmentActivity, iRequestData, map, iDataCallBackUseLogin);
    };
}

然后重新登录,输入账号密码,发现确实hook到了

最后锁定加密代码

这里调用 

LoginEncryptUtil.m65187a().m65184a(str);

进行加密,点进去看一下m65184a函数

package com.ximalaya.ting.android.loginservice;

import android.content.Context;
import com.huawei.hms.framework.common.ContainerUtils;
import java.util.Map;
import java.util.TreeMap;

/* loaded from: classes3.dex */
public class LoginEncryptUtil {
    private native String BEfHgGMDiX(Context context, Map<String, String> map);

    private native String SudCmgZCdt(String str);

    private native String jwpAFNrLmt(Context context, boolean z, String str);

    static {
        System.loadLibrary("login_encrypt");
    }

    /* renamed from: com.ximalaya.ting.android.loginservice.LoginEncryptUtil$a */
    /* loaded from: classes3.dex */
    private static class C24706a {

        /* renamed from: a */
        private static final LoginEncryptUtil f85016a = new LoginEncryptUtil();
    }

    /* renamed from: a */
    public static LoginEncryptUtil m65187a() {
        return C24706a.f85016a;
    }

    /* renamed from: a */
    public String m65185a(Context context, boolean z, Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        TreeMap treeMap = new TreeMap(map);
        StringBuilder sb = new StringBuilder();
        for (Map.Entry entry : treeMap.entrySet()) {
            sb.append((String) entry.getKey());
            sb.append(ContainerUtils.KEY_VALUE_DELIMITER);
            sb.append((String) entry.getValue());
            sb.append("&");
        }
        return jwpAFNrLmt(context, z, sb.toString());
    }

    /* renamed from: a */
    public String m65184a(String str) {
        return SudCmgZCdt(str);
    }

    /* renamed from: a */
    public String m65186a(Context context, Map<String, String> map) {
        return BEfHgGMDiX(context, map);
    }
}

最后调用so层函数进行加密,ida分析一下这个,找到这个加密函数

追进去,我滴乖乖!

ollvm混淆又来了,逆向是不可能逆了,这里可以使用unidbg模拟so库把password的加密结果计算出来,毕竟如果要做登录协议,也不一定非得把算法逆向出来,只需要得到加密值就行,因为unidbg需要补环境,这里使用frida rpc

调用实现在python代码中获取加密值

首先发现

这个方法是静态的,返回值就是加密结果,可以直接frida直接调用改方法,改成rpc调用形式

function hook_encryt(phone){
    var string;
    Java.perform(function(){
    let C24795g = Java.use("com.ximalaya.ting.android.loginservice.g");
    var javaString = Java.use("java.lang.String");
    string = C24795g.c(javaString.$new(phone));
    console.log(string)

    })
    return string  //返回值需要放到Java.perform外面
   
}

rpc.exports={
    method:hook_encryt
}

然后在python中进行调用

import frida
import time

device = frida.get_usb_device()
print(device)

pid=device.spawn(["com.ximalaya.ting.android"]) #启动目标app
device.resume(pid)
time.sleep(1)

session=device.attach(pid) 

with open("hook3.js") as f:
    script=session.create_script(f.read())    #加载脚本

script.load()
api=script.exports #获取导出函数列表

print("method==>>"+api.method("GGbomb"))

可以执行,看一下结果:

可以发现结果出来了

标签:逆向,加密,String,map,ximalaya,安卓,rpc,android,com
From: https://www.cnblogs.com/GGbomb/p/18142043

相关文章

  • Rust gRPC 开发 todo-demo
    在這篇文章中,我們將使用gRPC創建一個基本的Todo應用程序。首先,我們將非常快速的概述一下gRPC和ProtocolBuffers。什麼是gRPC?gRPC是一個現代的開源的高性能遠程過程調用(RPC)框架,可以在任何環境下運行。RPC代表遠程過程調用(RemoteProcedureCall),開頭的g代表通......
  • 阿里bxet逆向
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站x82y分析过程参数直接搜索etSign通过可以看到是在et_f文件生成参数 window.etSign("GE......
  • GRPC - Debugging: Using Wireshark
      ......
  • GRPC - Debugging: Server Reflection
      ......
  • GRPC - Load testing Production-Grade APIs
      https://ghz.sh/  ......
  • GRPC - Unit testing Production-Grade APIs
      ......
  • GRPC - Validating requests
      ......
  • GRPC - Distributing requests with load balancing
         ......
  • SRPCore GenerateHLSL解析及其扩展
    序言在之前的项目开发HDRP的时候,就觉得绑定RT的管理就像一坨屎一样难受,改了管线RT的绑定顺序,原来的Shader输出又会有问题(主要是SV_Target顺序问题),没办法只能够在管线原来的绑定上面,重新写了一份文件,让Shader的共用Pass引用,这样就能规范不同Shaderpass的输出了。但是这只是解......
  • CTFshow Reverse 逆向4 学习记录
     题目 分析过程 是一个无壳,64位的文件丢到IDA里面,找到main函数1int__cdecl__noreturnmain(intargc,constchar**argv,constchar**envp)2{3__int64v3;//rdx4char*v4;//[rsp+20h][rbp-18h]56qword_140004618=(__int64)malloc(1......