文章目录[隐藏]
android 逆向 12 / 38
- app OAuth api_sign 分析
- app sig 参数加密分析 unidbg 模拟黑盒调用
- app sign so 加密参数破解|unidbg
- sgmain x-sign 分析 - unidbg
- androidAsync fridaManager sgmain 70102 rpc 远程调用
- app edata 参数 so aes 加密分析破解|unidbg
- frida 加载 sekiro dex 文件 实现与服务端交互
- frida sekiro 实现 sgmain 70102 远程 rpc 调用
- xposed sekiro hook 获取 wx 万能 key
- unidbg console debugger 使用
- unidbg hook inline hook 使用
- app 公众号文章列表 so 加解密算法分析还原 | 简单分析
- app 公众号文章列表 so 加解密算法分析还原 | 加密 rsa base64 分析
- app 公众号文章列表 so 加解密算法分析还原 | 加密 zip aes 分析
- app 公众号文章列表 so 加解密算法分析还原 | response 内容解密分析
- app sign so 加密算法分析还原|简单分析
- app sign so 加密算法分析还原|so 算法分析
- app sign so 加密算法分析还原|so sub_126AC 函数算法还原
- app so signkeyV1 参数分析
- ida 动态调试 android so 文件|基础入门环境搭建
- app so newSign 参数分析破解
- app tzRgz52a 参数分析破解
- app sign-v2 签名算法 aes 加解密分析
- app so 加密参数分析|protocbuf 分析
- mxtakatak android app 加解密分析
- android app so 加密算法分析破解|mtgsig unidbg
- android app so 加密算法分析破解|siua unidbg
- android app nsign so 加密算法分析
- android app sig 参数 so 加密逻辑逆向分析
- android app so sig 加密参数 unidbg
- 狗狗音乐登陆协议加密参数逆向分析
- android sign so 加密参数分析|unidbg
- android app X-SS-QUERIES 参数分析
- unidbg android app xgorgon 加密参数 leviathan
- sgmain 6.4.x xsign 加密算法分析研究
- sgmain 6.4.x xminiwua 加密算法分析研究
- 某 app mas 算法分析还原 cms so
- 某东登陆协议 tlv 逻辑分析
仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。
const 龙哥 = Function() {}
const a = 全能的傻宝,每天都会换一种姿势来分享各种操作,最近 10 月在分享密码学;
const b = 点击加入星球;
return "无敌的龙哥";
前言
最近在学习
so
加解密逆向分析,算法还原,就拿星主分析过的一个样本来练手,那个星主?
当然是call 龙哥 ();
样本
某狗搜索 app 版本
7.9.6.6
主要分析 wx 公众号文章请求参数的加解密
以上是抓包截图,请求跟响应都是加密串,主要是分析这些
jadx 分析
jadx-gui
打开之后,开始搜索,这里因为请求没啥关键字,搜索 url
即可,出来一个结果点进去看看
这里调用了两个函数 encrypt dencrypt
应该就是加解密了,跳转到声明函数的地方
进来发现全部是 navite
函数,这里加载了一个 so
文件,navite
的实现应该就在这里
使用 ida
打开看一下
ida 分析
打开 ida -> exports
窗口,搜索 java
发现这里是静态注册的函数,刚好对应 java
层的四个函数
先分析到这里,下篇文章在分析 so
具体的算法实现,下面使用 frida hook
验证一下
frida hook
function hook() {
var ScEncryptWall = Java.use('com.sogou.scoretools.ScEncryptWall');
ScEncryptWall.decrypt.implementation = function (a) {
console.log('decrypt.a: ', a);
var res = this.decrypt(a);
console.log('decrypt.res: ', res);
console.log('decrypt.res: ', Java.use('java.lang.String').$new(res));
return res;
}
ScEncryptWall.encrypt.implementation = function (a, b, c) {
console.log('encrypt.a: ', a);
console.log('encrypt.b: ', b);
console.log('encrypt.c: ', c);
var res = this.encrypt(a, b, c);
console.log('encrypt.res: ', res);
return res;
}
}
function main() {
Java.perform(function () {
hook();
})
}
setImmediate(main);
结果全部 hook
出来了,跟抓包结果对比是一样的,在使用 unidbg
跑起来
unidbg
package com.xiayu.sougou;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.debugger.Debugger;
import com.github.unidbg.hook.hookzz.HookZz;
import com.github.unidbg.hook.hookzz.IHookZz;
import com.github.unidbg.hook.xhook.IxHook;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.XHookImpl;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import com.sun.jna.Pointer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SouGou extends AbstractJni {
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
public String apkPath = "/Users/admin/Desktop/android/file/sougou-7.9.6.6.apk";
public String soPath = "unidbg-android/src/test/resources/test_so/sougou/libSCoreTools-7.9.6.6.so";
private static LibraryResolver createLibraryResolver() {
return new AndroidResolver(23);
}
private static AndroidEmulator createARMEmulator() {
return AndroidEmulatorBuilder
.for32Bit()
// .setProcessName("com.sogou.activity.src")
// .setRootDir(new File("appFile/sougou-7966"))
.build();
}
public SouGou() {
emulator = createARMEmulator();
final Memory memory = emulator.getMemory();
memory.setLibraryResolver(createLibraryResolver());
vm = emulator.createDalvikVM(new File(apkPath));
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary(new File(soPath), false);
vm.setJni(this);
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
}
public void encrypt() {
List<Object> list = new ArrayList<>(10);
list.add(vm.getJNIEnv());
list.add(0);
list.add(vm.addLocalObject(new StringObject(vm, "http://app.weixin.sogou.com/api/searchapp1")));
list.add(vm.addLocalObject(new StringObject(vm, "type=2&ie=utf8&page=2&query=python&select_count=0&usip=1")));
list.add(vm.addLocalObject(new StringObject(vm, "")));
Number number = module.callFunction(emulator, 0x9CA0 + 1, list.toArray())[0];
System.out.println("encrypt: " + vm.getObject(number.intValue()).getValue().toString());
}
public static void main(String[] args) throws IOException {
SouGou sougou = new SouGou();
sougou.encrypt();
sougou.destroy();
}
private void destroy() throws IOException {
emulator.close();
}
}
以上就全部代码跑起来
代码跑起来但是结果为空,应该是哪里有问题
回去看下 so
发现有个 init
函数,应该就是初始化,先调用 init
public void init() {
DvmClass Context = vm.resolveClass("android/content/Context");
List<Object> list = new ArrayList<>(10);
list.add(vm.getJNIEnv());
list.add(0);
list.add(vm.addLocalObject(Context.newObject(null)));
Number number = module.callFunction(emulator, 0x9564 + 1, list.toArray())[0];
System.out.println("init: " + number.intValue());
}
在运行结果就正常出来了
tencent
2021-12-10大哥,能分享一下算法吗
会爬山的小脑虎
2021-12-10@tencent 联系博主 wx:2027762055
pyj
2021-11-04这个返回的是什么数据呢
会爬山的小脑虎
2021-11-04@pyj 这是分析 so 加密参数的逻辑哦