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
好过分,这是 loop unrolling (循环展开)么...
duangsuse 正愁这里的控制流太复杂不好分析又不能上动态直接看算法结果,忽然发现这其实是个被混淆的 Base64 string 🤔 验证不用愁了
duangsuse::Echo
duangsuse 正愁这里的控制流太复杂不好分析又不能上动态直接看算法结果,忽然发现这其实是个被混淆的 Base64 string 🤔 验证不用愁了
为什么完全还原算法逻辑更难?因为这么做需要你有很强的编译原理,最好还有 C 编程的功底...

而那些有点能力的『破解者』们,只需要知道它做什么,比如在这里,解码一个被混淆的 Base64
然后他们就可以直接动态分析,在 call sym.BD 上打上断点,返回之后 eax (修正,是 ebp-0x190)就是被解密 Base64 的字符串指针了,根本不需要知道,甚至都不用分析 Base64 解码调用的第一个参数是分配在栈上还是动态分配
调试符号有什么用?🌚
无时不刻不在提醒着我 r2 分析出的哪个栈帧偏移量可能是 C 源码里的哪个局部变量,结果是逆向工程还原出整个逻辑都会轻松很多
所以不要小瞧这一点 debug information...
酷安大佬们很聪明,我以为(对『破解者』来说)那么难看的 *char 操作都是酷大佬写的,可其实是 GCC 4.9 写的(跑
duangsuse::Echo
酷安大佬们很聪明,我以为(对『破解者』来说)那么难看的 *char 操作都是酷大佬写的,可其实是 GCC 4.9 写的(跑
[DuangSUSE@duangsuse]~/Projects/HackingCoolApk/liba/RE/dwarview% base64 -d
e7177eb11a13ea5672c543da1690e302dG9rZW46Ly9jb20uY29vbGFway5tYXJrZXQvYzY3ZWY1OTQzNzg0ZDA5NzUwZGNmYmIzMTAyMGYwYWI_7d3bcfe1ca700fdccf5a8595f98f70d8
{�{���խwy�z�g9�wZׯt{}6token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0abbase64: 输入无效

有点意思了 🤔
duangsuse::Echo
[DuangSUSE@duangsuse]~/Projects/HackingCoolApk/liba/RE/dwarview% base64 -d e7177eb11a13ea5672c543da1690e302dG9rZW46Ly9jb20uY29vbGFway5tYXJrZXQvYzY3ZWY1OTQzNzg0ZDA5NzUwZGNmYmIzMTAyMGYwYWI_7d3bcfe1ca700fdccf5a8595f98f70d8 {�{���խwy�z�g9�wZׯt{}6token://com.c…
puts Base64.decode64(Base64.decode64('OGQwN2Y4OWY1OTU4YTVmY2NkZjAwN2FjMWVmY2IzZDcvSVdZd1lHTXlBVE16SW1ZbU5HWndVek41QURaMGd6TnpRVE8xWVdaM1l6WXZRWFpySlhZdDV5YXdGR2J2OTJZdTAyYmo5eUw2NFdacjlHZDIwM2UwOTYxYWQzNDVjMjc2NWFlMzFhMTFiZTc3MTdl').reverse)
酷安大佬貌似是拼接了一大堆包含时间、包名、UUID String 的信息,然后服务端也重复这个算法,比较 Hash 值么?
已经开始无聊了 🤔 全 TM 是 base64 + 拼接字符串
相当无聊的 面向子程序调用分析(COA
有时候可能会很 SSA(Static Single Assignment) 地想,是不是找到了最后要的某个东西,就能根据它推断出它的依赖逻辑呢?这个本地变量就是最后的 Token 结果。
🤔继续往下分析动态字符数组栈上分配...
邪恶的 duangsuse 居然把这个依赖 DAG 收起来了... 🤔
duangsuse::Echo
邪恶的 duangsuse 居然把这个依赖 DAG 收起来了... 🤔
你们这个是个什么口令生成算法啊,你们这是雷普前端开发者们啊你们这个算法。
麻烦你们,真的太过分了你们搞这个『加密算法』干什么,我的项目每一行代码都过不了那个 lint 检查啊,它现在没法连上你们的 API,你叫我项目怎么办啊,它还事个幼儿园基本的弱智应用好不好。

你们这是什么算法啊,哼!哼!啊啊啊啊啊啊啊。你们害死我项目了谁是出要写这种东西主意的快出来你们写代码的,再不出来我 ****** 了啊!

我跟你们说你们这群 Android 开发者啊,一天到晚搞什么这些加密啊代码保护啊会害死你们的(迫真)
你们没有前途我跟你们说你们这400多号人好好写 Jawa 不好么,一天到晚 show C/C++ 有什么意思,有什么意思啊,我偶尔写一下都快被恶心死了。

麻烦你们重视一下你们的 Jack 有点发展目标好不好,一天到晚写写 Rx 写写 Vertx 写写 Databinding 不是人啊,你们一天到晚搞 C++ 不好好写 pattern 没有前途的,NDK 害死人。

#Haha #security #Android #dev 😤
coolapk_a_kdev_f.zip
178.1 KB
#security #share #tools #coolapk 🤔 还没有测试过,或许能用
🤔目前生成的 token 还不能让酷安服务器满意
2a6e2adc2897c8d8133db17c2cd3b1045834ce58-d7d5-38eb-95d5-563167a1983d0x588f16cd

(第一部分是机器代码计算的校验和(用到了 base64 和 MD5),我花了两天用 C 重写了,第二部分是 UUID,第三部分是当前 UNIX 时间的十六进制表示)

7fa737c3bc4e80f1381d3c7e1bfdd40d47b11e0b-97b6-454b-9831-ccaff8f19f020x5c6a5245

🤔 哦... 我记得看汇编的时候的确可能拼接了这个 0x, 不过因为不是用 strcat 所以我没加,加上试试
还是不行,
duangsuse::Echo
2a6e2adc2897c8d8133db17c2cd3b1045834ce58-d7d5-38eb-95d5-563167a1983d0x588f16cd (第一部分是机器代码计算的校验和(用到了 base64 和 MD5),我花了两天用 C 重写了,第二部分是 UUID,第三部分是当前 UNIX 时间的十六进制表示) 7fa737c3bc4e80f1381d3c7e1bfdd40d47b11e0b-97b6-454b-9831-ccaff8f19f020x5c6a5245 🤔 哦... 我记得看汇编的时候的确可能拼接了这个…
我用 UUIDParser 弄了一下,发现给的 UUID 其实都有区别(一个是 name based 一个是 time based)... 最讨厌的就是有时候动态分析很麻烦 🤔

我看这逻辑也挺 plain 的,继续分析,Ruby 重写一下 emmmm...

bd 就是 base64 decode(dst, src)
be 就是 base64 encode(dst, src, srclen)

me 就是 MD5 based message digest(dst, src)

r 就是 reverse string(s)

🤔 好像虽然不是很能完全理解,但是基于调试符号的帮助,重写也不是很困难,我得想想这些名字都会代表什么