so层Java层绑定函数_动态注册


一、使用ida静态分析

  1.打开IDA点击Go:

打开IEA软件


  2.拖入so文件到IDA内点击确定:

拖入so文件到ida内


  3.找到左侧的JNI_Onload函数双击:

找到左侧的JNI_Onload函数双击


  4.双击后出现的流程图敲一下空格:

出现流程图敲一下空格切换代码模式


  5.最终来到了我们的函数分析位置:

开始分析arm汇编代码


  6.分析后的代码已经打上了注释:

arm代码分析打注释


  7.分析后的代码在下面:

.text:00000DA0 ; =============== S U B R O U T I N E =======================================
.text:00000DA0
.text:00000DA0 ; JNI_Onload函数入口点
.text:00000DA0
.text:00000DA0                 EXPORT JNI_OnLoad
.text:00000DA0 JNI_OnLoad                              ; DATA XREF: LOAD:000001E8↑o
.text:00000DA0
.text:00000DA0 var_C           = -0xC
.text:00000DA0 var_4           = -4
.text:00000DA0
.text:00000DA0 ; __unwind {
.text:00000DA0                 LDR             R3, [R0]
.text:00000DA4                 MOV             R2, #4  ; 将立即数4赋值给R2寄存器
.text:00000DA8                 STR             LR, [SP,#var_4]! ; 将LR寄存器的指针地址 写入到SP寄存器+#var_4的地址的内容内
.text:00000DAC                 SUB             SP, SP, #0xC ; sp寄存器 的指针等于SP寄存器指针减#0xc
.text:00000DB0                 ADD             R1, SP, R2 ; R1寄存器 等于SP寄存器指针+R2寄存指针
.text:00000DB4                 LDR             R3, [R3,#0x18] ; R3寄存器等于 R3+#0x18指针内的值内容
.text:00000DB8                 MOVT            R2, #1  ; R2寄存器赋值#1立即数
.text:00000DBC                 BLX             R3      ; 此时R3 应该是一个函数的入口地址, BLX 跳转到R3指向的函数地址后,返回
.text:00000DC0                 CMP             R0, #0  ; 将R0 寄存器内容与立即数#0做比较
.text:00000DC4                 BNE             loc_DE8 ; 如果上面的CMP结果为不相等就跳转到loc_DE8处,否则就向下执行
.text:00000DC8                 LDR             R0, [SP,#0x10+var_C] ; 将SP寄存器与#0x10+car_C相加后的值取出来给R0
.text:00000DCC                 BL              registerNative ; 跳转到registerNative函数出开始执行,然后继续向下执行
.text:00000DD0                 CMP             R0, #0  ; 将R0寄存器的内容与立即数#0做比较
.text:00000DD4                 BNE             loc_DE8 ; 重复上面的动作,如果R0的内容不等于0就跳转到loc_DE8函数处
.text:00000DD8                 MOV             R0, #0x10004 ; 将#0x10004立即数赋值给R0寄存器
.text:00000DE0                 ADD             SP, SP, #0xC ; SP寄存器 等于SP寄存器加上#0xc立即数
.text:00000DE4                 LDR             PC, [SP+4+var_4],#4 ; SP寄存器+4+var_4的字数据写入PC寄存器相当于跳转到这个指针处,并将新地址[SP寄存器+4+var_4+4]写入到[SP寄存器+4+var_4]
.text:00000DE8 ; ---------------------------------------------------------------------------

在浏览的同时希望给予作者打赏,来支持作者的服务器维护费用.一分也是爱~