WowCoolApk
WowCoolApk copied to clipboard
很好奇是怎么扒出来CoolLibrary的?
酷安apk里面并没有打包这个lib
你等一下,我待会发截图
酷安apk里面并没有打包这个lib
另外,的确是有打包的,你不知道有这个东西是因为它不是 JVM 平台的 classpath 依赖...
还有,CoolLibrary 这个名字看起来就像 CoolApk 自己的东西,很有可能是被 Android Proguard 默认配置混淆过了的,即便是你查了应用程序的 dex 也不一定能知道有这个名字,我是从宽安发布失误的带调试符号的 liba.so (就是说,NDK 的依赖) DWARF 符号表(.dbgsym)里看到的,清清楚楚
另外你是 CoolApk 招的人吗... 看起来你们会比我知道的多 :wink:
但是我的确认为就是有一个这样的 CoolLibrary,还是由某位 kjsolo 大佬编译k的
详情查看
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
我还得感谢你们那位 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
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");
请问大大有哪个接口可以拿到用户注册时间?
请问大大有哪个接口可以拿到用户注册时间?
这个我也不清楚,下面的链接里有人分析过,或许可以找到,也不确定
你可以试试用户相关的 API,酷安 v7 的接口基本都返回 JSON 对象作为响应体的,然后用 FireFox 看 response body
理论上好像如果酷安不提供这种数据,我们也是无法得知准确的注册时间的