1.熟悉了dex和odex文件
2.再次尝试动态调试easy-dex,失败。
3.完善easy-dex
dex文件结构清晰,使用了无符号整型和LEB128的数据类型。
结构如下:
文件头固定:64 65 78 0A 30 33 35 00
在010editor中可下载dex文件模板对应学习。
odex是dex的优化,结构如下:
文件头固定:64 65 79 0A 30 33 36 00
easy-dex
接 https://blog.youkuaiyun.com/qq_41858371/article/details/103500329
上次说要尝试动态调试,今天发现用真机也不能调试,应该和这个apk的特殊性有关系,暂时不知道怎么解决。
今天想把这道题懂透,发现问题好多。刚开始还是解决不了python3的Zlib解压总报错的问题。然后跳过这个。
进行解密也发现根本看不懂加密代码,(我好垃圾)。
这是最终的比较,A2是加密函数,第一个参数是明文,第二个参数根据public.xml和string.xml可以得到I have a male fish and a female fish.字符串。暗示TwoFish。想学习一下这个加密原理,发现根本看不懂,有时间得好好看看密码了。
没有什么基础真是费事,发现就算用工具都不会解密,因为编码问题。
问题一:
a = [-120, 77, -14, -38, 17, 5, -42, 44, -32, 109, 85, 0x1F, 24, -91, -112, -83, 0x40, -83, -128, 84, 5, -94, -98, -30, 18, 70, -26, 71, 5, -99, -62, -58, 0x75, 29, -44, 6, 0x70, -4, 81, 84, 9, 22, -51, 0x5F, -34, 12, 0x2F, 77]
result = []
密文字节数组中还有负数,搞了一会找到解决办法。异或0xff啊,太笨了。
for i in a:
result.append(i & 0xff)
问题二:
接上边异或之后拿到结果,转成字符串,因为不全是可视化字符串,所以进行base64加密或者16进制,发现都不正确,我傻了该怎么办呢。。。。
此时,突然就百度了一下python的bytes()函数,发现这个函数可以把整型数组直接变成bytes流。Tql。
b = bytes(result)
print(base64.b64encode(b))
然后进行解密。解密网站:http://www.kjson.com/encrypt/des/
问题三:
上边知道了bytes的用法,然后想了一下,我的python3解压数据失败是不是就是没有完全转换成bytes,我的脚本一直报错header错误,Google都没解决。然后我试了一下所有操作都用整型,不转字符,最后用bytes()函数。没想到竟然成了。TMD一直报header错误,这不就是没转换好吗,难受......。对了,经过我长时间琢磨,发现python3读文件然后list之后是整型数组,而python2同样的操作是字节数组,而且python2的zlib解压数据参数可以是字符串类型,python3只能是byte类型。
import zlib
f = open("dump", 'rb').read()
data_tmp = list(f)
v14 = 0
while True:
if v14 <= 89:
v15 = v14 // 10
if v14 % 10 == 9:
v16 = 0x3ca10
v17 = 0x3ca10 // 10
v18 = (v15 + 1) * (0x3ca10 // 10)
if (0x3ca10 // 10) * v15 < v18:
v19 = v17 * v15
while v17:
data_tmp[v19] = (data_tmp[v19] ^ v14)
v19 += 1
v17 -= 1
if v14 == 89:
while v18 < v16:
data_tmp[v18] = (data_tmp[v18] ^ 0x59)
v18 += 1
else:
break
v14 += 1
result_tmp = bytes(data_tmp)
a = result_tmp
b = zlib.decompress(a)
ff=open('class.dex', 'wb')
ff.write(b)
ff.close()
qwb{TH3y_Io<e_EACh_OTh3r_FOrEUER}
提交不对,????
唉,溜了。