duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
我比较不擅长数学... 不得不承认,我不知道为什么它说 dword ptr 但其实只移动了一个字(4 bytes)的数据,但是我希望以后都不要再出这种岔子了,现在我使用这种宏定义的方式掩盖了栈帧本地变量的复杂性,目前 edb 测试发现这种方式并没有什么不妥,栈帧的大小正好适当。
cooltok_1.zip
26.9 KB
用这种方式写出来的汇编还蛮易读的,方便分析少操心... 也好
蜜汁分配
cooltok_2.zip
27 KB
剩下最后一个主函数....
存下来的本地偏移量将会起到至关重要的作用(尤其是现在 duangsuse 还只会很模式化的给本地栈帧分配空间的时候)
上面翻译完的逻辑中 stack protector 什么的因为是机器生成而且 duangsuse 看不懂就没有翻译(
duangsuse::Echo
存下来的本地偏移量将会起到至关重要的作用(尤其是现在 duangsuse 还只会很模式化的给本地栈帧分配空间的时候)
duangsuse 已经能够根据 fbreg 偏移量和一个参数的实际 ebp 偏移计算出其他所有本地变量的 ebp 偏移量,这意味着我可以把所有本地变量访问的汇编偏移量命名,结果将是完工后的汇编既能生成 CoolApk API 会接受的 X-App-Token,又非常好看,容易理解和翻译成其他形式。

感谢带 -g 的 GCC 4.9 🤔
要不然可没有那么容易喽(像我之前一样一个一个猜,最后写出来的算法还是错的)
有了 RE Group 就方便多了...
好 多 🤐
duangsuse::Echo
好 多 🤐
发出了 一个一个算 size 好麻烦 的声音
善于利用老轮子(
有了调试符号的帮助,所有本地变量都可以算出来,类型和名字都有了 🤔
duangsuse::Echo
有了调试符号的帮助,所有本地变量都可以算出来,类型和名字都有了 🤔
;; LINE FBREG TYPE NAME OFFSET
;; L55 (-432) jclass android_content_Context [ebp-0x1a8]
;; L56 (-428) jmethodID midGetPackageName [ebp-0x1a4]
;; L60 (-424) jstring packageName [ebp-0x1a0]
;; L61 (-420) char *nPackageName [ebp-0x132]
;; L63 (-314) char cp[] [ebp-0xdd]


计算方法是什么呢 🤔

先算出当前项的长度:

比如算 L61 的 nPackageName

用 420 减去 314 得出差 106(虽然它好像的确没那么长)
然后用上一个的偏移量减去它的长度 hex 0x1a0 - 106 就是下一项的地址 [ebp-0x132]
duangsuse 果然是数学不好,其实公式就是 def n(s) ;hex (s - 8); end ...
😶
都抽提一下,然后再加上 JNI 结构体的注释、rodata 偏移量替换... 这就完了 🤔
由酷安某粗心工程师发布的『Debug』Release 版本里的调试符号使得整个生成算法非常好看,简直比 Java bytecode 还容易理解了 🤔
是真的比 Java Bytecode 反汇编还容易理解,看 Java 你至少还得分析本地表和参数栈,看这个你只需要 SSA 思路(基本(当然,用 Java 反编译器的除外