duangsuse::Echo
看来区区一个在 GDB 里没有源代码就没有用的 DWARF 调试符号,对于逆向工程就有这么大的信息量... 🤔 忘记 strip 掉居然就暴露了这么多信息啊....
酷安这位老哥保留的调试符号再次车祸现场暴露了第二个惊人但是不出我意料之外的信息:m.c 和 m.h 保存的是 MD5 算法(我早猜到过这种可能了,他们重命名就是这个尿性,要是我肯定就拿宏定义换成完全无意义的名字了) 😂
以后开发想『保密』的 native 环境算法,千万不要忘记 strip 掉调试符号啊 🤪
<203> DW_AT_name : (indirect string, offset: 0x1af): /Users/kjsolo/StudioProjects/CoolLibrary/app/src/main/jni/m.c那么,你们看,调试符号真的是罪过啊,现在我的逆向工程量就缩小到 a.c (还是调试符号给的提示,让我知道开始编译时哪些函数是位于哪些文件)里的
<1><228>:缩写编号:4 (DW_TAG_typedef)
<229> DW_AT_name : (indirect string, offset: 0x1f7): MD5_u32plus
<22d> DW_AT_decl_file : 2
<22e> DW_AT_decl_line : 32
<22f> DW_AT_type : <0x21a>
// CoolLibrary/app/src/main/jni/a.c:53-145这几个函数了,而它们失去了对『MD5、Base64』函数的用途依赖(我们现在知道它所用到一些真正复杂算法的外部逻辑究竟是在做什么),都很短,很容易拿 C 重写出整个算法。
char *Java_com_coolapk_market_util_AuthUtils_getAS(size_t env, char *obj, char *entryObject, char *jstr);
// CoolLibrary/app/src/main/jni/a.c:27-30
// b64d like wrapper
void bd(char *out, const char *code_str);
// CoolLibrary/app/src/main/jni/a.c:47-51
// b64e like wrapper
void be(char *dst, const char *src);
// CoolLibrary/app/src/main/jni/a.c:33-44
void me(char *dst, char *src);
// CoolLibrary/app/src/main/jni/a.c:13-24
void r(char *s);
以后开发想『保密』的 native 环境算法,千万不要忘记 strip 掉调试符号啊 🤪
duangsuse::Echo
酷安这位老哥保留的调试符号再次车祸现场暴露了第二个惊人但是不出我意料之外的信息:m.c 和 m.h 保存的是 MD5 算法(我早猜到过这种可能了,他们重命名就是这个尿性,要是我肯定就拿宏定义换成完全无意义的名字了) 😂 <203> DW_AT_name : (indirect string, offset: 0x1af): /Users/kjsolo/StudioProjects/CoolLibrary/app/src/main/jni/m.c <1><228>:缩写编号:4…
现在我甚至都不需要『花力气』多学点汇编和编译器技术了,因为 liba.so 真正自己(而不是抄的)的『业务逻辑』代码只有 51 行而已,我完全可以看反汇编,利用 base64.c 和 boost:Uuid::detail::MD5 的部分外部库源代码完全还原出本来的生成逻辑,也可以拿 Ruby、Python、JavaScript 什么的彻底重写还原原逻辑,根本不需要再反汇编、重新汇编、转换对象格式、修改二进制对象文件结构什么的。
而且都不需要我检查反汇编代码来确认那些外部库的函数是否真的找到匹配的了,因为调试符号已经给出了所有需要的信息... 🤔
这两天进度飞快的逆向工程过程中,忘记 strip 掉的调试符号给了太多帮助,调试符号暴露了太多信息,甚至连函数、结构体的原型都可以从调试符号里面拿出来... 标识符,他们的名字也都直接从调试符号里取... 甚至哪个函数在哪个文件里,用了哪些开源代码,CoolApk 里面这个客户端库的内部名称叫什么,开发者的昵称是什么,用的什么操作系统,什么编译器... 全都知道了,所有人都知道了。
....
写编译配置的这位 dalao,NB 了。 👊
而且都不需要我检查反汇编代码来确认那些外部库的函数是否真的找到匹配的了,因为调试符号已经给出了所有需要的信息... 🤔
这两天进度飞快的逆向工程过程中,忘记 strip 掉的调试符号给了太多帮助,调试符号暴露了太多信息,甚至连函数、结构体的原型都可以从调试符号里面拿出来... 标识符,他们的名字也都直接从调试符号里取... 甚至哪个函数在哪个文件里,用了哪些开源代码,CoolApk 里面这个客户端库的内部名称叫什么,开发者的昵称是什么,用的什么操作系统,什么编译器... 全都知道了,所有人都知道了。
....
写编译配置的这位 dalao,NB 了。 👊
GitHub
boostorg/uuid
Boost.org uuid module. Contribute to boostorg/uuid development by creating an account on GitHub.
coolapk_a.zip
9.1 KB
😆 准备开始阅读反汇编完成 liba 的实际算法逻辑(是的,彻底的 C 重写!好耶)
duangsuse::Echo
勉强分析出来一点逻辑,看起来能用,但是不知道是不是错的,正在想办法操作一下(迫真
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
勉强分析出来一点逻辑,看起来能用,但是不知道是不是错的,正在想办法操作一下(迫真
一顿分析猛如虎,再看结果 Assertation failed(
duangsuse::Echo
liba.so
安排一下手机上测试能不能正常使用(
刚刚逆向分析实现的
刚刚逆向分析实现的
liba.so!me#reveng #tools #share 分享一些开源机器代码 REverse engineering 工具 ❤️
== https://github.com/namhyung/dwarview
ELF DWARF 调试符号信息查看器
== https://igio90.github.io/Dwarf/docs/installation.html
一个普通的(并非逆向工程用)调试器
== https://github.com/wisk/medusa
一个普通有 GUI 的 disassembler
== https://gitlab.com/p8n/panopticon
Rust 的跨机器代码指令平台反汇编工具
== https://github.com/cea-sec/miasm#user-content-assembling--disassembling
让 Radare2 可以使用 miasm Python 工具集工作
== https://github.com/pwndbg/pwndbg#readme
Pwndbg 是一个 GDB 插件,可以让 Source-level debugger GDB 一瞬变成 assembly level debugging 的好工具
== https://github.com/namhyung/dwarview
ELF DWARF 调试符号信息查看器
== https://igio90.github.io/Dwarf/docs/installation.html
一个普通的(并非逆向工程用)调试器
== https://github.com/wisk/medusa
一个普通有 GUI 的 disassembler
== https://gitlab.com/p8n/panopticon
Rust 的跨机器代码指令平台反汇编工具
== https://github.com/cea-sec/miasm#user-content-assembling--disassembling
让 Radare2 可以使用 miasm Python 工具集工作
== https://github.com/pwndbg/pwndbg#readme
Pwndbg 是一个 GDB 插件,可以让 Source-level debugger GDB 一瞬变成 assembly level debugging 的好工具
GitHub
GitHub - namhyung/dwarview: DWARF debug info viewer using GTK+
DWARF debug info viewer using GTK+. Contribute to namhyung/dwarview development by creating an account on GitHub.
duangsuse::Echo
没想到,原来 GDB 需要的这么多东西全都是有用的(哪有没有源代码 GDB 就爆炸掉这种说法呢? 🙈
This media is not supported in your browser
VIEW IN TELEGRAM
这下可得了,岂不是有了调试符号,除了等价的算法逻辑,连代码风格和标识符名称都能完全还原出来了....
所以说千万不要忘记 strip 掉调试符号,免得类似 duangsuse 这种人间之屑逆向还原出整个算法逻辑... 还是在三四天内 🤔
duangsuse::Echo
安排一下手机上测试能不能正常使用( 刚刚逆向分析实现的 liba.so!me
一般我在手机上用 QPython CTYPES 模块还是可以访问里面的函数的,目前可能因为平台有点区别,我的 GNU/Linux 上面暂时加载不了库文件
(这个是 CA v6 里的 liba)
对于别的测试,我准备反汇编,然后重新汇编一个,这样改代码也好改一些 🤔
https://docs.python.org/3.5/library/ctypes.html
(这个是 CA v6 里的 liba)
Python 3.2.2 on linux-armv7l我会写个脚本绑定一下 CFI(听说 Python 好像有特别的方法),然后测试一下函数们
import ctypes
a = ctypes.CDLL('/data/local/tmp/liba.so')
a # <CDLL ... handle ... at ...
a.BEL(10) # 17
对于别的测试,我准备反汇编,然后重新汇编一个,这样改代码也好改一些 🤔
https://docs.python.org/3.5/library/ctypes.html
Python documentation
ctypes — A foreign function library for Python
Source code: Lib/ctypes ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these ...
duangsuse::Echo
一般我在手机上用 QPython CTYPES 模块还是可以访问里面的函数的,目前可能因为平台有点区别,我的 GNU/Linux 上面暂时加载不了库文件 (这个是 CA v6 里的 liba) Python 3.2.2 on linux-armv7l import ctypes a = ctypes.CDLL('/data/local/tmp/liba.so') a # <CDLL ... handle ... at ... a.BEL(10) # 17 我会写个脚本绑定一下 CFI(听说 Python…
Python 也有专门的 FFI DSL 和自动接口生成(bindgen)
不过这里测试用,不需要太好的代码质量和这些技巧
不过这里测试用,不需要太好的代码质量和这些技巧
void be(char *dst, const char *src);已经验证的确实现了此逻辑,测试数据
"duangsuse" 输出 "ZHVhbmdzdXNl"
void bd(char *out, const char *code_str);已经验证的确实现了此逻辑,测试数据
"ZHVhbmdzdXNl" 输出 "duangsuse"
void me(char *dst, char *src);
已经验证的确实现了此逻辑,测试数据 "duangsuse" 给出输出 "bd0f06b918b82c0da771c830b8497da4"
void r(char *s); 这个就是个纯的 string reversing 函数,没有别的判断什么的... 反正这些都不是重点,重点是 JNI 导出