第55天:三战easy-dex

本文详细介绍了DEX和ODEX文件的结构特点,包括使用的数据类型和文件头信息,并分享了在动态调试过程中遇到的挑战及解决方案,如处理密文字节数组中的负数、Python3的Zlib解压问题等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}

提交不对,????

唉,溜了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值