-
Notifications
You must be signed in to change notification settings - Fork 958
/
Utilities32.java
134 lines (112 loc) · 4.81 KB
/
Utilities32.java
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package org.telegram.messenger;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.arm.backend.DynarmicFactory;
import com.github.unidbg.arm.backend.KvmFactory;
import com.github.unidbg.arm.backend.Unicorn2Factory;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.linux.android.dvm.jni.ProxyClassFactory;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.utils.Inspector;
import com.github.unidbg.virtualmodule.android.AndroidModule;
import com.github.unidbg.virtualmodule.android.JniGraphics;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
/**
* mvn test -Dmaven.test.skip=false -Dtest=org.telegram.messenger.Utilities32
*/
public class Utilities32 extends TestCase {
private static LibraryResolver createLibraryResolver() {
return new AndroidResolver(23);
}
private static AndroidEmulator createARMEmulator() {
return AndroidEmulatorBuilder
.for32Bit()
.setProcessName("org.telegram.messenger")
.addBackendFactory(new DynarmicFactory(true))
.addBackendFactory(new KvmFactory(true))
.addBackendFactory(new Unicorn2Factory(true))
.build();
}
private final AndroidEmulator emulator;
private final VM vm;
private final DvmClass cUtilities;
public Utilities32() {
emulator = createARMEmulator();
final Memory memory = emulator.getMemory();
memory.setLibraryResolver(createLibraryResolver());
vm = emulator.createDalvikVM();
vm.setDvmClassFactory(new ProxyClassFactory());
Module module = new JniGraphics(emulator, vm).register(memory);
assert module != null;
new AndroidModule(emulator, vm).register(memory);
System.out.println("backend=" + emulator.getBackend());
vm.setVerbose(true);
File file = new File("src/test/resources/example_binaries/armeabi-v7a/libtmessages.29.so");
DalvikModule dm = vm.loadLibrary(file.canRead() ? file : new File("unidbg-android/src/test/resources/example_binaries/armeabi-v7a/libtmessages.29.so"), true);
dm.callJNI_OnLoad(emulator);
cUtilities = vm.resolveClass("org/telegram/messenger/Utilities");
}
private void destroy() throws IOException {
emulator.close();
System.out.println("destroy");
}
public void test() throws Exception {
this.aesCbcEncryptionByteArray();
this.aesCtrDecryptionByteArray();
this.pbkdf2();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
destroy();
}
public static void main(String[] args) throws Exception {
Utilities32 test = new Utilities32();
test.aesCbcEncryptionByteArray();
test.aesCtrDecryptionByteArray();
test.pbkdf2();
test.destroy();
}
private void aesCbcEncryptionByteArray() {
long start = System.currentTimeMillis();
ByteArray data = new ByteArray(vm, new byte[16]);
byte[] key = new byte[32];
byte[] iv = new byte[16];
cUtilities.callStaticJniMethod(emulator, "aesCbcEncryptionByteArray([B[B[BIIII)V", data,
key,
iv,
0, data.length(), 0, 0);
Inspector.inspect(data.getValue(), "aesCbcEncryptionByteArray offset=" + (System.currentTimeMillis() - start) + "ms");
}
private void aesCtrDecryptionByteArray() {
long start = System.currentTimeMillis();
ByteArray data = new ByteArray(vm, new byte[16]);
byte[] key = new byte[32];
byte[] iv = new byte[16];
cUtilities.callStaticJniMethod(emulator, "aesCtrDecryptionByteArray([B[B[BIII)V", data,
key,
iv,
0, data.length(), 0);
Inspector.inspect(data.getValue(), "[" + emulator.getBackend() + "]aesCtrDecryptionByteArray offset=" + (System.currentTimeMillis() - start) + "ms");
}
private void pbkdf2() {
byte[] password = "123456".getBytes();
byte[] salt = new byte[8];
ByteArray dst = new ByteArray(vm, new byte[64]);
for (int i = 0; i < 3; i++) {
long start = System.currentTimeMillis();
cUtilities.callStaticJniMethod(emulator, "pbkdf2([B[B[BI)V", password,
salt,
dst, 100000);
Inspector.inspect(dst.getValue(), "pbkdf2 offset=" + (System.currentTimeMillis() - start) + "ms");
}
}
}