so层Java层绑定函数_动态注册
一、使用ida静态分析
1.打开IDA点击Go:
2.拖入so文件到IDA内点击确定:
3.找到左侧的JNI_Onload函数双击:
4.双击后出现的流程图敲一下空格:
5.最终来到了我们的函数分析位置:
6.分析后的代码已经打上了注释:
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 ; ---------------------------------------------------------------------------
在浏览的同时希望给予作者打赏,来支持作者的服务器维护费用.一分也是爱~