逆向工程 --- 从AI分析一个helloworld开始
本人喜欢先入为主,我先解释反编译,在介绍反汇编包括不同硬件架构的版本有arm,x86,mips,elf,最终到底层二进制。
LOAD:0000000000000000 ; LOAD:0000000000000000 ; +-------------------------------------------------------------------------+ LOAD:0000000000000000 ; | This file was generated by The Interactive Disassembler (IDA) | LOAD:0000000000000000 ; | Copyright (c) 2023 Hex-Rays, <support@hex-rays.com> | LOAD:0000000000000000 ; +-------------------------------------------------------------------------+ LOAD:0000000000000000 ; LOAD:0000000000000000 ; Input SHA256 : 4C8D4BB2E8723C2F2BDAA94221C1312C15E33D89E089349CF6892176DD6DA28F LOAD:0000000000000000 ; Input MD5 : 9971ACCE2417DEAFDD5559E4FDF6FE5E LOAD:0000000000000000 ; Input CRC32 : 0EDABED0 LOAD:0000000000000000 LOAD:0000000000000000 ; File Name : C:\Users\21558\Pictures\lib\x86_64\libhello_jni.so LOAD:0000000000000000 ; Format : ELF64 for x86-64 (Shared object) LOAD:0000000000000000 ; Needed Library 'liblog.so' LOAD:0000000000000000 ; Needed Library 'libstdc++.so' LOAD:0000000000000000 ; Needed Library 'libm.so' LOAD:0000000000000000 ; Needed Library 'libc.so' LOAD:0000000000000000 ; Needed Library 'libdl.so' LOAD:0000000000000000 ; Shared Name 'libhello_jni.so' LOAD:0000000000000000 ; LOAD:0000000000000000 LOAD:0000000000000000 .686p LOAD:0000000000000000 .mmx LOAD:0000000000000000 .model flat LOAD:0000000000000000 .intel_syntax noprefix LOAD:0000000000000000 LOAD:0000000000000000 ; =========================================================================== LOAD:0000000000000000 LOAD:0000000000000000 ; Segment type: Pure code LOAD:0000000000000000 ; Segment permissions: Read/Execute LOAD:0000000000000000 LOAD segment mempage public 'CODE' use64 LOAD:0000000000000000 assume cs:LOAD LOAD:0000000000000000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing LOAD:0000000000000000 dword_0 dd 464C457Fh ; DATA XREF: LOAD:0000000000000240↓o LOAD:0000000000000000 ; LOAD:0000000000000258↓o ... LOAD:0000000000000000 ; File format: \x7FELF LOAD:0000000000000004 db 2 ; File class: 64-bit LOAD:0000000000000005 db 1 ; Data encoding: little-endian LOAD:0000000000000006 db 1 ; File version LOAD:0000000000000007 db 0 ; OS/ABI: UNIX System V ABI LOAD:0000000000000008 db 0 ; ABI Version LOAD:0000000000000009 db 7 dup(0) ; Padding LOAD:0000000000000010 dw 3 ; File type: Shared object LOAD:0000000000000012 dw 3Eh ; Machine: x86-64 LOAD:0000000000000014 dd 1 ; File version LOAD:0000000000000018 dq 0 ; Entry point LOAD:0000000000000020 dq 40h ; PHT file offset LOAD:0000000000000028 dq 1160h ; SHT file offset LOAD:0000000000000030 dd 0 ; Processor-specific flags LOAD:0000000000000034 dw 40h ; ELF header size LOAD:0000000000000036 dw 38h ; PHT entry size LOAD:0000000000000038 dw 8 ; Number of entries in PHT LOAD:000000000000003A dw 40h ; SHT entry size LOAD:000000000000003C dw 19h ; Number of entries in SHT LOAD:000000000000003E dw 18h ; SHT entry index for string table LOAD:0000000000000040 ; ELF64 Program Header LOAD:0000000000000040 ; PHT Entry 0 LOAD:0000000000000040 dword_40 dd 6 ; DATA XREF: LOAD:0000000000000050↓o LOAD:0000000000000040 ; Type: PHDR LOAD:0000000000000044 dd 4 ; Flags LOAD:0000000000000048 dq 40h ; File offset LOAD:0000000000000050 dq offset dword_40 ; Virtual address LOAD:0000000000000058 dq 40h ; Physical address LOAD:0000000000000060 dq 1C0h ; Size in file image LOAD:0000000000000068 dq 1C0h ; Size in memory image LOAD:0000000000000070 dq 8 ; Alignment LOAD:0000000000000078 ; PHT Entry 1 LOAD:0000000000000078 dd 1 ; Type: LOAD LOAD:000000000000007C dd 5 ; Flags LOAD:0000000000000080 dq 0 ; File offset LOAD:0000000000000088 dq 0 ; Virtual address LOAD:0000000000000090 dq 0 ; Physical address LOAD:0000000000000098 dq 858h ; Size in file image LOAD:00000000000000A0 dq 858h ; Size in memory image LOAD:00000000000000A8 dq 1000h ; Alignment LOAD:00000000000000B0 ; PHT Entry 2 LOAD:00000000000000B0 dd 1 ; Type: LOAD LOAD:00000000000000B4 dd 6 ; Flags LOAD:00000000000000B8 dq 0D60h ; File offset LOAD:00000000000000C0 dq offset off_1D60 ; Virtual address LOAD:00000000000000C8 dq 1D60h ; Physical address LOAD:00000000000000D0 dq 2C8h ; Size in file image LOAD:00000000000000D8 dq 2C8h ; Size in memory image LOAD:00000000000000E0 dq 1000h ; Alignment LOAD:00000000000000E8 ; PHT Entry 3 LOAD:00000000000000E8 dd 2 ; Type: DYNAMIC LOAD:00000000000000EC dd 6 ; Flags LOAD:00000000000000F0 dq 0D78h ; File offset LOAD:00000000000000F8 dq offset stru_1D78 ; Virtual address LOAD:0000000000000100 dq 1D78h ; Physical address LOAD:0000000000000108 dq 250h ; Size in file image LOAD:0000000000000110 dq 250h ; Size in memory image LOAD:0000000000000118 dq 8 ; Alignment LOAD:0000000000000120 ; PHT Entry 4 LOAD:0000000000000120 dd 4 ; Type: NOTE LOAD:0000000000000124 dd 4 ; Flags LOAD:0000000000000128 dq 200h ; File offset LOAD:0000000000000130 dq offset dword_200 ; Virtual address LOAD:0000000000000138 dq 200h ; Physical address LOAD:0000000000000140 dq 24h ; Size in file image LOAD:0000000000000148 dq 24h ; Size in memory image LOAD:0000000000000150 dq 4 ; Alignment LOAD:0000000000000158 ; PHT Entry 5 LOAD:0000000000000158 dd 6474E550h ; Type: EH_FRAME LOAD:000000000000015C dd 4 ; Flags LOAD:0000000000000160 dq 814h ; File offset LOAD:0000000000000168 dq offset unk_814 ; Virtual address LOAD:0000000000000170 dq 814h ; Physical address LOAD:0000000000000178 dq 44h ; Size in file image LOAD:0000000000000180 dq 44h ; Size in memory image LOAD:0000000000000188 dq 4 ; Alignment LOAD:0000000000000190 ; PHT Entry 6 LOAD:0000000000000190 dd 6474E551h ; Type: STACK LOAD:0000000000000194 dd 6 ; Flags LOAD:0000000000000198 dq 0 ; File offset LOAD:00000000000001A0 dq 0 ; Virtual address LOAD:00000000000001A8 dq 0 ; Physical address LOAD:00000000000001B0 dq 0 ; Size in file image LOAD:00000000000001B8 dq 0 ; Size in memory image LOAD:00000000000001C0 dq 0 ; Alignment LOAD:00000000000001C8 ; PHT Entry 7 LOAD:00000000000001C8 dd 6474E552h ; Type: RO-AFTER LOAD:00000000000001CC dd 6 ; Flags LOAD:00000000000001D0 dq 0D60h ; File offset LOAD:00000000000001D8 dq offset off_1D60 ; Virtual address LOAD:00000000000001E0 dq 1D60h ; Physical address LOAD:00000000000001E8 dq 2A0h ; Size in file image LOAD:00000000000001F0 dq 2A0h ; Size in memory image LOAD:00000000000001F8 dq 8 ; Alignment LOAD:0000000000000200 ; ELF Note Entry LOAD:0000000000000200 dword_200 dd 4 ; DATA XREF: LOAD:0000000000000130↑o LOAD:0000000000000200 ; Name Size LOAD:0000000000000204 dd 14h ; Desc Size LOAD:0000000000000208 dd 3 ; Type: NT_GNU_BUILD_ID LOAD:000000000000020C aGnu db 'GNU',0 ; Name LOAD:0000000000000210 db 1Bh, 40h, 77h, 0FDh, 47h, 62h, 30h, 0A8h, 0C2h, 30h ; Desc LOAD:000000000000021A db 0C6h, 26h, 0F9h, 5Bh, 0BFh, 64h, 7Fh, 18h, 2Dh, 0A7h LOAD:0000000000000224 align 8 LOAD:0000000000000228 ; ELF Symbol Table LOAD:0000000000000228 Elf64_Sym <0> LOAD:0000000000000240 Elf64_Sym <offset aCxaFinalize - offset byte_318, 12h, 0, 0, \ ; "__cxa_finalize" LOAD:0000000000000240 offset dword_0, 0> LOAD:0000000000000258 Elf64_Sym <offset aCxaAtexit - offset byte_318, 12h, 0, 0, \ ; "__cxa_atexit" LOAD:0000000000000258 offset dword_0, 0> LOAD:0000000000000270 Elf64_Sym <offset aJavaGithubJp10 - offset byte_318, 12h, 0, 0Bh, \ ; "Java_github_jp1017_hellojni_MainActivit"... LOAD:0000000000000270 offset Java_github_jp1017_hellojni_MainActivity_staticRegFromJni,\ LOAD:0000000000000270 13h> LOAD:0000000000000288 Elf64_Sym <offset aJniOnload - offset byte_318, 12h, 0, 0Bh, \ ; "JNI_OnLoad" LOAD:0000000000000288 offset JNI_OnLoad, 7Ch> LOAD:00000000000002A0 Elf64_Sym <offset aNativemethod - offset byte_318, 11h, 0, 14h, \ ; "nativeMethod" LOAD:00000000000002A0 offset nativeMethod, 18h> LOAD:00000000000002B8 Elf64_Sym <offset aStackChkFail - offset byte_318, 12h, 0, 0, \ ; "__stack_chk_fail" LOAD:00000000000002B8 offset dword_0, 0> LOAD:00000000000002D0 Elf64_Sym <offset aEdata - offset byte_318, 10h, 0, 0FFF1h, \ ; "_edata" LOAD:00000000000002D0 offset unk_2028, 0> LOAD:00000000000002E8 Elf64_Sym <offset aBssStart - offset byte_318, 10h, 0, 0FFF1h, \ ; "__bss_start" LOAD:00000000000002E8 offset unk_2028, 0> LOAD:0000000000000300 Elf64_Sym <offset aEnd - offset byte_318, 10h, 0, 0FFF1h, \ ; "_end" LOAD:0000000000000300 offset unk_2028, 0> LOAD:0000000000000318 ; ELF String Table LOAD:0000000000000318 byte_318 db 0 ; DATA XREF: LOAD:0000000000000240↑o LOAD:0000000000000318 ; LOAD:0000000000000258↑o ... LOAD:0000000000000319 aCxaFinalize db '__cxa_finalize',0 ; DATA XREF: LOAD:0000000000000240↑o LOAD:0000000000000328 aLibc db 'LIBC',0 ; DATA XREF: LOAD:0000000000000474↓o LOAD:000000000000032D aLibcSo db 'libc.so',0 ; DATA XREF: LOAD:0000000000000464↓o LOAD:0000000000000335 aLibhelloJniSo db 'libhello_jni.so',0 ; DATA XREF: LOAD:000000000000045C↓o LOAD:0000000000000345 aCxaAtexit db '__cxa_atexit',0 ; DATA XREF: LOAD:0000000000000258↑o LOAD:0000000000000352 aJavaGithubJp10 db 'Java_github_jp1017_hellojni_MainActivity_staticRegFromJni',0 LOAD:0000000000000352 ; DATA XREF: LOAD:0000000000000270↑o LOAD:000000000000038C aJniOnload db 'JNI_OnLoad',0 ; DATA XREF: LOAD:0000000000000288↑o LOAD:0000000000000397 aNativemethod db 'nativeMethod',0 ; DATA XREF: LOAD:00000000000002A0↑o LOAD:00000000000003A4 aStackChkFail db '__stack_chk_fail',0 ; DATA XREF: LOAD:00000000000002B8↑o LOAD:00000000000003B5 aEdata db '_edata',0 ; DATA XREF: LOAD:00000000000002D0↑o LOAD:00000000000003BC aBssStart db '__bss_start',0 ; DATA XREF: LOAD:00000000000002E8↑o LOAD:00000000000003C8 aEnd db '_end',0 ; DATA XREF: LOAD:0000000000000300↑o LOAD:00000000000003CD aLiblogSo db 'liblog.so',0 LOAD:00000000000003D7 aLibstdcSo db 'libstdc++.so',0 LOAD:00000000000003E4 aLibmSo db 'libm.so',0 LOAD:00000000000003EC aLibdlSo db 'libdl.so',0 LOAD:00000000000003F5 align 8 LOAD:00000000000003F8 ; ELF Hash Table LOAD:00000000000003F8 elf_hash_nbucket dd 3 LOAD:00000000000003FC elf_hash_nchain dd 0Ah LOAD:0000000000000400 elf_hash_bucket dd 7, 9, 8 LOAD:000000000000040C elf_hash_chain dd 3 dup(0), 2, 1, 3, 0, 6, 4, 5 LOAD:0000000000000434 ; ELF GNU Symbol Version Table LOAD:0000000000000434 dw 0 LOAD:0000000000000436 dw 2 ; __cxa_finalize@@LIBC LOAD:0000000000000438 dw 2 ; __cxa_atexit@@LIBC LOAD:000000000000043A dw 1 ; global symbol: Java_github_jp1017_hellojni_MainActivity_staticRegFromJni LOAD:000000000000043C dw 1 ; global symbol: JNI_OnLoad LOAD:000000000000043E dw 1 ; global symbol: nativeMethod LOAD:0000000000000440 dw 2 ; __stack_chk_fail@@LIBC LOAD:0000000000000442 dw 1 ; global symbol: _edata LOAD:0000000000000444 dw 1 ; global symbol: __bss_start LOAD:0000000000000446 dw 1 ; global symbol: _end LOAD:0000000000000448 ; ELF GNU Symbol Version Definitions LOAD:0000000000000448 Elf64_Verdef <1, 1, 1, 1, 0EF8E45Fh, 14h, 0> LOAD:000000000000045C Elf64_Verdaux <offset aLibhelloJniSo - offset byte_318, 0> ; "libhello_jni.so" LOAD:0000000000000464 ; ELF GNU Symbol Version Requirements LOAD:0000000000000464 Elf64_Verneed <1, 1, offset aLibcSo - offset byte_318, 10h, 0> ; "libc.so" LOAD:0000000000000474 Elf64_Vernaux <50D63h, 0, 2, offset aLibc - offset byte_318, 0> ; "LIBC" LOAD:0000000000000484 align 8 LOAD:0000000000000488 ; ELF RELA Relocation Table LOAD:0000000000000488 Elf64_Rela <1D60h, 8, 5A0h> ; R_X86_64_RELATIVE +5A0h LOAD:00000000000004A0 Elf64_Rela <1FC8h, 8, 2010h> ; R_X86_64_RELATIVE +2010h LOAD:00000000000004B8 Elf64_Rela <2000h, 8, 2000h> ; R_X86_64_RELATIVE +2000h LOAD:00000000000004D0 Elf64_Rela <2010h, 8, 6E2h> ; R_X86_64_RELATIVE +6E2h LOAD:00000000000004E8 Elf64_Rela <2018h, 8, 6F4h> ; R_X86_64_RELATIVE +6F4h LOAD:0000000000000500 Elf64_Rela <2020h, 8, 5F0h> ; R_X86_64_RELATIVE +5F0h LOAD:0000000000000518 ; ELF JMPREL Relocation Table LOAD:0000000000000518 Elf64_Rela <1FE8h, 200000007h, 0> ; R_X86_64_JUMP_SLOT __cxa_atexit LOAD:0000000000000530 Elf64_Rela <1FF0h, 100000007h, 0> ; R_X86_64_JUMP_SLOT __cxa_finalize LOAD:0000000000000548 Elf64_Rela <1FF8h, 600000007h, 0> ; R_X86_64_JUMP_SLOT __stack_chk_fail LOAD:0000000000000548 LOAD ends LOAD:0000000000000548 .plt:0000000000000560 ; =========================================================================== .plt:0000000000000560 .plt:0000000000000560 ; Segment type: Pure code .plt:0000000000000560 ; Segment permissions: Read/Execute .plt:0000000000000560 _plt segment para public 'CODE' use64 .plt:0000000000000560 assume cs:_plt .plt:0000000000000560 ;org 560h .plt:0000000000000560 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing .plt:0000000000000560 .plt:0000000000000560 ; =============== S U B R O U T I N E ======================================= .plt:0000000000000560 .plt:0000000000000560 .plt:0000000000000560 sub_560 proc near ; CODE XREF: .plt:000000000000057B↓j .plt:0000000000000560 ; .plt:000000000000058B↓j ... .plt:0000000000000560 ; __unwind { .plt:0000000000000560 push cs:qword_1FD8 .plt:0000000000000566 jmp cs:qword_1FE0 .plt:0000000000000566 sub_560 endp .plt:0000000000000566 .plt:0000000000000566 ; --------------------------------------------------------------------------- .plt:000000000000056C align 10h .plt:0000000000000570 ; [00000006 BYTES: COLLAPSED FUNCTION ___cxa_atexit. PRESS CTRL-NUMPAD+ TO EXPAND] .plt:0000000000000576 ; --------------------------------------------------------------------------- .plt:0000000000000576 push 0 .plt:000000000000057B jmp sub_560 .plt:0000000000000580 ; [00000006 BYTES: COLLAPSED FUNCTION ___cxa_finalize. PRESS CTRL-NUMPAD+ TO EXPAND] .plt:0000000000000586 ; --------------------------------------------------------------------------- .plt:0000000000000586 push 1 .plt:000000000000058B jmp sub_560 .plt:0000000000000590 ; [00000006 BYTES: COLLAPSED FUNCTION ___stack_chk_fail. PRESS CTRL-NUMPAD+ TO EXPAND] .plt:0000000000000596 ; --------------------------------------------------------------------------- .plt:0000000000000596 push 2 .plt:000000000000059B jmp sub_560 .plt:000000000000059B ; } // starts at 560 .plt:000000000000059B _plt ends .plt:000000000000059B .text:00000000000005A0 ; =========================================================================== .text:00000000000005A0 .text:00000000000005A0 ; Segment type: Pure code .text:00000000000005A0 ; Segment permissions: Read/Execute .text:00000000000005A0 _text segment para public 'CODE' use64 .text:00000000000005A0 assume cs:_text .text:00000000000005A0 ;org 5A0h .text:00000000000005A0 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing .text:00000000000005A0 .text:00000000000005A0 ; =============== S U B R O U T I N E ======================================= .text:00000000000005A0 .text:00000000000005A0 .text:00000000000005A0 sub_5A0 proc near ; DATA XREF: .fini_array:off_1D60↓o .text:00000000000005A0 ; __unwind { .text:00000000000005A0 lea rdi, off_2000 ; void * .text:00000000000005A7 jmp ___cxa_finalize .text:00000000000005A7 ; } // starts at 5A0 .text:00000000000005A7 sub_5A0 endp .text:00000000000005A7 .text:00000000000005A7 ; --------------------------------------------------------------------------- .text:00000000000005AC align 10h .text:00000000000005B0 .text:00000000000005B0 loc_5B0: ; DATA XREF: .text:00000000000005CA↓o .text:00000000000005B0 ; __unwind { .text:00000000000005B0 test rdi, rdi .text:00000000000005B3 jz short locret_5B8 .text:00000000000005B5 jmp rdi .text:00000000000005B5 ; --------------------------------------------------------------------------- .text:00000000000005B7 align 8 .text:00000000000005B8 .text:00000000000005B8 locret_5B8: ; CODE XREF: .text:00000000000005B3↑j .text:00000000000005B8 retn .text:00000000000005B8 ; } // starts at 5B0 .text:00000000000005B8 ; --------------------------------------------------------------------------- .text:00000000000005B9 align 20h .text:00000000000005C0 ; __unwind { .text:00000000000005C0 mov rsi, rdi .text:00000000000005C3 lea rdx, off_2000 .text:00000000000005CA lea rdi, loc_5B0 .text:00000000000005D1 jmp ___cxa_atexit .text:00000000000005D1 ; } // starts at 5C0 .text:00000000000005D1 ; --------------------------------------------------------------------------- .text:00000000000005D6 db 66h, 2Eh, 0Fh, 1Fh, 84h, 5 dup(0) .text:00000000000005E0 db 0Fh, 1Fh, 40h, 0 .text:00000000000005E4 align 10h .text:00000000000005F0 .text:00000000000005F0 loc_5F0: ; DATA XREF: .data:0000000000002020↓o .text:00000000000005F0 ; __unwind { .text:00000000000005F0 mov rax, [rdi] .text:00000000000005F3 lea rsi, unk_6B0 .text:00000000000005FA mov rax, [rax+538h] .text:0000000000000601 jmp rax .text:0000000000000601 ; } // starts at 5F0 .text:0000000000000601 ; --------------------------------------------------------------------------- .text:0000000000000603 align 10h .text:0000000000000610 .text:0000000000000610 ; =============== S U B R O U T I N E ======================================= .text:0000000000000610 .text:0000000000000610 .text:0000000000000610 public Java_github_jp1017_hellojni_MainActivity_staticRegFromJni .text:0000000000000610 Java_github_jp1017_hellojni_MainActivity_staticRegFromJni proc near .text:0000000000000610 ; DATA XREF: LOAD:0000000000000270↑o .text:0000000000000610 ; __unwind { .text:0000000000000610 mov rax, [rdi] .text:0000000000000613 lea rsi, unk_6C9 .text:000000000000061A mov rax, [rax+538h] .text:0000000000000621 jmp rax .text:0000000000000621 ; } // starts at 610 .text:0000000000000621 Java_github_jp1017_hellojni_MainActivity_staticRegFromJni endp .text:0000000000000621 .text:0000000000000621 ; --------------------------------------------------------------------------- .text:0000000000000623 align 10h .text:0000000000000630 .text:0000000000000630 ; =============== S U B R O U T I N E ======================================= .text:0000000000000630 .text:0000000000000630 .text:0000000000000630 public JNI_OnLoad .text:0000000000000630 JNI_OnLoad proc near ; DATA XREF: LOAD:0000000000000288↑o .text:0000000000000630 .text:0000000000000630 var_18 = qword ptr -18h .text:0000000000000630 var_10 = qword ptr -10h .text:0000000000000630 .text:0000000000000630 ; __unwind { .text:0000000000000630 lea rsp, [rsp-18h] .text:0000000000000635 mov edx, 10004h .text:000000000000063A mov rax, fs:28h .text:0000000000000643 mov [rsp+18h+var_10], rax .text:0000000000000648 xor eax, eax .text:000000000000064A mov rax, [rdi] .text:000000000000064D mov rsi, rsp .text:0000000000000650 call qword ptr [rax+30h] .text:0000000000000653 mov edx, 0FFFFFFFFh .text:0000000000000658 test eax, eax .text:000000000000065A jnz short loc_68F .text:000000000000065C mov rdi, [rsp+18h+var_18] .text:0000000000000660 lea rsi, aGithubJp1017He ; "github/jp1017/hellojni/MainActivity" .text:0000000000000667 mov rax, [rdi] .text:000000000000066A call qword ptr [rax+30h] .text:000000000000066D mov rdi, [rsp+18h+var_18] .text:0000000000000671 mov ecx, 1 .text:0000000000000676 mov rdx, cs:nativeMethod_ptr .text:000000000000067D mov rsi, rax .text:0000000000000680 mov r8, [rdi] .text:0000000000000683 call qword ptr [r8+6B8h] .text:000000000000068A mov edx, 10004h .text:000000000000068F .text:000000000000068F loc_68F: ; CODE XREF: JNI_OnLoad+2A↑j .text:000000000000068F mov rcx, [rsp+18h+var_10] .text:0000000000000694 xor rcx, fs:28h .text:000000000000069D mov eax, edx .text:000000000000069F jnz short loc_6A7 .text:00000000000006A1 lea rsp, [rsp+18h] .text:00000000000006A6 retn .text:00000000000006A7 ; --------------------------------------------------------------------------- .text:00000000000006A7 .text:00000000000006A7 loc_6A7: ; CODE XREF: JNI_OnLoad+6F↑j .text:00000000000006A7 call ___stack_chk_fail .text:00000000000006A7 ; } // starts at 630 .text:00000000000006A7 JNI_OnLoad endp .text:00000000000006A7 .text:00000000000006A7 _text ends .text:00000000000006A7 LOAD:00000000000006AC ; =========================================================================== LOAD:00000000000006AC LOAD:00000000000006AC ; Segment type: Pure code LOAD:00000000000006AC ; Segment permissions: Read/Execute LOAD:00000000000006AC LOAD segment mempage public 'CODE' use64 LOAD:00000000000006AC assume cs:LOAD LOAD:00000000000006AC ;org 6ACh LOAD:00000000000006AC assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing LOAD:00000000000006AC align 10h LOAD:00000000000006AC LOAD ends LOAD:00000000000006AC .rodata:00000000000006B0 ; =========================================================================== .rodata:00000000000006B0 .rodata:00000000000006B0 ; Segment type: Pure data .rodata:00000000000006B0 ; Segment permissions: Read .rodata:00000000000006B0 _rodata segment qword public 'CONST' use64 .rodata:00000000000006B0 assume cs:_rodata .rodata:00000000000006B0 ;org 6B0h .rodata:00000000000006B0 unk_6B0 db 0E5h ; DATA XREF: .text:00000000000005F3↑o .rodata:00000000000006B1 db 8Ah .rodata:00000000000006B2 db 0A8h .rodata:00000000000006B3 db 0E6h .rodata:00000000000006B4 db 80h ; € .rodata:00000000000006B5 db 81h .rodata:00000000000006B6 db 0E6h .rodata:00000000000006B7 db 0B3h .rodata:00000000000006B8 db 0A8h .rodata:00000000000006B9 db 0E5h .rodata:00000000000006BA db 86h .rodata:00000000000006BB db 8Ch .rodata:00000000000006BC db 0E8h .rodata:00000000000006BD db 0B0h .rodata:00000000000006BE db 83h .rodata:00000000000006BF db 0E7h .rodata:00000000000006C0 db 94h .rodata:00000000000006C1 db 0A8h .rodata:00000000000006C2 db 0E6h .rodata:00000000000006C3 db 88h .rodata:00000000000006C4 db 90h .rodata:00000000000006C5 db 0E5h .rodata:00000000000006C6 db 8Ah .rodata:00000000000006C7 db 9Fh .rodata:00000000000006C8 db 0 .rodata:00000000000006C9 unk_6C9 db 0E9h ; DATA XREF: Java_github_jp1017_hellojni_MainActivity_staticRegFromJni+3↑o .rodata:00000000000006CA db 9Dh .rodata:00000000000006CB db 99h .rodata:00000000000006CC db 0E6h .rodata:00000000000006CD db 80h ; € .rodata:00000000000006CE db 81h .rodata:00000000000006CF db 0E6h .rodata:00000000000006D0 db 0B3h .rodata:00000000000006D1 db 0A8h .rodata:00000000000006D2 db 0E5h .rodata:00000000000006D3 db 86h .rodata:00000000000006D4 db 8Ch .rodata:00000000000006D5 db 0E8h .rodata:00000000000006D6 db 0B0h .rodata:00000000000006D7 db 83h .rodata:00000000000006D8 db 0E7h .rodata:00000000000006D9 db 94h .rodata:00000000000006DA db 0A8h .rodata:00000000000006DB db 0E6h .rodata:00000000000006DC db 88h .rodata:00000000000006DD db 90h .rodata:00000000000006DE db 0E5h .rodata:00000000000006DF db 8Ah .rodata:00000000000006E0 db 9Fh .rodata:00000000000006E1 db 0 .rodata:00000000000006E2 aDynamicregfrom db 'dynamicRegFromJni',0 .rodata:00000000000006E2 ; DATA XREF: .data:nativeMethod↓o .rodata:00000000000006F4 aLjavaLangStrin db '()Ljava/lang/String;',0 .rodata:00000000000006F4 ; DATA XREF: .data:0000000000002018↓o .rodata:0000000000000709 align 10h .rodata:0000000000000710 aGithubJp1017He db 'github/jp1017/hellojni/MainActivity',0 .rodata:0000000000000710 ; DATA XREF: JNI_OnLoad+30↑o .rodata:0000000000000710 _rodata ends .rodata:0000000000000710 LOAD:0000000000000734 ; =========================================================================== LOAD:0000000000000734 LOAD:0000000000000734 ; Segment type: Pure code LOAD:0000000000000734 ; Segment permissions: Read/Execute LOAD:0000000000000734 LOAD segment mempage public 'CODE' use64 LOAD:0000000000000734 assume cs:LOAD LOAD:0000000000000734 ;org 734h LOAD:0000000000000734 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing LOAD:0000000000000734 align 8 LOAD:0000000000000734 LOAD ends LOAD:0000000000000734 .eh_frame:0000000000000738 ; =========================================================================== .eh_frame:0000000000000738 .eh_frame:0000000000000738 ; Segment type: Pure data .eh_frame:0000000000000738 ; Segment permissions: Read .eh_frame:0000000000000738 _eh_frame segment qword public 'CONST' use64 .eh_frame:0000000000000738 assume cs:_eh_frame .eh_frame:0000000000000738 ;org 738h .eh_frame:0000000000000738 db 14h .eh_frame:0000000000000739 db 0 .eh_frame:000000000000073A db 0 .eh_frame:000000000000073B db 0 .eh_frame:000000000000073C db 0 .eh_frame:000000000000073D db 0 .eh_frame:000000000000073E db 0 .eh_frame:000000000000073F db 0 .eh_frame:0000000000000740 db 1 .eh_frame:0000000000000741 db 7Ah ; z .eh_frame:0000000000000742 db 52h ; R .eh_frame:0000000000000743 db 0 .eh_frame:0000000000000744 db 1 .eh_frame:0000000000000745 db 78h ; x .eh_frame:0000000000000746 db 10h .eh_frame:0000000000000747 db 1 .eh_frame:0000000000000748 db 1Bh .eh_frame:0000000000000749 db 0Ch .eh_frame:000000000000074A db 7 .eh_frame:000000000000074B db 8 .eh_frame:000000000000074C db 90h .eh_frame:000000000000074D db 1 .eh_frame:000000000000074E db 0 .eh_frame:000000000000074F db 0 .eh_frame:0000000000000750 db 14h .eh_frame:0000000000000751 db 0 .eh_frame:0000000000000752 db 0 .eh_frame:0000000000000753 db 0 .eh_frame:0000000000000754 db 1Ch .eh_frame:0000000000000755 db 0 .eh_frame:0000000000000756 db 0 .eh_frame:0000000000000757 db 0 .eh_frame:0000000000000758 db 58h ; X .eh_frame:0000000000000759 db 0FEh .eh_frame:000000000000075A db 0FFh .eh_frame:000000000000075B db 0FFh .eh_frame:000000000000075C db 9 .eh_frame:000000000000075D db 0 .eh_frame:000000000000075E db 0 .eh_frame:000000000000075F db 0 .eh_frame:0000000000000760 db 0 .eh_frame:0000000000000761 db 0 .eh_frame:0000000000000762 db 0 .eh_frame:0000000000000763 db 0 .eh_frame:0000000000000764 db 0 .eh_frame:0000000000000765 db 0 .eh_frame:0000000000000766 db 0 .eh_frame:0000000000000767 db 0 .eh_frame:0000000000000768 db 14h .eh_frame:0000000000000769 db 0 .eh_frame:000000000000076A db 0 .eh_frame:000000000000076B db 0 .eh_frame:000000000000076C db 34h ; 4 .eh_frame:000000000000076D db 0 .eh_frame:000000000000076E db 0 .eh_frame:000000000000076F db 0 .eh_frame:0000000000000770 db 30h ; 0 .eh_frame:0000000000000771 db 0FEh .eh_frame:0000000000000772 db 0FFh .eh_frame:0000000000000773 db 0FFh .eh_frame:0000000000000774 db 0Ch .eh_frame:0000000000000775 db 0 .eh_frame:0000000000000776 db 0 .eh_frame:0000000000000777 db 0 .eh_frame:0000000000000778 db 0 .eh_frame:0000000000000779 db 0 .eh_frame:000000000000077A db 0 .eh_frame:000000000000077B db 0 .eh_frame:000000000000077C db 0 .eh_frame:000000000000077D db 0 .eh_frame:000000000000077E db 0 .eh_frame:000000000000077F db 0 .eh_frame:0000000000000780 db 14h .eh_frame:0000000000000781 db 0 .eh_frame:0000000000000782 db 0 .eh_frame:0000000000000783 db 0 .eh_frame:0000000000000784 db 4Ch ; L .eh_frame:0000000000000785 db 0 .eh_frame:0000000000000786 db 0 .eh_frame:0000000000000787 db 0 .eh_frame:0000000000000788 db 38h ; 8 .eh_frame:0000000000000789 db 0FEh .eh_frame:000000000000078A db 0FFh .eh_frame:000000000000078B db 0FFh .eh_frame:000000000000078C db 16h .eh_frame:000000000000078D db 0 .eh_frame:000000000000078E db 0 .eh_frame:000000000000078F db 0 .eh_frame:0000000000000790 db 0 .eh_frame:0000000000000791 db 0 .eh_frame:0000000000000792 db 0 .eh_frame:0000000000000793 db 0 .eh_frame:0000000000000794 db 0 .eh_frame:0000000000000795 db 0 .eh_frame:0000000000000796 db 0 .eh_frame:0000000000000797 db 0 .eh_frame:0000000000000798 db 14h .eh_frame:0000000000000799 db 0 .eh_frame:000000000000079A db 0 .eh_frame:000000000000079B db 0 .eh_frame:000000000000079C db 64h ; d .eh_frame:000000000000079D db 0 .eh_frame:000000000000079E db 0 .eh_frame:000000000000079F db 0 .eh_frame:00000000000007A0 db 50h ; P .eh_frame:00000000000007A1 db 0FEh .eh_frame:00000000000007A2 db 0FFh .eh_frame:00000000000007A3 db 0FFh .eh_frame:00000000000007A4 db 13h .eh_frame:00000000000007A5 db 0 .eh_frame:00000000000007A6 db 0 .eh_frame:00000000000007A7 db 0 .eh_frame:00000000000007A8 db 0 .eh_frame:00000000000007A9 db 0 .eh_frame:00000000000007AA db 0 .eh_frame:00000000000007AB db 0 .eh_frame:00000000000007AC db 0 .eh_frame:00000000000007AD db 0 .eh_frame:00000000000007AE db 0 .eh_frame:00000000000007AF db 0 .eh_frame:00000000000007B0 db 14h .eh_frame:00000000000007B1 db 0 .eh_frame:00000000000007B2 db 0 .eh_frame:00000000000007B3 db 0 .eh_frame:00000000000007B4 db 7Ch ; | .eh_frame:00000000000007B5 db 0 .eh_frame:00000000000007B6 db 0 .eh_frame:00000000000007B7 db 0 .eh_frame:00000000000007B8 db 58h ; X .eh_frame:00000000000007B9 db 0FEh .eh_frame:00000000000007BA db 0FFh .eh_frame:00000000000007BB db 0FFh .eh_frame:00000000000007BC db 13h .eh_frame:00000000000007BD db 0 .eh_frame:00000000000007BE db 0 .eh_frame:00000000000007BF db 0 .eh_frame:00000000000007C0 db 0 .eh_frame:00000000000007C1 db 0 .eh_frame:00000000000007C2 db 0 .eh_frame:00000000000007C3 db 0 .eh_frame:00000000000007C4 db 0 .eh_frame:00000000000007C5 db 0 .eh_frame:00000000000007C6 db 0 .eh_frame:00000000000007C7 db 0 .eh_frame:00000000000007C8 db 1Ch .eh_frame:00000000000007C9 db 0 .eh_frame:00000000000007CA db 0 .eh_frame:00000000000007CB db 0 .eh_frame:00000000000007CC db 94h .eh_frame:00000000000007CD db 0 .eh_frame:00000000000007CE db 0 .eh_frame:00000000000007CF db 0 .eh_frame:00000000000007D0 db 60h ; ` .eh_frame:00000000000007D1 db 0FEh .eh_frame:00000000000007D2 db 0FFh .eh_frame:00000000000007D3 db 0FFh .eh_frame:00000000000007D4 db 7Ch ; | .eh_frame:00000000000007D5 db 0 .eh_frame:00000000000007D6 db 0 .eh_frame:00000000000007D7 db 0 .eh_frame:00000000000007D8 db 0 .eh_frame:00000000000007D9 db 45h ; E .eh_frame:00000000000007DA db 0Eh .eh_frame:00000000000007DB db 20h .eh_frame:00000000000007DC db 2 .eh_frame:00000000000007DD db 71h ; q .eh_frame:00000000000007DE db 0Ah .eh_frame:00000000000007DF db 0Eh .eh_frame:00000000000007E0 db 8 .eh_frame:00000000000007E1 db 41h ; A .eh_frame:00000000000007E2 db 0Bh .eh_frame:00000000000007E3 db 0 .eh_frame:00000000000007E4 db 0 .eh_frame:00000000000007E5 db 0 .eh_frame:00000000000007E6 db 0 .eh_frame:00000000000007E7 db 0 .eh_frame:00000000000007E8 db 24h ; $ .eh_frame:00000000000007E9 db 0 .eh_frame:00000000000007EA db 0 .eh_frame:00000000000007EB db 0 .eh_frame:00000000000007EC db 0B4h .eh_frame:00000000000007ED db 0 .eh_frame:00000000000007EE db 0 .eh_frame:00000000000007EF db 0 .eh_frame:00000000000007F0 db 70h ; p .eh_frame:00000000000007F1 db 0FDh .eh_frame:00000000000007F2 db 0FFh .eh_frame:00000000000007F3 db 0FFh .eh_frame:00000000000007F4 db 40h ; @ .eh_frame:00000000000007F5 db 0 .eh_frame:00000000000007F6 db 0 .eh_frame:00000000000007F7 db 0 .eh_frame:00000000000007F8 db 0 .eh_frame:00000000000007F9 db 0Eh .eh_frame:00000000000007FA db 10h .eh_frame:00000000000007FB db 46h ; F .eh_frame:00000000000007FC db 0Eh .eh_frame:00000000000007FD db 18h .eh_frame:00000000000007FE db 4Ah ; J .eh_frame:00000000000007FF db 0Fh .eh_frame:0000000000000800 db 0Bh .eh_frame:0000000000000801 db 77h ; w .eh_frame:0000000000000802 db 8 .eh_frame:0000000000000803 db 80h ; € .eh_frame:0000000000000804 db 0 .eh_frame:0000000000000805 db 3Fh ; ? .eh_frame:0000000000000806 db 1Ah .eh_frame:0000000000000807 db 3Bh ; ; .eh_frame:0000000000000808 db 2Ah ; * .eh_frame:0000000000000809 db 33h ; 3 .eh_frame:000000000000080A db 24h ; $ .eh_frame:000000000000080B db 22h ; " .eh_frame:000000000000080C db 0 .eh_frame:000000000000080D db 0 .eh_frame:000000000000080E db 0 .eh_frame:000000000000080F db 0 .eh_frame:0000000000000810 db 0 .eh_frame:0000000000000811 db 0 .eh_frame:0000000000000812 db 0 .eh_frame:0000000000000813 db 0 .eh_frame:0000000000000813 _eh_frame ends .eh_frame:0000000000000813 .eh_frame_hdr:0000000000000814 ; =========================================================================== .eh_frame_hdr:0000000000000814 .eh_frame_hdr:0000000000000814 ; Segment type: Pure data .eh_frame_hdr:0000000000000814 ; Segment permissions: Read .eh_frame_hdr:0000000000000814 _eh_frame_hdr segment dword public 'CONST' use64 .eh_frame_hdr:0000000000000814 assume cs:_eh_frame_hdr .eh_frame_hdr:0000000000000814 ;org 814h .eh_frame_hdr:0000000000000814 unk_814 db 1 ; DATA XREF: LOAD:0000000000000168↑o .eh_frame_hdr:0000000000000815 db 1Bh .eh_frame_hdr:0000000000000816 db 3 .eh_frame_hdr:0000000000000817 db 3Bh ; ; .eh_frame_hdr:0000000000000818 db 20h .eh_frame_hdr:0000000000000819 db 0FFh .eh_frame_hdr:000000000000081A db 0FFh .eh_frame_hdr:000000000000081B db 0FFh .eh_frame_hdr:000000000000081C db 7 .eh_frame_hdr:000000000000081D db 0 .eh_frame_hdr:000000000000081E db 0 .eh_frame_hdr:000000000000081F db 0 .eh_frame_hdr:0000000000000820 db 4Ch ; L .eh_frame_hdr:0000000000000821 db 0FDh .eh_frame_hdr:0000000000000822 db 0FFh .eh_frame_hdr:0000000000000823 db 0FFh .eh_frame_hdr:0000000000000824 db 0D4h .eh_frame_hdr:0000000000000825 db 0FFh .eh_frame_hdr:0000000000000826 db 0FFh .eh_frame_hdr:0000000000000827 db 0FFh .eh_frame_hdr:0000000000000828 db 8Ch .eh_frame_hdr:0000000000000829 db 0FDh .eh_frame_hdr:000000000000082A db 0FFh .eh_frame_hdr:000000000000082B db 0FFh .eh_frame_hdr:000000000000082C db 54h ; T .eh_frame_hdr:000000000000082D db 0FFh .eh_frame_hdr:000000000000082E db 0FFh .eh_frame_hdr:000000000000082F db 0FFh .eh_frame_hdr:0000000000000830 db 9Ch .eh_frame_hdr:0000000000000831 db 0FDh .eh_frame_hdr:0000000000000832 db 0FFh .eh_frame_hdr:0000000000000833 db 0FFh .eh_frame_hdr:0000000000000834 db 3Ch ; < .eh_frame_hdr:0000000000000835 db 0FFh .eh_frame_hdr:0000000000000836 db 0FFh .eh_frame_hdr:0000000000000837 db 0FFh .eh_frame_hdr:0000000000000838 db 0ACh .eh_frame_hdr:0000000000000839 db 0FDh .eh_frame_hdr:000000000000083A db 0FFh .eh_frame_hdr:000000000000083B db 0FFh .eh_frame_hdr:000000000000083C db 6Ch ; l .eh_frame_hdr:000000000000083D db 0FFh .eh_frame_hdr:000000000000083E db 0FFh .eh_frame_hdr:000000000000083F db 0FFh .eh_frame_hdr:0000000000000840 db 0DCh .eh_frame_hdr:0000000000000841 db 0FDh .eh_frame_hdr:0000000000000842 db 0FFh .eh_frame_hdr:0000000000000843 db 0FFh .eh_frame_hdr:0000000000000844 db 84h .eh_frame_hdr:0000000000000845 db 0FFh .eh_frame_hdr:0000000000000846 db 0FFh .eh_frame_hdr:0000000000000847 db 0FFh .eh_frame_hdr:0000000000000848 db 0FCh .eh_frame_hdr:0000000000000849 db 0FDh .eh_frame_hdr:000000000000084A db 0FFh .eh_frame_hdr:000000000000084B db 0FFh .eh_frame_hdr:000000000000084C db 9Ch .eh_frame_hdr:000000000000084D db 0FFh .eh_frame_hdr:000000000000084E db 0FFh .eh_frame_hdr:000000000000084F db 0FFh .eh_frame_hdr:0000000000000850 db 1Ch .eh_frame_hdr:0000000000000851 db 0FEh .eh_frame_hdr:0000000000000852 db 0FFh .eh_frame_hdr:0000000000000853 db 0FFh .eh_frame_hdr:0000000000000854 db 0B4h .eh_frame_hdr:0000000000000855 db 0FFh .eh_frame_hdr:0000000000000856 db 0FFh .eh_frame_hdr:0000000000000857 db 0FFh .eh_frame_hdr:0000000000000857 _eh_frame_hdr ends .eh_frame_hdr:0000000000000857 .fini_array:0000000000001D60 ; ELF Termination Function Table .fini_array:0000000000001D60 ; =========================================================================== .fini_array:0000000000001D60 .fini_array:0000000000001D60 ; Segment type: Pure data .fini_array:0000000000001D60 ; Segment permissions: Read/Write .fini_array:0000000000001D60 _fini_array segment qword public 'DATA' use64 .fini_array:0000000000001D60 assume cs:_fini_array .fini_array:0000000000001D60 ;org 1D60h .fini_array:0000000000001D60 off_1D60 dq offset sub_5A0 ; DATA XREF: LOAD:00000000000000C0↑o .fini_array:0000000000001D60 ; LOAD:00000000000001D8↑o .fini_array:0000000000001D68 align 10h .fini_array:0000000000001D68 _fini_array ends .fini_array:0000000000001D68 .init_array:0000000000001D70 ; =========================================================================== .init_array:0000000000001D70 .init_array:0000000000001D70 ; Segment type: Pure data .init_array:0000000000001D70 ; Segment permissions: Read/Write .init_array:0000000000001D70 _init_array segment qword public 'DATA' use64 .init_array:0000000000001D70 assume cs:_init_array .init_array:0000000000001D70 ;org 1D70h .init_array:0000000000001D70 db 0 .init_array:0000000000001D71 db 0 .init_array:0000000000001D72 db 0 .init_array:0000000000001D73 db 0 .init_array:0000000000001D74 db 0 .init_array:0000000000001D75 db 0 .init_array:0000000000001D76 db 0 .init_array:0000000000001D77 db 0 .init_array:0000000000001D77 _init_array ends .init_array:0000000000001D77 LOAD:0000000000001D78 ; ELF Dynamic Information LOAD:0000000000001D78 ; =========================================================================== LOAD:0000000000001D78 LOAD:0000000000001D78 ; Segment type: Pure data LOAD:0000000000001D78 ; Segment permissions: Read/Write LOAD:0000000000001D78 LOAD segment mempage public 'DATA' use64 LOAD:0000000000001D78 assume cs:LOAD LOAD:0000000000001D78 ;org 1D78h LOAD:0000000000001D78 stru_1D78 Elf64_Dyn <3, 1FD0h> ; DATA XREF: LOAD:00000000000000F8↑o LOAD:0000000000001D78 ; .got.plt:0000000000001FD0↓o LOAD:0000000000001D78 ; DT_PLTGOT LOAD:0000000000001D88 Elf64_Dyn <2, 48h> ; DT_PLTRELSZ LOAD:0000000000001D98 Elf64_Dyn <17h, 518h> ; DT_JMPREL LOAD:0000000000001DA8 Elf64_Dyn <14h, 7> ; DT_PLTREL LOAD:0000000000001DB8 Elf64_Dyn <7, 488h> ; DT_RELA LOAD:0000000000001DC8 Elf64_Dyn <8, 90h> ; DT_RELASZ LOAD:0000000000001DD8 Elf64_Dyn <9, 18h> ; DT_RELAENT LOAD:0000000000001DE8 Elf64_Dyn <6FFFFFF9h, 6> ; DT_RELACOUNT LOAD:0000000000001DF8 Elf64_Dyn <6, 228h> ; DT_SYMTAB LOAD:0000000000001E08 Elf64_Dyn <0Bh, 18h> ; DT_SYMENT LOAD:0000000000001E18 Elf64_Dyn <5, 318h> ; DT_STRTAB LOAD:0000000000001E28 Elf64_Dyn <0Ah, 0DDh> ; DT_STRSZ LOAD:0000000000001E38 Elf64_Dyn <4, 3F8h> ; DT_HASH LOAD:0000000000001E48 Elf64_Dyn <1, 0B5h> ; DT_NEEDED liblog.so LOAD:0000000000001E58 Elf64_Dyn <1, 0BFh> ; DT_NEEDED libstdc++.so LOAD:0000000000001E68 Elf64_Dyn <1, 0CCh> ; DT_NEEDED libm.so LOAD:0000000000001E78 Elf64_Dyn <1, 15h> ; DT_NEEDED libc.so LOAD:0000000000001E88 Elf64_Dyn <1, 0D4h> ; DT_NEEDED libdl.so LOAD:0000000000001E98 Elf64_Dyn <0Eh, 1Dh> ; DT_SONAME libhello_jni.so LOAD:0000000000001EA8 Elf64_Dyn <1Ah, 1D60h> ; DT_FINI_ARRAY LOAD:0000000000001EB8 Elf64_Dyn <1Ch, 10h> ; DT_FINI_ARRAYSZ LOAD:0000000000001EC8 Elf64_Dyn <19h, 1D70h> ; DT_INIT_ARRAY LOAD:0000000000001ED8 Elf64_Dyn <1Bh, 8> ; DT_INIT_ARRAYSZ LOAD:0000000000001EE8 Elf64_Dyn <10h, 0> ; DT_SYMBOLIC LOAD:0000000000001EF8 Elf64_Dyn <1Eh, 0Ah> ; DT_FLAGS LOAD:0000000000001F08 Elf64_Dyn <6FFFFFFBh, 1> ; DT_FLAGS_1 LOAD:0000000000001F18 Elf64_Dyn <6FFFFFF0h, 434h> ; DT_VERSYM LOAD:0000000000001F28 Elf64_Dyn <6FFFFFFCh, 448h> ; DT_VERDEF LOAD:0000000000001F38 Elf64_Dyn <6FFFFFFDh, 1> ; DT_VERDEFNUM LOAD:0000000000001F48 Elf64_Dyn <6FFFFFFEh, 464h> ; DT_VERNEED LOAD:0000000000001F58 Elf64_Dyn <6FFFFFFFh, 1> ; DT_VERNEEDNUM LOAD:0000000000001F68 Elf64_Dyn <0> ; DT_NULL LOAD:0000000000001F78 db 0 LOAD:0000000000001F79 db 0 LOAD:0000000000001F7A db 0 LOAD:0000000000001F7B db 0 LOAD:0000000000001F7C db 0 LOAD:0000000000001F7D db 0 LOAD:0000000000001F7E db 0 LOAD:0000000000001F7F db 0 LOAD:0000000000001F80 db 0 LOAD:0000000000001F81 db 0 LOAD:0000000000001F82 db 0 LOAD:0000000000001F83 db 0 LOAD:0000000000001F84 db 0 LOAD:0000000000001F85 db 0 LOAD:0000000000001F86 db 0 LOAD:0000000000001F87 db 0 LOAD:0000000000001F88 db 0 LOAD:0000000000001F89 db 0 LOAD:0000000000001F8A db 0 LOAD:0000000000001F8B db 0 LOAD:0000000000001F8C db 0 LOAD:0000000000001F8D db 0 LOAD:0000000000001F8E db 0 LOAD:0000000000001F8F db 0 LOAD:0000000000001F90 db 0 LOAD:0000000000001F91 db 0 LOAD:0000000000001F92 db 0 LOAD:0000000000001F93 db 0 LOAD:0000000000001F94 db 0 LOAD:0000000000001F95 db 0 LOAD:0000000000001F96 db 0 LOAD:0000000000001F97 db 0 LOAD:0000000000001F98 db 0 LOAD:0000000000001F99 db 0 LOAD:0000000000001F9A db 0 LOAD:0000000000001F9B db 0 LOAD:0000000000001F9C db 0 LOAD:0000000000001F9D db 0 LOAD:0000000000001F9E db 0 LOAD:0000000000001F9F db 0 LOAD:0000000000001FA0 db 0 LOAD:0000000000001FA1 db 0 LOAD:0000000000001FA2 db 0 LOAD:0000000000001FA3 db 0 LOAD:0000000000001FA4 db 0 LOAD:0000000000001FA5 db 0 LOAD:0000000000001FA6 db 0 LOAD:0000000000001FA7 db 0 LOAD:0000000000001FA8 db 0 LOAD:0000000000001FA9 db 0 LOAD:0000000000001FAA db 0 LOAD:0000000000001FAB db 0 LOAD:0000000000001FAC db 0 LOAD:0000000000001FAD db 0 LOAD:0000000000001FAE db 0 LOAD:0000000000001FAF db 0 LOAD:0000000000001FB0 db 0 LOAD:0000000000001FB1 db 0 LOAD:0000000000001FB2 db 0 LOAD:0000000000001FB3 db 0 LOAD:0000000000001FB4 db 0 LOAD:0000000000001FB5 db 0 LOAD:0000000000001FB6 db 0 LOAD:0000000000001FB7 db 0 LOAD:0000000000001FB8 db 0 LOAD:0000000000001FB9 db 0 LOAD:0000000000001FBA db 0 LOAD:0000000000001FBB db 0 LOAD:0000000000001FBC db 0 LOAD:0000000000001FBD db 0 LOAD:0000000000001FBE db 0 LOAD:0000000000001FBF db 0 LOAD:0000000000001FC0 db 0 LOAD:0000000000001FC1 db 0 LOAD:0000000000001FC2 db 0 LOAD:0000000000001FC3 db 0 LOAD:0000000000001FC4 db 0 LOAD:0000000000001FC5 db 0 LOAD:0000000000001FC6 db 0 LOAD:0000000000001FC7 db 0 LOAD:0000000000001FC7 LOAD ends LOAD:0000000000001FC7 .got:0000000000001FC8 ; =========================================================================== .got:0000000000001FC8 .got:0000000000001FC8 ; Segment type: Pure data .got:0000000000001FC8 ; Segment permissions: Read/Write .got:0000000000001FC8 _got segment qword public 'DATA' use64 .got:0000000000001FC8 assume cs:_got .got:0000000000001FC8 ;org 1FC8h .got:0000000000001FC8 nativeMethod_ptr dq offset nativeMethod ; DATA XREF: JNI_OnLoad+46↑r .got:0000000000001FC8 _got ends .got:0000000000001FC8 .got.plt:0000000000001FD0 ; =========================================================================== .got.plt:0000000000001FD0 .got.plt:0000000000001FD0 ; Segment type: Pure data .got.plt:0000000000001FD0 ; Segment permissions: Read/Write .got.plt:0000000000001FD0 _got_plt segment qword public 'DATA' use64 .got.plt:0000000000001FD0 assume cs:_got_plt .got.plt:0000000000001FD0 ;org 1FD0h .got.plt:0000000000001FD0 dq offset stru_1D78 .got.plt:0000000000001FD8 qword_1FD8 dq 0 ; DATA XREF: sub_560↑r .got.plt:0000000000001FE0 qword_1FE0 dq 0 ; DATA XREF: sub_560+6↑r .got.plt:0000000000001FE8 off_1FE8 dq offset __cxa_atexit ; DATA XREF: ___cxa_atexit↑r .got.plt:0000000000001FF0 off_1FF0 dq offset __cxa_finalize .got.plt:0000000000001FF0 ; DATA XREF: ___cxa_finalize↑r .got.plt:0000000000001FF8 off_1FF8 dq offset __stack_chk_fail .got.plt:0000000000001FF8 ; DATA XREF: ___stack_chk_fail↑r .got.plt:0000000000001FF8 _got_plt ends .got.plt:0000000000001FF8 .data:0000000000002000 ; =========================================================================== .data:0000000000002000 .data:0000000000002000 ; Segment type: Pure data .data:0000000000002000 ; Segment permissions: Read/Write .data:0000000000002000 _data segment para public 'DATA' use64 .data:0000000000002000 assume cs:_data .data:0000000000002000 ;org 2000h .data:0000000000002000 off_2000 dq offset off_2000 ; DATA XREF: sub_5A0↑o .data:0000000000002000 ; .text:00000000000005C3↑o ... .data:0000000000002008 align 10h .data:0000000000002010 public nativeMethod .data:0000000000002010 nativeMethod dq offset aDynamicregfrom .data:0000000000002010 ; DATA XREF: LOAD:00000000000002A0↑o .data:0000000000002010 ; .got:nativeMethod_ptr↑o .data:0000000000002010 ; "dynamicRegFromJni" .data:0000000000002018 dq offset aLjavaLangStrin ; "()Ljava/lang/String;" .data:0000000000002020 dq offset loc_5F0 .data:0000000000002020 _data ends .data:0000000000002020 .bss:0000000000002028 ; =========================================================================== .bss:0000000000002028 .bss:0000000000002028 ; Segment type: Zero-length .bss:0000000000002028 ; Segment permissions: Read/Write .bss:0000000000002028 _bss segment byte public 'BSS' use64 .bss:0000000000002028 unk_2028 label byte ; DATA XREF: LOAD:00000000000002D0↑o .bss:0000000000002028 ; LOAD:00000000000002E8↑o ... .bss:0000000000002028 _bss ends .bss:0000000000002028 extern:0000000000002030 ; =========================================================================== extern:0000000000002030 extern:0000000000002030 ; Segment type: Externs extern:0000000000002030 ; extern extern:0000000000002030 ; int __fastcall _cxa_finalize(void *) extern:0000000000002030 extrn __cxa_finalize:near extern:0000000000002030 ; CODE XREF: ___cxa_finalize↑j extern:0000000000002030 ; DATA XREF: .got.plt:off_1FF0↑o extern:0000000000002038 ; int __fastcall _cxa_atexit(void (__fastcall *lpfunc)(void *), void *obj, void *lpdso_handle) extern:0000000000002038 extrn __cxa_atexit:near ; CODE XREF: ___cxa_atexit↑j extern:0000000000002038 ; DATA XREF: .got.plt:off_1FE8↑o extern:0000000000002040 extrn __stack_chk_fail:near extern:0000000000002040 ; CODE XREF: ___stack_chk_fail↑j extern:0000000000002040 ; DATA XREF: .got.plt:off_1FF8↑o extern:0000000000002040 abs:0000000000002048 ; =========================================================================== abs:0000000000002048 abs:0000000000002048 ; Segment type: Absolute symbols abs:0000000000002048 ; abs abs:0000000000002048 public _edata abs:0000000000002048 _edata = 2028h abs:0000000000002050 public __bss_start abs:0000000000002050 __bss_start = 2028h abs:0000000000002058 public _end abs:0000000000002058 _end = 2028h abs:0000000000002058 abs:0000000000002058 abs:0000000000002058 end 函数名称 sub_5600x560 push cs:qword_1FD8 0x566 jmp cs:qword_1FE0 // "code-keyword">extern "code-keyword">void* qword_1FD8; // "code-keyword">extern "code-keyword">void (*qword_1FE0)(); /* 作用:一个跳转函数(trampoline),可能是为了实现延迟绑定(PLT)或某种初始化/反初始化调用。它将一个指针(qword_1FD8)压入栈中作为参数,然后无条件跳转到另一个地址(qword_1FE0)执行。 来源:编译器/链接器生成 依赖:无 变量和参数重命名: - qword_1FD8 -> pArgument_or_Handle - qword_1FE0 -> pTargetFunction 控制流结构:无条件跳转 (jmp),可以视为尾调用 (tail call)。 算法识别:无标准算法 加固识别:无明显加固特征。这种间接跳转是动态链接的标准实现。 */ "code-keyword">void trampoline_sub_560() { // 这是一个汇编级别的跳转,无法直接用标准C++表示。 // push cs:qword_1FD8 // jmp cs:qword_1FE0 // 伪代码如下: // target_function(argument); // 由于这是一个尾调用,控制权不会返回到这里。 JUMPOUT(pTargetFunction); // 跳转到目标函数执行,pArgument_or_Handle 已经被压栈作为参数。 } 函数名称 .__cxa_atexit .__cxa_atexit 函数地址 0x570 0x570 函数大小 6 bytes 反汇编代码 0x570 jmp cs:off_1FE8 // "code-keyword">extern "code-keyword">int (*off_1FE8)("code-keyword">void (*func)("code-keyword">void *), "code-keyword">void *arg, "code-keyword">void *dso_handle); /* 作用:一个PLT(Procedure Linkage Table)存根函数,用于将调用重定向到动态链接库(如libc.so)中的 `__cxa_atexit` 真实实现。`__cxa_atexit` 用于注册一个在程序退出时需要被调用的函数(例如,用于销毁静态或全局对象)。 来源:编译器/链接器生成 (PLT stub) 依赖:C++ ABI / C 标准库 变量和参数重命名: - off_1FE8 -> __cxa_atexit_ptr 控制流结构:无条件跳转 (jmp),属于尾调用。 算法识别:无标准算法 加固识别:无。这是标准的动态链接机制。 */ "code-keyword">int thunk_cxa_atexit("code-keyword">void (*func)("code-keyword">void *), "code-keyword">void *arg, "code-keyword">void *dso_handle) { "code-keyword">return __cxa_atexit_ptr(func, arg, dso_handle); // 跳转到 __cxa_atexit 的实际地址执行 } 函数名称 .__cxa_finalize .__cxa_finalize 函数地址 0x580 0x580 函数大小 6 bytes 反汇编代码 0x580 jmp cs:off_1FF0 // "code-keyword">extern "code-keyword">int (*off_1FF0)("code-keyword">void *dso_handle); /* 作用:一个PLT(Procedure Linkage Table)存根函数,用于将调用重定向到动态链接库中的 `__cxa_finalize` 真实实现。`__cxa_finalize` 用于执行由 `__cxa_atexit` 注册的清理函数。 来源:编译器/链接器生成 (PLT stub) 依赖:C++ ABI / C 标准库 变量和参数重命名: - off_1FF0 -> __cxa_finalize_ptr 控制流结构:无条件跳转 (jmp),属于尾调用。 算法识别:无标准算法 加固识别:无。这是标准的动态链接机制。 */ "code-keyword">int thunk_cxa_finalize("code-keyword">void *dso_handle) { "code-keyword">return __cxa_finalize_ptr(dso_handle); // 跳转到 __cxa_finalize 的实际地址执行 } 函数名称 .__stack_chk_fail .__stack_chk_fail 函数地址 0x590 0x590 函数大小 6 bytes 反汇编代码 0x590 jmp cs:off_1FF8 // "code-keyword">extern "code-keyword">void (*off_1FF8)("code-keyword">void); /* 作用:一个PLT(Procedure Linkage Table)存根函数,用于将调用重定向到动态链接库中的 `__stack_chk_fail` 真实实现。该函数在检测到栈缓冲区溢出(即stack canary被破坏)时被调用,并会立即终止程序以防止进一步的攻击。 来源:编译器/链接器生成 (PLT stub) 依赖:C 标准库 / 编译器运行时 变量和参数重命名: - off_1FF8 -> __stack_chk_fail_ptr 控制流结构:无条件跳转 (jmp),属于尾调用。 算法识别:无标准算法 加固识别:该函数本身是栈保护(Stack Canary / Stack Smashing Protector)加固措施的一部分。 */ "code-keyword">void __attribute__((noreturn)) thunk_stack_chk_fail() { __stack_chk_fail_ptr(); // 跳转到 __stack_chk_fail 的实际地址执行,该函数不会返回。 } 函数名称 sub_5A0 sub_5A0 函数地址 0x5a0 0x5a0 函数大小 12 bytes 反汇编代码 0x5a0 lea rdi, off_2000; void * 0x5a7 jmp ___cxa_finalize // "code-keyword">extern "code-keyword">void* off_2000; // "code-keyword">int __cxa_finalize("code-keyword">void *dso_handle); /* 作用:注册一个模块的终结器(finalizer)。它将一个句柄(通常是当前动态共享对象DSO的句柄 `__dso_handle`,此处位于 off_2000)传递给 `__cxa_finalize` 函数。这通常由编译器自动生成,用于在程序退出时清理全局或静态资源。 来源:编译器生成 依赖:C++ ABI / C 标准库 变量和参数重命名: - off_2000 -> __dso_handle 控制流结构:尾调用 (Tail Call) 算法识别:无标准算法 加固识别:无明显加固特征。 */ "code-keyword">int register_module_finalizer_sub_5A0() { "code-keyword">return __cxa_finalize(&__dso_handle); // 调用 __cxa_finalize 并传入模块句柄的地址 } 函数名称 Java_github_jp1017_hellojni_MainActivity_staticRegFromJni Java_github_jp1017_hellojni_MainActivity_staticRegFromJni 函数地址 0x610 0x610 函数大小 19 bytes 反汇编代码 0x610 mov rax, [rdi] 0x613 lea rsi, unk_6C9 0x61a mov rax, [rax+538h] 0x621 jmp rax #include // "code-keyword">extern "code-keyword">const "code-keyword">char unk_6C9[]; /* 作用:这是一个JNI(Java Native Interface)本地方法。当Java代码调用 `github.jp1017.hellojni.MainActivity.staticRegFromJni()` 方法时,此函数会被执行。它的功能是从一个本地C字符串(位于 unk_6C9)创建一个Java字符串对象(jstring)并返回给Java层。 来源:用户自定义 (JNI 实现) 依赖:Android NDK(jni.h) 变量和参数重命名: - a1 -> env - unk_6C9 -> native_string_content 控制流结构:无复杂控制流,直接通过函数指针表调用JNI函数。 算法识别:无标准算法 加固识别:存在变量名称混淆(如 `unk_6C9`)。 */ jstring Java_github_jp1017_hellojni_MainActivity_staticRegFromJni(JNIEnv *env, jobject thiz) { // JNIEnv是一个指向函数指针表的指针。 // (*env) 获取函数指针表。 // (*env)->NewStringUTF 是函数指针表中的一个成员。 // 汇编 `mov rax, [rax+538h]` 表示在 JNIEnv 函数指针表中偏移 0x538 (1336) 字节处找到 NewStringUTF 函数的地址。 "code-keyword">return (*env)->NewStringUTF(env, native_string_content); // 调用NewStringUTF函数,将C字符串转换为Java字符串并返回 } 函数名称 JNI_OnLoad JNI_OnLoad 函数地址 0x630 0x630 函数大小 124 bytes 反汇编代码 0x630 lea rsp, [rsp-18h] 0x635 mov edx, 10004h 0x63a mov rax, fs:28h 0x643 mov [rsp+18h+var_10], rax 0x648 xor eax, eax 0x64a mov rax, [rdi] 0x64d mov rsi, rsp 0x650 call qword ptr [rax+30h] 0x653 mov edx, 0FFFFFFFFh 0x658 test eax, eax 0x65a jnz short loc_68F 0x65c mov rdi, [rsp+18h+var_18] 0x660 lea rsi, aGithubJp1017He; "github/jp1017/hellojni/MainActivity" 0x667 mov rax, [rdi] 0x66a call qword ptr [rax+30h] 0x66d mov rdi, [rsp+18h+var_18] 0x671 mov ecx, 1 0x676 mov rdx, cs:nativeMethod_ptr 0x67d mov rsi, rax 0x680 mov r8, [rdi] 0x683 call qword ptr [r8+6B8h] 0x68a mov edx, 10004h 0x68f mov rcx, [rsp+18h+var_10] 0x694 xor rcx, fs:28h 0x69d mov eax, edx 0x69f jnz short loc_6A7 0x6a1 lea rsp, [rsp+18h] 0x6a6 retn retn 0x6a7 call ___stack_chk_fail #include // "code-keyword">extern JNINativeMethod nativeMethod_ptr[]; /* 作用:当包含此本地代码的库被JVM加载时,此函数被自动调用。它负责库的初始化,主要完成以下工作: 1. 从JavaVM获取JNIEnv指针。 2. 查找名为 "github/jp1017/hellojni/MainActivity" 的Java类。 3. 使用 `RegisterNatives` 函数为该类动态注册一个或多个本地方法。 4. 返回所支持的JNI版本号。 来源:用户自定义 (JNI 库入口点) 依赖:Android NDK(jni.h) 变量和参数重命名: - a1 -> vm(JavaVM*) - v5 -> env(JNIEnv*) - v3 -> main_activity_class(jclass) - nativeMethod_ptr -> g_native_methods 控制流结构:使用"code-keyword">if条件分支检查函数调用是否成功。 算法识别:无标准算法 加固识别:包含栈保护(Stack Canary)机制,在函数进入时设置并在退出时检查,以防止栈溢出攻击。 */ jint JNI_OnLoad(JavaVM *vm, "code-keyword">void *reserved) { JNIEnv *env = "code-keyword">NULL; // 用于存储JNI环境的指针 jint result = -1; // 默认返回失败 // 从JavaVM获取当前线程的JNIEnv接口指针,请求JNI 1.4版本 "code-keyword">if ((*vm)->GetEnv(vm, ("code-keyword">void**)&env, JNI_VERSION_1_4) != JNI_OK) { "code-keyword">return result; // 获取失败,返回-1 } // 查找需要注册本地方法的Java类 jclass main_activity_class = (*env)->FindClass(env, "github/jp1017/hellojni/MainActivity"); "code-keyword">if (main_activity_class == "code-keyword">NULL) { "code-keyword">return result; // 查找失败,返回-1 } // 动态注册本地方法 // 第一个参数是JNI环境指针 // 第二个参数是目标Java类 // 第三个参数是一个JNINativeMethod结构体数组,定义了Java方法与C/C++函数的映射关系 // 第四个参数是要注册的方法数量 "code-keyword">if ((*env)->RegisterNatives(env, main_activity_class, g_native_methods, 1) < 0) { "code-keyword">return result; // 注册失败,返回-1 } "code-keyword">return JNI_VERSION_1_4; // 初始化成功,返回JNI版本号 } 函数名称 __cxa_finalize __cxa_finalize 函数地址 0x2030 0x2030 函数大小 8 bytes 反汇编代码 0x2030 extrn __cxa_finalize:near /* 作用:声明一个外部函数 `__cxa_finalize`。这表示该函数在本模块中未定义,其实现由链接器在链接时从其他库(通常是libc++或C++运行时库)中解析。此函数用于执行通过 `__cxa_atexit` 注册的析构函数或清理函数。 来源:系统库 (libc++ / C++ ABI) 依赖:C++ ABI / C 标准库 变量和参数重命名:无 控制流结构:无 算法识别:无标准算法 加固识别:无 */ // 函数原型声明 "code-keyword">int __cxa_finalize("code-keyword">void *dso_handle); 函数名称 __cxa_atexit __cxa_atexit 函数地址 0x2038 0x2038 函数大小 8 bytes 反汇编代码 0x2038 extrn __cxa_atexit:near /* 作用:声明一个外部函数 `__cxa_atexit`。这表示该函数在本模块中未定义,其实现由链接器在链接时从其他库(通常是libc++或C++运行时库)中解析。此函数用于注册在程序退出时要调用的函数,通常用于销毁全局或静态对象。 来源:系统库 (libc++ / C++ ABI) 依赖:C++ ABI / C 标准库 变量和参数重命名:无 控制流结构:无 算法识别:无标准算法 加固识别:无 */ // 函数原型声明 "code-keyword">int __cxa_atexit("code-keyword">void (*func)("code-keyword">void *), "code-keyword">void *arg, "code-keyword">void *dso_handle); 函数名称 __stack_chk_fail __stack_chk_fail 函数地址 0x2040 0x2040 函数大小 8 bytes 反汇编代码 0x2040 extrn __stack_chk_fail:near /* 作用:声明一个外部函数 `__stack_chk_fail`。这表示该函数在本模块中未定义,其实现由链接器在链接时从其他库(通常是libc或编译器运行时库)中解析。当编译器启用的栈保护机制(Stack Canary)检测到栈被破坏时,会调用此函数来终止程序。 来源:系统库 (libc / 编译器运行时) 依赖:C 标准库 / 编译器运行时 变量和参数重命名:无 控制流结构:无 算法识别:无标准算法 加固识别:该函数本身是栈保护加固措施的核心部分。 */ // 函数原型声明,__attribute__((noreturn)) 表示该函数不会返回 "code-keyword">void __attribute__((noreturn)) __stack_chk_fail("code-keyword">void);