本文针对android 的JNI代码进行还原。

f5伪代码

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
__int64 __fastcall Java_com_adse_netbridge_NetBridgeService_jni_1init(__int64 a1, __int64 a2, int a3) {
int v3; // w20
__int64 v4; // x0
__int64 v5; // x19
unsigned int * v6; // x20
unsigned int * v7; // x0
unsigned int v8; // w20
__int64 v9; // x0
__int64 result; // x0
int v11; // w0
unsigned int * v12; // x0
unsigned int v13; // w20
__int64 v14; // x0
int v15; // w0
unsigned int * v16; // x0
unsigned int v17; // w20
__int64 v18; // x0
v3 = a3;
v4 = calloc(1LL, 64LL); * (_DWORD * )(v4 + 52) = v3;
v5 = v4;
loglevel = 5;
socks5_addr = 0;
socks5_port = 0;
socks5_username = 0;
socks5_password = 0;
pcap_file = 0LL;
if ((unsigned int) pthread_mutex_init()) log_android(6LL, "pthread_mutex_init failed");
v6 = (unsigned int * )(v5 + 40);
if ((unsigned int) pipe((int * )(v5 + 40))) {
v7 = (unsigned int * ) __errno();
v8 = *v7;
v9 = strerror( * v7);
log_android(6LL, "Create pipe error %d: %s", v8, v9);
result = v5;
} else {
v11 = fcntl( * v6, 3LL, 0LL);
if (v11 & 0x80000000 || fcntl( * v6, 4LL, v11 | 0x800u) & 0x80000000) {
v12 = (unsigned int * ) __errno();
v13 = *v12;
v14 = strerror(v12);
log_android(6LL, "fcntl pipefds[%d] O_NONBLOCK error %d: %s", 0LL, v13, v14);
}
v15 = fcntl((unsigned int)(v5 + 44), 3LL, 0LL);
if (v15 & 0x80000000 || fcntl((unsigned int * )(v5 + 44), 4LL, v15 | 0x800u) & 0x80000000) {
v16 = (unsigned int * ) __errno();
v17 = *v16;
v18 = strerror( * v16);
log_android(6LL, "fcntl pipefds[%d] O_NONBLOCK error %d: %s", 1LL, v17, v18);
result = v5;
} else {
result = v5;
}
}
return result;
}

cpp

理解了!下面是带有中文注释的完整 JNI 函数代码:

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
#include <jni.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

// 假设这些是全局变量,在其他地方有声明和定义
int loglevel;
int socks5_addr;
int socks5_port;
char *socks5_username;
char *socks5_password;
char *pcap_file;

JNIEXPORT jlong JNICALL Java_com_adse_netbridge_NetBridgeService_jni_1init(JNIEnv *env, jobject obj, jlong a1, jlong a2, jint a3) {
// 获取参数 a3 的值
int v3 = a3;
// 分配一个大小为 64 字节的内存块,并初始化为 0
jlong v4 = (jlong)calloc(1, 64);
if (v4 == 0) {
// 处理内存分配失败的情况
return 0;
}

// 将参数 a3 的值存储在分配的内存块中的偏移位置为 52 字节处
*(int *)((char *)v4 + 52) = v3;

// 初始化全局变量
loglevel = 5;
socks5_addr = 0;
socks5_port = 0;
socks5_username = NULL;
socks5_password = NULL;
pcap_file = NULL;

// 初始化互斥锁(如果需要,请根据实际情况修改)
// if (pthread_mutex_init(...) != 0) {
// log_android(6, "pthread_mutex_init failed");
// }

// 创建一个管道
int pipefds[2];
if (pipe(pipefds) != 0) {
int error = errno;
char *error_msg = strerror(error);
// 处理管道创建失败的情况
// log_android(6, "Create pipe error %d: %s", error, error_msg);
free((void *)v4);
return 0;
}

// 将管道的第一个描述符设置为非阻塞模式
if (fcntl(pipefds[0], F_SETFL, O_NONBLOCK) < 0) {
int error = errno;
char *error_msg = strerror(error);
// 处理 fcntl 错误
// log_android(6, "fcntl pipefds[0] O_NONBLOCK error %d: %s", error, error_msg);
}

// 将管道的第二个描述符设置为非阻塞模式
if (fcntl(pipefds[1], F_SETFL, O_NONBLOCK) < 0) {
int error = errno;
char *error_msg = strerror(error);
// 处理 fcntl 错误
// log_android(6, "fcntl pipefds[1] O_NONBLOCK error %d: %s", error, error_msg);
}

// 返回分配的内存块地址作为 jlong 类型的返回值
return v4;
}