(先熟悉一下分析环境,CoolApk 的 API Spec 待会再写) #reveng #GeekApk #CoolAPK #PL
Spectrum 我觉得非常需要重构,我会给 DSL 制定新的语法规范,因为实际使用中,我能看到很多东西并不是开始我设计 DSL 的时候想的那样... DSL 目前有点太混沌了,新的 GeekSpec 1.0 将能兼容 GeekApk v1b 和 CoolApk v6 两款实际应用的 API,一样简洁富有表现力的语法,但会有更清晰的描述语义和更多的特性(比如返回状态 matching)。
所以 CoolApk 的 SPEC 文件我还是要写,但暂时不打算重构 Spectrum 来支持 CoolApk 的新 API 特性,暂时可以用一些 Workaround 方案支持某些 API,感谢 Ruby 的灵活吧(迫真)
====
新的酷安 liba.so 没有很大区别,编译的时候少加了一个不需要的
看起来,不过,虽然好像业务代码没有用 C++ 异常,还是依赖了
我拿到的 liba.so 是 liba 的 x86 版本,因为比起 ARM 我更熟悉 x86,而且 CISC 机器一般更好分析
这个版本是从 coolapk.com 拿到的官方版本,酷安 v8
== 它包含这些动态链接依赖:
它依赖以下外部函数:memcpy / memset / strlen / sprintf / strcmp / time / strcat
还有这些无关算法本身的依赖:__cxa_finalize / __cxa_atexit / __stack_chk_fail / __stack_chk_guard
它的导出符号:BD / BDL / BE / BEL / MI / MU / MF / r / bd / me / be / Java_com_coolapk_market_util_AuthUtils_getAS
JNI 使用的只有 Java_com_coolapk_market_util_AuthUtils_getAS 这个符号
我逆向重写过的只有 BEL 这个函数,它的定义如下(C):
我觉得运行时替换掉这些函数,添加 log 参数和返回值的代码可能有助于分析算法
编译时采用了 stack guard 反溢出机制
Spectrum 我觉得非常需要重构,我会给 DSL 制定新的语法规范,因为实际使用中,我能看到很多东西并不是开始我设计 DSL 的时候想的那样... DSL 目前有点太混沌了,新的 GeekSpec 1.0 将能兼容 GeekApk v1b 和 CoolApk v6 两款实际应用的 API,一样简洁富有表现力的语法,但会有更清晰的描述语义和更多的特性(比如返回状态 matching)。
所以 CoolApk 的 SPEC 文件我还是要写,但暂时不打算重构 Spectrum 来支持 CoolApk 的新 API 特性,暂时可以用一些 Workaround 方案支持某些 API,感谢 Ruby 的灵活吧(迫真)
====
新的酷安 liba.so 没有很大区别,编译的时候少加了一个不需要的
liblog.so
依赖(实际上它不(向 logd)打印任何 log,这是无用的依赖,但当时我比现在菜所以移除这个依赖甚至对我来说比较难...)看起来,不过,虽然好像业务代码没有用 C++ 异常,还是依赖了
__cxa_finialize
(好吧这点是我弄错了,那不是 landingpad personality 函数(迫真))我拿到的 liba.so 是 liba 的 x86 版本,因为比起 ARM 我更熟悉 x86,而且 CISC 机器一般更好分析
这个版本是从 coolapk.com 拿到的官方版本,酷安 v8
com.coolapk.market, platformBuildVersionName="8.8.3", versionCode = 0x1ba289, usesSdk: [0x15..0x1c]
(信息使用 ~/Android/Sdk/build-tools/28.0.3/aapt dump xmltree f81b5d8361e1e197cd336a443710532e-0-o_1crp2etomvdkhmr1kfq1ghh18c6-uid-408649.apk AndroidManifest.xml
获得)== 它包含这些动态链接依赖:
它依赖以下外部函数:memcpy / memset / strlen / sprintf / strcmp / time / strcat
还有这些无关算法本身的依赖:__cxa_finalize / __cxa_atexit / __stack_chk_fail / __stack_chk_guard
它的导出符号:BD / BDL / BE / BEL / MI / MU / MF / r / bd / me / be / Java_com_coolapk_market_util_AuthUtils_getAS
JNI 使用的只有 Java_com_coolapk_market_util_AuthUtils_getAS 这个符号
我逆向重写过的只有 BEL 这个函数,它的定义如下(C):
int BEL(int n) { return (4 * (n - 1) / 3 | 3) + 2; }借助逆向分析 CoolApk
X-App-Token
生成算法的机会,我也顺便学习了一些 X86 汇编的知识。我觉得运行时替换掉这些函数,添加 log 参数和返回值的代码可能有助于分析算法
编译时采用了 stack guard 反溢出机制
Telegram
duangsuse::Echo
探索出了能用的公式,实现了 liba.so!BEL (int BEL(int n))
我去,这也太鬼畜梦幻了,他们居然忘了 strip 掉调试符号...
liba.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=aa1eac616f2abab80d5b9268e955c0d37de0df26, with debug_info, not stripped
这特么简直是作死啊,生怕别人逆向不出来调试不方便了.... 🤪 酷安这位叫做 kjsolo 的老哥啊你也太秀了吧... 要知道在 production 里面出现一行调试代码都会被吐嘈的,何况是在令牌生成算法里保留一大堆调试符号... #security #Android #CoolApk#Coolapk 🌝 禁用也没用,反正我逆向的是 v8 最新的算法,厉害或者觉得底层系统小白 + GCC 很『黑盒』就再来。
duangsuse::Echo
可惜没有绘制成图表 plot 好看一些 🤔 r.size #=> 187 一共统计了 187 条消息。 r.sort_by { |it| it['published'] }.first['published'] => 2019-03-24 11:22:00 +0800 第一条消息是 2019-03-24 11:22 发送的 r.sort_by { |it| it['published'] }.last['published'] => 2019-04-05 20:06:00 +0800 最后一条消息是…
😃 那么,简而言之,我觉得有价值的信息:
2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse
+ 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
+ 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签
+ 链接和 Tag 都有的消息有 17 条,占总消息的 9%
+ 187 条消息里,折行最多的消息是这条,它有 4232 个字和 7 条链接。
当然,这 70 条都是回复本频道消息的。
IT 那点事 (YuutaW 鱼塔): 10
羽毛的小白板: 10
duangsuse Throws: 6
Rachel 碎碎念 (IFTTT): 5
Rachel 的消息发布站点 (Rachel Miracle.) via @like: 3
YSC 的频道: 2
duangsuse ¯\_(ツ)_/¯ |学渣 | 我爱学习 | ∈ [E²PROM, 范畴论]: 2
Doge: 2
YuutaW 鱼塔: 2
Rachel 碎碎念 (湘江一桥): 2
DogeSpeed广播: 1
😄 @haneko_daily 被转发的次数最多,继续努力!
😳: 4
😲: 3
😡: 2
😑: 2
🙄: 2
😋: 2
😀: 2
😥: 2
🍹: 1
😐: 1
最火的 hashtags 组合:
所有 Hashtags:
以及他们的消息覆盖个数:
== 非线性查询(当然和算法上那个没有关系啦,就是复杂一点的查询)
// 收集所有单 / 双数索引
受到解析度(只到分钟)和浮点运算准确度的影响,有很多消息都是在间隔一分钟内发完的,统计结果可能不正确。
好啦,还有什么别的信息,请大家自己来发掘呗( 😝 比如说,我熬夜发过多少消息。
def get_link(h); "https://tttttt.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end+ 一共统计了 187 条消息。
2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse
+ 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
+ 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签
+ 链接和 Tag 都有的消息有 17 条,占总消息的 9%
map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse
map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse.first[1]['links'].size+ 187 条消息里,最长的消息是这条,它有 4475 个字 — 连链接都有 25 条! 🤪
+ 187 条消息里,折行最多的消息是这条,它有 4232 个字和 7 条链接。
sum { |it| it['body'].size } / size+ duangsuse 的平均字数:359 字 / 消息
sum { |it| it['body'].lines.size } / size+ duangsuse 的平均行数:11 行 / 消息
find_all { |it| it['header_type'] == 'REPLY' }.size
+ 过去的 187 条消息里,有 70 条都是回复,占总量 37%find_all { |it| it['header_type'] == 'FORWARDED' }.size
+ 过去的 187 条消息里,有 45 是转发自其他频道或个人的,占总量 24%当然,这 70 条都是回复本频道消息的。
a.uniq.map { |u| [u, a.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" }+ 转发者和条数表如下:
IT 那点事 (YuutaW 鱼塔): 10
羽毛的小白板: 10
duangsuse Throws: 6
Rachel 碎碎念 (IFTTT): 5
Rachel 的消息发布站点 (Rachel Miracle.) via @like: 3
YSC 的频道: 2
duangsuse ¯\_(ツ)_/¯ |学渣 | 我爱学习 | ∈ [E²PROM, 范畴论]: 2
Doge: 2
YuutaW 鱼塔: 2
Rachel 碎碎念 (湘江一桥): 2
DogeSpeed广播: 1
😄 @haneko_daily 被转发的次数最多,继续努力!
sort_by { |it| it['hashtags'].size }.reverse+ 具有最多标签的消息是这条,它有足足 8 条标签!
sort_by { |it| it['links'].size }.reverse.first
+ 具有最多链接的消息是这条,它有 25 条链接!同时也是字数最多的消息!find_all { |it| it['header_type'] == 'A_PHOTO' }.size过去 187 条消息里,一共有 29 条广播是单纯的一个照片 🖼
find_all { |it| it['header_type'] == 'A_ALBUM' }.size过去 187 条消息里,一共有 5 条广播是照片集 📸
find_all { |it| it['header_type'] == 'IS_STICKER' }.size可爱 🐱 的 duangsuse 在过去 187 条消息里使用了 28 个 sticker 抒发自己的感情,使用的表情这么多:
find_all { |it| it['header_type'] == 'IS_STICKER' }.collect { |it| it['ext'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }😔: 7
😳: 4
😲: 3
😡: 2
😑: 2
🙄: 2
😋: 2
😀: 2
😥: 2
🍹: 1
😐: 1
find_all { |it| it['header_type'] == 'HAS_FILE' }.sizeduangsuse 在过去 187 条消息里发了 8 个文件,它们是:
find_all { |it| it['header_type'] == 'HAS_FILE' }.collect { |it| it['ext'] }["axml.rb", "AndroidManifest.xml", "AndroidManifest.xml", "TextSort.kt", "RandomPicture.kt", "Vibrator.svg", "Vibrator.png", "Vibrator.svg"]
最火的 hashtags 组合:
collect { |it| it['hashtags'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }结果太长,在这里查看
所有 Hashtags:
hs = s.flatten.find_all { |it| it.is_a? Array }.flatten.map { |s| s.tr(" ", "") }#Android #zhihu #KDE #Low #Haha #life #tech #tencent #WeChat #weibo #share #tools #dev #Markups #Telegram #Hack #aop #Huawei #通知 #Freedom #sysadmin #GitHub #travis #CI #Sysadmin #Linux #Coolapk #Web #frontend #HTML #China #school #Microsoft #Life #VisualStudio #-} #OOP #web #geekapk #doge #CS #fix #CSharp #School #blog #recommended #bin #backend #Kotlin #Java #Share #svg #blogPOst #PL #JVM #Moha #code #ALgotithm #DuangsuseSB #GeekApk #SQL #Learn #wiki #Mozilla #ES6 #JavaScript #MoHa #Paper #haha #dotnet #bad #OOP_Delegates #Parallelism #dotNet #Csharp #Windows #performance #Channel #weekly #linux #Ruby #Project
"#" + hs.uniq.join(' #')
以及他们的消息覆盖个数:
hs.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }太长,这里看
== 非线性查询(当然和算法上那个没有关系啦,就是复杂一点的查询)
// 收集所有单 / 双数索引
ar = []; ar2 = []
i = 0 // 0 2 4 6
while i < self.size; ar << self[i]; i += 2; end
i = 1 // 1 3 5 7
while i < self.size; ar << self[i]; i += 2; end
aa = ar.zip(ar2)
我们将比较相邻两消息之间的关系。aa.zip(aa.map { |ms| ms.last['published'] - ms.first['published'] }).sort_by { |p| p.last }.reverse
间隔最长的两条消息是这条和这条,间隔 44880 秒(12 小时)b.map { |h| [h.last, h.first.first['body'].size ] }.map { |a| a.last / a.first }.select { |it| not it.nan? and not it.infinite? }.sort.reverse平均打字速度:7 字 / 秒 🤔
受到解析度(只到分钟)和浮点运算准确度的影响,有很多消息都是在间隔一分钟内发完的,统计结果可能不正确。
好啦,还有什么别的信息,请大家自己来发掘呗( 😝 比如说,我熬夜发过多少消息。
Telegram
duangsuse::Echo
AXMLParser parser = new AXMLParser(apkFileInputStream);
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…
duangsuse::Echo
https://github.com/rdp/ruby_gnuplot 使用这个画 X axis: 时间点 Y axis: 消息条数
#Coolapk #stat 顺便推荐隔壁老酷安统计的(两年前了),unnamed 大佬好像把自己的统计删了... 🤔
不过我是拿 Ruby 内建的列表处理方法算了自己频道的小数据,他是用 SQL 建模查询的(
不过我是拿 Ruby 内建的列表处理方法算了自己频道的小数据,他是用 SQL 建模查询的(
GitHub
by-syk/CoolapkUserStats
酷安用户数据爬虫案例 A Python sample to get all user data of CoolApk - by-syk/CoolapkUserStats
#life #dev duangsuse 落实 10:30 准时睡觉『政策』。 🐱
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization