WowCoolApk icon indicating copy to clipboard operation
WowCoolApk copied to clipboard

很好奇是怎么扒出来CoolLibrary的?

Open lageev opened this issue 5 years ago • 6 comments

酷安apk里面并没有打包这个lib

lageev avatar May 13 '19 02:05 lageev

你等一下,我待会发截图

duangsuse avatar May 18 '19 12:05 duangsuse

酷安apk里面并没有打包这个lib

另外,的确是有打包的,你不知道有这个东西是因为它不是 JVM 平台的 classpath 依赖...

还有,CoolLibrary 这个名字看起来就像 CoolApk 自己的东西,很有可能是被 Android Proguard 默认配置混淆过了的,即便是你查了应用程序的 dex 也不一定能知道有这个名字,我是从宽安发布失误的带调试符号的 liba.so (就是说,NDK 的依赖) DWARF 符号表(.dbgsym)里看到的,清清楚楚

duangsuse avatar May 18 '19 12:05 duangsuse

另外你是 CoolApk 招的人吗... 看起来你们会比我知道的多 :wink:

但是我的确认为就是有一个这样的 CoolLibrary,还是由某位 kjsolo 大佬编译k的

Screenshot_20190518_202003

详情查看

In reply to duangsuse::Echo 那么我们就可以总结一下,逆向工程的进度:

== 这是一个 32 位 ELF 80386 共享对象文件,OS/ABI = UNIX/SysV、小端字序、包含调试信息 == BuildID(sha1): aa1eac616f2abab80d5b9268e955c0d37de0df26 == linker: GNU Gold v1.1

== 使用了 memcpy / memset / strlen / sprintf / strcmp / time / strcat 这些外部函数 == 导出了 BDL / BD / BEL / BE / bd / be | MI / MU / MF / me | r / Java_com_coolapk_market_util_AuthUtils_getAS 这些函数 == 需要 libdl.so / libstdc++.so / libc.so / libm.so / liblog.so 这些动态链接库 == 它的库名 (SONAME) 是 liba.so

== 我们真正想要的逻辑是调试符号中文件 a.c 里的 Java_com_coolapk_market_util_AuthUtils_getAS 函数

== FILE a.c (/Users/kjsolo/StudioProjects/CoolLibrary/app/src/main/jni/a.c)

  • 这是 liba.so 的源文件名
  • 经过调试符号检查,在 a.c 源文件里的函数: r / Java_com_coolapk_market_util_AuthUtils_getAS == FILE b.c (/jni/b.c)
  • 这个文件应该是 Base64 算法的存放文件(从 这里 抄来的)
  • 经过逻辑检查和调试符号信息排除,在 b.c 文件里的函数: BDL / BD / BEL / BE / bd / be
  • 还应该包含这两个对象:
static const char pr2six[256];
static const char b6[65
]; /* Radix64 + "\x00" */

== FILE m.c (/jni/c.c), /jni/m.h

  • 这个文件应该存放了一些子程序定义
  • 经过猜测,在预处理过程后 m.c 里的函数: MI / MU / MF / me
  • 还应该包含其他隐藏未导出的函数符号: body

== 由 Android NDK Toolchain 自动生成的代码包括不限于以下符号,和逻辑没有一个半字的关系: __x86.get_pc_thunk.bx = mov ebx, dword [esp]; ret __atexit_handler_wrapper / __on_dlclose / atexit / __stack_chk_fail_local

== 编译工具链(Android GCC 4.9 Darwin) /Users/kjsolo/Library/Android/ndk/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9/ == 平台(Android 21 x86) /ndk/platforms/android-21/arch-x86/usr/include/jni.h

现在找到在某 GitHub repo 里有主的函数(和对象)有这些:

extern static const unsigned char pr2six[256];
extern static const char b6[64 + /* C EOS */ 1];

extern static int BDL(const char *bufcoded); // Base64decode_len
extern static void BD(char *bufplain, const char *bufcoded); // Base64decode

extern static int BEL(int len); // Base64encode_len
extern static void BE(char *encoded, const char *string, int len); // Base64encode

extern static void bd(char *out, const char *in); // b64d after DCE (dead code elimination)
extern static void be(char *out, const char *str); // b64e after DCE

duangsuse avatar May 18 '19 12:05 duangsuse

我还得感谢你们那位 debug build 发布 CoolLibrary 的大佬,因为它把 liba.so 带着调试符号就发布出去了,大大减轻了还在上高中没时间的我的工程量... 这个项目还是目前我 Star 数目最多的项目...

Before *CoolApk

https://github.com/duangsuse/StarCoolAPK/blob/master/coolapk_a/coolapk.c#L680

    jclass android_content_Context; // L55
    jstring packageName;  // L60
    jmethodID midGetPackageName;  // L56
    char *nPackageName;  // L61
    char cp[] = "com.coolapk.market"; // L63

    android_content_Context = (*env)->GetObjectClass(env, obj); // Line 55
    midGetPackageName = (*env)->GetMethodID(env, android_content_Context, "getPackageName", "()Ljava/lang/String;"); // Line 56

Screenshot_20190518_203015

And

After CoolTok

https://github.com/duangsuse/CoolTok/blob/master/asm.s#L413

;; done

    mov eax, alt_jnienv
    mov eax, [eax]
    mov eax, [eax+0x7c]

;; jclass (*GetObjectClass)(JNIEnv *, jobject); (+0x7c)

    mov edx, alt_entryobj
    mov suba2d, edx
    mov edx, alt_jnienv
    mov suba1d, edx
    call eax

    mov android_content_Context, eax

; android_content_Context = (*env)->GetObjectClass(env, entryObject);

    mov eax, alt_jnienv
    mov eax, [eax]
    mov eax, [eax + 84]

;; jmethodID (*GetMethodID)(JNIEnv *, jclass, char *name, char *sig); (+0x84)

    mov edx, vjavalangstring
    mov suba4d, edx
    mov edx, getpkgname
    mov suba3d, edx
    mov edx, android_content_Context
    mov suba2d, edx
    mov edx, alt_jnienv
    mov suba1d, edx
    call eax

    mov midGetPackageName, eax

; midGetPackageName = (*env)->GetMethodID(env, android_content_Context, "()Ljava/lang/String;", "getPackageName");

DWARF view Frame local variable table Assembly after replacing local offsets

duangsuse avatar May 18 '19 12:05 duangsuse

请问大大有哪个接口可以拿到用户注册时间?

SCUTJcfeng avatar May 26 '19 16:05 SCUTJcfeng

请问大大有哪个接口可以拿到用户注册时间?

这个我也不清楚,下面的链接里有人分析过,或许可以找到,也不确定

bjzhou/Coolapk-kotlin

你可以试试用户相关的 API,酷安 v7 的接口基本都返回 JSON 对象作为响应体的,然后用 FireFox 看 response body

理论上好像如果酷安不提供这种数据,我们也是无法得知准确的注册时间的

duangsuse avatar Jun 01 '19 14:06 duangsuse