-
-
[求助][求助]Android的.so文件中JNI本地函数和java层native调用函数参数的对应问题
-
发表于: 2015-10-19 16:30 4110
-
最近小菜在调研一个项目过程中,需要逆向一款Android产品用到的so文件,其中遇到了一个初级问题,在java层看到的JNI调用如下:
private native void startTunnel(int arg1) {
}
====================================================
通过IDA反汇编后的对应反汇编代码如下:
.text:00002F10
.text:00002F10
.text:00002F10 public Java_com_service_FirewallVpnService_startTunnel
.text:00002F10 Java_com_service_FirewallVpnService_startTunnel proc near
.text:00002F10
.text:00002F10 timer = dword ptr -3Ch
.text:00002F10 var_38 = dword ptr -38h
.text:00002F10 var_20 = dword ptr -20h
.text:00002F10 arg_0 = dword ptr 4
.text:00002F10 arg_4 = dword ptr 8
.text:00002F10 arg_8 = dword ptr 0Ch
.text:00002F10
.text:00002F10 push ebp
.text:00002F11 mov ebp, 91A2B3C5h
.text:00002F16 push edi
.text:00002F17 push esi
.text:00002F18 push ebx
.text:00002F19 call sub_2F04
.text:00002F1E add ebx, 0E0D6h
.text:00002F24 lea esp, [esp-2Ch]
.text:00002F28 mov eax, [esp+3Ch+arg_4]
.text:00002F2C mov [esp+3Ch+var_38], eax
.text:00002F30 mov eax, [esp+3Ch+arg_0]
.text:00002F34 mov [esp+3Ch+timer], eax
.text:00002F37 call init_fw_socket
.text:00002F3C mov eax, [esp+3Ch+arg_8]
.text:00002F40 mov [esp+3Ch+timer], eax
.text:00002F43 call init_fd_manager
.text:00002F48 mov eax, ds:(deep_app_id_ptr - 10FF4h)[ebx]
.text:00002F4E mov edi, ds:(run_ptr - 10FF4h)[ebx]
.text:00002F54 mov dword ptr [eax], 0FFFFFFFFh
.text:00002F5A mov dword ptr [edi], 1
.text:00002F60 mov [esp+3Ch+timer], 0 ; timer
.text:00002F67 call _time
.text:00002F6C mov edx, 91A2B3C5h
.text:00002F71 mov ecx, eax
.text:00002F73 imul edx
.text:00002F75 add edx, ecx
.text:00002F77 sar edx, 0Ah
.text:00002F7A sar ecx, 1Fh
.text:00002F7D sub edx, ecx
.text:00002F7F add edx, 1
.text:00002F82 imul edx, 708h
.text:00002F88 mov [esp+3Ch+var_20], edx
.text:00002F8C jmp short loc_2FA9
.text:00002F8C ;
......
====================================================
F5后的代码如下:
int __usercall Java_com_service_FirewallVpnService_startTunnel@<eax>(int a1@<ebx>, int a2, int a3, int a4)
{
int v4; // ebx@1
int v5; // edi@1
signed int v6; // esi@2
int v8; // [sp+1Ch] [bp-20h]@1
sub_2F04();
v4 = a1 + 57558;
init_fw_socket(v4, a2, a3);
init_fd_manager(a4);
v5 = *(int *)((char *)&run_ptr + v4 - 69620);
**(_DWORD **)((char *)&deep_app_id_ptr + v4 - 69620) = -1;
*(_DWORD *)v5 = 1;
v8 = 1800 * (time(0) / 1800 + 1);
while ( *(_DWORD *)v5 )
{
wait_fd();
v6 = time(0);
if ( v6 >= v8 )
{
on_timeout(v8 - 1);
v8 = 1800 * (v6 / 1800 + 1);
}
}
on_timeout(v8 - 1);
clean_fw_socket();
return close_fd_manager();
}
====================================================
我的问题是java层的native函数调用的参数和SO文件中的对应的本地函数参数是如何对应的?类似的JNI调用的反汇编代码在IDA中可以做哪些优化来提升阅读?
希望大大能为我解惑,或者推荐论坛中相关问帖子,小菜在此先谢过大大们。
private native void startTunnel(int arg1) {
}
====================================================
通过IDA反汇编后的对应反汇编代码如下:
.text:00002F10
.text:00002F10
.text:00002F10 public Java_com_service_FirewallVpnService_startTunnel
.text:00002F10 Java_com_service_FirewallVpnService_startTunnel proc near
.text:00002F10
.text:00002F10 timer = dword ptr -3Ch
.text:00002F10 var_38 = dword ptr -38h
.text:00002F10 var_20 = dword ptr -20h
.text:00002F10 arg_0 = dword ptr 4
.text:00002F10 arg_4 = dword ptr 8
.text:00002F10 arg_8 = dword ptr 0Ch
.text:00002F10
.text:00002F10 push ebp
.text:00002F11 mov ebp, 91A2B3C5h
.text:00002F16 push edi
.text:00002F17 push esi
.text:00002F18 push ebx
.text:00002F19 call sub_2F04
.text:00002F1E add ebx, 0E0D6h
.text:00002F24 lea esp, [esp-2Ch]
.text:00002F28 mov eax, [esp+3Ch+arg_4]
.text:00002F2C mov [esp+3Ch+var_38], eax
.text:00002F30 mov eax, [esp+3Ch+arg_0]
.text:00002F34 mov [esp+3Ch+timer], eax
.text:00002F37 call init_fw_socket
.text:00002F3C mov eax, [esp+3Ch+arg_8]
.text:00002F40 mov [esp+3Ch+timer], eax
.text:00002F43 call init_fd_manager
.text:00002F48 mov eax, ds:(deep_app_id_ptr - 10FF4h)[ebx]
.text:00002F4E mov edi, ds:(run_ptr - 10FF4h)[ebx]
.text:00002F54 mov dword ptr [eax], 0FFFFFFFFh
.text:00002F5A mov dword ptr [edi], 1
.text:00002F60 mov [esp+3Ch+timer], 0 ; timer
.text:00002F67 call _time
.text:00002F6C mov edx, 91A2B3C5h
.text:00002F71 mov ecx, eax
.text:00002F73 imul edx
.text:00002F75 add edx, ecx
.text:00002F77 sar edx, 0Ah
.text:00002F7A sar ecx, 1Fh
.text:00002F7D sub edx, ecx
.text:00002F7F add edx, 1
.text:00002F82 imul edx, 708h
.text:00002F88 mov [esp+3Ch+var_20], edx
.text:00002F8C jmp short loc_2FA9
.text:00002F8C ;
......
====================================================
F5后的代码如下:
int __usercall Java_com_service_FirewallVpnService_startTunnel@<eax>(int a1@<ebx>, int a2, int a3, int a4)
{
int v4; // ebx@1
int v5; // edi@1
signed int v6; // esi@2
int v8; // [sp+1Ch] [bp-20h]@1
sub_2F04();
v4 = a1 + 57558;
init_fw_socket(v4, a2, a3);
init_fd_manager(a4);
v5 = *(int *)((char *)&run_ptr + v4 - 69620);
**(_DWORD **)((char *)&deep_app_id_ptr + v4 - 69620) = -1;
*(_DWORD *)v5 = 1;
v8 = 1800 * (time(0) / 1800 + 1);
while ( *(_DWORD *)v5 )
{
wait_fd();
v6 = time(0);
if ( v6 >= v8 )
{
on_timeout(v8 - 1);
v8 = 1800 * (v6 / 1800 + 1);
}
}
on_timeout(v8 - 1);
clean_fw_socket();
return close_fd_manager();
}
====================================================
我的问题是java层的native函数调用的参数和SO文件中的对应的本地函数参数是如何对应的?类似的JNI调用的反汇编代码在IDA中可以做哪些优化来提升阅读?
希望大大能为我解惑,或者推荐论坛中相关问帖子,小菜在此先谢过大大们。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
看原图
赞赏
雪币:
留言: