在 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
十里青山远,潮平路带沙。数声啼鸟怨年华。又是凄凉时候,在天涯。白露收残月,清风散晓霞。绿杨堤畔问荷花。记得年时沽酒,那人家。