某头条安卓逆向学习------六神篇

1直接Hook大法

废话不多说咱们直接开始咱们这次的版本是9.5.1.0

请出我们的老朋友frida直接干 

Java.perform(function() {
    var className = "com.bytedance.frameworks.baselib.network.http.NetworkParams"; // 修改为类名
    var methodName = "tryAddSecurityFactor"; // 修改为方法名

    var hook = Java.use(className);
    hook[methodName].overload('java.lang.String', 'java.util.Map').implementation = function(str, map) {
        console.log("Hooking " + methodName + "...");
        console.log("str: " + str);
        
        // 遍历 HashMap 的键值对
        var keys = map.keySet().toArray();
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            var value = map.get(key);
            console.log("Key: " + key + ", Value: " + value);
        }

        // 或者直接访问特定键对应的值
        // var value = map.get("key");
        // console.log("Value: " + value);

        var result = this[methodName](str, map);
        console.log("Result: " + result);
        return result;
    };
});

 这一套下来X------参数全都有了,但是作为调用来说,还差点意思,每次都要启动一台机器来跑很麻烦,还担心app会挂掉。

2掏出我们的ExAndroidNativeEmu

还是废话不多说上代码

def get_sign(url, header_str):
    g_vfs_path = "%s/vfs" % os.path.dirname(os.path.abspath(__file__))
    emulator = Emulator(vfs_root=posixpath.join(posixpath.dirname(__file__), g_vfs_path), muti_task=True)
    vfs_path = emulator.get_vfs_root()
    libcm = emulator.load_library("%s/system/lib/libc.so" % vfs_path)
    libml = emulator.load_library("%s/data/data/com.ss.android.ugc.aweme/libmetasec_ml.so" % vfs_path, do_init=False)
    emulator.java_classloader.add_class(ms_bd_c_k)
    emulator.java_classloader.add_class(ms_bd_c_a0)
    emulator.java_classloader.add_class(MS)
    emulator.java_classloader.add_class(java_lang_Thread)
    emulator.call_symbol(libml, 'JNI_OnLoad', emulator.java_vm.address_ptr, 0x00)
    url_addr = emulator.call_symbol(libcm, 'malloc', len(url) + 1)
    header_str_addr = emulator.call_symbol(libcm, 'malloc', len(header_str) + 1)
    memory_helpers.write_utf8(emulator.mu, url_addr, url)
    memory_helpers.write_utf8(emulator.mu, header_str_addr, header_str)
    result_addr = emulator.call_native(libml.base + v:Dyfwsdy + 1, url_addr, header_str_addr)
    result = memory_helpers.read_utf8(emulator.mu, result_addr)
    sign = result.replace('\n', '@@@@').replace('\r', '')
    sign_list = sign.split('@@@@')
    json_sign = {
        sign_list[0]: sign_list[1],
        sign_list[2]: sign_list[3],
        sign_list[4]: sign_list[5],
        sign_list[6]: sign_list[7],
        sign_list[8]: sign_list[9],
        sign_list[10]: sign_list[11],
    }
    return json_sign

 这一套下来拿捏

抖音的六神算法0404是一种用于生成请求头中的x-gorgon和x-khronos参数的算法。这两个参数在抖音的API请求中起到了重要的作用,用于验证请求的合法性和防止恶意攻击。 具体来说,x-gorgon是一个用于验证请求合法性的参数,它是通过对请求参数进行加密生成的。而x-khronos是一个用于标识请求时间的参数,它是一个时间戳。 生成x-gorgon和x-khronos的具体步骤如下: 1. 将请求参数按照字典序排序,并将参数名和参数值拼接成一个字符串。 2. 在拼接的字符串后面加上一个固定的字符串,例如"35b11a5c4e8f4b5894c5f7d6c8f8a7b9"。 3. 对拼接后的字符串进行MD5加密,得到一个32位的字符串。 4. 将得到的32位字符串的前10位和后10位分别作为x-gorgon和x-khronos的值。 下面是一个示例代码,演示了如何使用Python生成x-gorgon和x-khronos: ```python import hashlib import time def generate_x_gorgon_x_khronos(params): # 将请求参数按照字典序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 拼接参数名和参数值 param_str = ''.join([f'{key}{value}' for key, value in sorted_params]) # 在拼接的字符串后面加上固定字符串 param_str += '35b11a5c4e8f4b5894c5f7d6c8f8a7b9' # 对拼接后的字符串进行MD5加密 md5_str = hashlib.md5(param_str.encode('utf-8')).hexdigest() # 获取x-gorgon和x-khronos的值 x_gorgon = md5_str[:10] x_khronos = md5_str[-10:] return x_gorgon, x_khronos # 示例参数 params = { 'param1': 'value1', 'param2': 'value2', 'param3': 'value3' } # 生成x-gorgon和x-khronos x_gorgon, x_khronos = generate_x_gorgon_x_khronos(params) print(f'x-gorgon: {x_gorgon}') print(f'x-khronos: {x_khronos}') ``` 这段代码会根据给定的请求参数生成对应的x-gorgon和x-khronos值。你可以根据实际情况修改示例参数来生成你需要的x-gorgon和x-khronos。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值