在 Android Studio
中新建工程,添加一个类,内容如下,功能很简单,只输出一行日志。
1
2
3
4
5
6
7
8
9
|
package dev.svip.dextest;
import android.util.Log;
public class test {
public void testFunc(){
Log.i("sviplog", "hi, I'm from testFunc");
}
}
|
编译项目,进入 app/build/intermediates/javac/debug/classes
目录,使用 dx
将 class
文件打包成 dex
1
|
java -jar /root/Android/Sdk/build-tools/30.0.2/lib/dx.jar --dex --output=test.dex dev/svip/dextest/test.class
|
此时我们可以使用 jadx
查看生成的 test.dex
,可以直接看到原始内容。
复制一份 test.dex
,使用 010 Editor
打开,使用模板加载后定位到以下位置
将该字段全部置为 0
保存后再使用 jadx
打开,会发现已全部被置空成 nop
使用以下代码计算修改后的 dex
的 checksum
,需要使用 python2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#! /usr/bin/python
# -*- coding: utf8 -*-
import binascii
def CalculationVar(srcByte,vara,varb):
varA = vara
varB = varb
icount = 0
listAB = []
while icount < len(srcByte):
varA = (varA + srcByte[icount]) % 65521
varB = (varB + varA) % 65521
icount += 1
listAB.append(varA)
listAB.append(varB)
return listAB
def getCheckSum(varA,varB):
Output = (varB << 16) + varA
return Output
if __name__ == '__main__':
filename = 'new.dex'
f = open(filename, 'rb', True)
f.seek(0x0c)
VarA = 1
VarB = 0
flag = 0
CheckSum = 0
while True:
srcBytes = []
for i in range(1024): #一次只读1024个字节,防止内存占用过大
ch = f.read(1)
if not ch: #如果读取到末尾,设置标识符,然后退出读取循环
flag = 1
break
else:
ch = binascii.b2a_hex(ch) #将字节转为int类型,然后添加到数组中
ch = str(ch)
ch = int(ch,16)
srcBytes.append(ch)
varList = CalculationVar(srcBytes,VarA,VarB)
VarA = varList[0]
VarB = varList[1]
if flag == 1:
CheckSum = getCheckSum(VarA,VarB)
break
print('[*] DEX FILENAME: '+filename)
print('[+] CheckSum = '+hex(CheckSum))
|
修改 dex
文件中的 checksum
to be continued
十里青山远,潮平路带沙。数声啼鸟怨年华。又是凄凉时候,在天涯。白露收残月,清风散晓霞。绿杨堤畔问荷花。记得年时沽酒,那人家。