搜狗搜索-公众号文章列表unidbg逆向

搜狗搜索-公众号文章列表unidbg逆向

Java层

image-20211213172034546

从抓包结果看,参数和返回结果都经过加密,而且参数名都是极其简单的单个字符串,不太好入手,尝试从请求的url入手,在jadx搜索v2.get

image-20211213172326842

进入看看

image-20211213172416259

疑似加密和解密的函数

image-20211213172452959

可以看到最终是调用了ScoreTools这个so里面的native函数,接下来使用frida hook看看。

function hook_encrypt() {
    var ScEncryptWall = Java.use('com.sogou.scoretools.ScEncryptWall');
    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;
    }
}

Java.perform(function () {
    hook_encrypt();
})
image-20211213173541000

so层

ida打开libSCoreTools.so,函数窗口搜索java,可以看出是静态注册的,接下来用unidbg调用encrypt函数

image-20211213174535701

unidbg逆向

package com.sogou;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.hook.hookzz.*;
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.sun.jna.Pointer;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Sogou extends AbstractJni {
    private final AndroidEmulator emulator;
    private final VM vm;
    private final Module module;

    public static String pkgName = "com.sogou.activity.src";
    public static String apkPath = "unidbg-android/src/test/java/com/sogou/sogou7.9.6.6.apk";
    public static String soPath = "unidbg-android/src/test/java/com/sogou/libSCoreTools.so";

    public Sogou() {
        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName(pkgName).build();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM(new File(apkPath));
        vm.setVerbose(true);
        DalvikModule dm = vm.loadLibrary(new File(soPath), true);
        vm.setJni(this);

        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
    }

    public void call_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/searchapp")));
        list.add(vm.addLocalObject(new StringObject(vm, "type=2&ie=utf8&page=2&query=Python&select_count=0&usip=")));
        list.add(vm.addLocalObject(new StringObject(vm, "")));

        Number number = module.callFunction(emulator, 0x9ca0+1, list.toArray())[0];
        System.out.println("Result:" + vm.getObject(number.intValue()).getValue().toString());
    }
    
    public static void main(String[] args) {
        Sogou test = new Sogou();
        test.call_encrypt();
    }
}

image-20211213173948453

运行之后发现,跑完了整个流程,但是没有结果。不过在java代码里面就发现了有个init函数,也许我们要先调用一下这个函数。

image-20211213174125151
public void call_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());
}
public static void main(String[] args) {
    Sogou test = new Sogou();
    test.call_init();
    test.call_encrypt();
}
image-20211213174746087

结果出来了,同样的参数运行多次,我们发现每次的结果都不一样,说明算法的输入可能还有随机数或时间戳的参与。

完整代码

package com.sogou;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.hook.hookzz.*;
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.sun.jna.Pointer;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Sogou extends AbstractJni {
    private final AndroidEmulator emulator;
    private final VM vm;
    private final Module module;

    public static String pkgName = "com.sogou.activity.src";
    public static String apkPath = "unidbg-android/src/test/java/com/sogou/sogou7.9.6.6.apk";
    public static String soPath = "unidbg-android/src/test/java/com/sogou/libSCoreTools.so";

    public Sogou() {
        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName(pkgName).build();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM(new File(apkPath));
        vm.setVerbose(true);
        DalvikModule dm = vm.loadLibrary(new File(soPath), true);
        vm.setJni(this);

        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
    }

    public void call_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());
    }

    public void call_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/searchapp")));
        list.add(vm.addLocalObject(new StringObject(vm, "type=2&ie=utf8&page=2&query=Python&select_count=0&usip=")));
        list.add(vm.addLocalObject(new StringObject(vm, "")));

        Number number = module.callFunction(emulator, 0x9ca0+1, list.toArray())[0];
        System.out.println("Result:" + vm.getObject(number.intValue()).getValue().toString());
    }

    public static void main(String[] args) {
        Sogou test = new Sogou();
        test.call_init();
        test.call_encrypt();
    }
}

代码仅供把玩。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容