IDA调试之动态注册arm代码解析

本文详细解释了如何通过逆向工程分析Android应用中的JNI函数Java_com_example_javandk1_MainActivity_getText,涉及寄存器操作和JNI接口调用过程。
摘要由CSDN通过智能技术生成

 源地址:https://www.ctvol.com/asreverse/41028.html

.text:00000E58                 EXPORT Java_com_example_javandk1_MainActivity_getText
.text:00000E58 Java_com_example_javandk1_MainActivity_getText
.text:00000E58                                         ; DATA XREF: LOAD:000001C8↑o
.text:00000E58 ; __unwind {
.text:00000E58                 STMFD           SP!, {R3-R5,LR} ; 入栈
.text:00000E5C                 MOV             R5, R1  ; 没有被静态修饰,所以这里是jobj
.text:00000E60                 LDR             R3, [R0] ; *env
.text:00000E64                 MOV             R4, R0  ; r4=r0=env
.text:00000E68                 LDR             R1, =(aComExampleJava - 0xE78) ; 偏移
.text:00000E6C                 LDR             R3, [R3,#JNINativeInterface.FindClass]
.text:00000E70                 ADD             R1, PC, R1 ; "com/example/javandk1/MainActivity"
.text:00000E74                 BLX             R3      ; JNINativeInterface.FindClass(env,main)
.text:00000E78                 LDR             R12, [R4] ; r4=env
.text:00000E7C                 LDR             R2, =(aActivity - 0xE90)
.text:00000E80                 LDR             R3, =(aLjavaLangStrin - 0xE94)
.text:00000E84                 LDR             R12, [R12,#JNINativeInterface.GetFieldID]
.text:00000E88                 ADD             R2, PC, R2 ; "Activity"
.text:00000E8C                 ADD             R3, PC, R3 ; "Ljava/lang/String;"
.text:00000E90                 MOV             R1, R0  ; r1=r0=findclass返回值
.text:00000E94                 MOV             R0, R4  ; r0=r4=env
.text:00000E98                 BLX             R12     ; getfieldid(env,findclass,activit,string)
.text:00000E9C                 LDR             R3, [R4] ; r3=*env
.text:00000EA0                 MOV             R1, R5  ; jobj
.text:00000EA4                 LDR             R3, [R3,#JNINativeInterface.GetObjectField]
.text:00000EA8                 MOV             R2, R0  ; r2=r0=getfieldid返回值
.text:00000EAC                 MOV             R0, R4  ; r0=r4=env
.text:00000EB0                 BLX             R3      ; GetObjectField(env,jobj,getfieldid)
.text:00000EB4                 LDR             R3, [R4] ; r3=*env
.text:00000EB8                 MOV             R2, #0  ; r2=0
.text:00000EBC                 LDR             R3, [R3,#JNINativeInterface.GetStringUTFChars]
.text:00000EC0                 MOV             R1, R0  ; r1=r0=GetObjectField返回值
.text:00000EC4                 MOV             R0, R4  ; r0=r4=env
.text:00000EC8                 BLX             R3      ; GetStringUTFChars(env,getobjevtfield,0)
.text:00000ECC                 LDR             R3, [R4] ; r3=*env
.text:00000ED0                 LDR             R3, [R3,#JNINativeInterface.NewStringUTF]
.text:00000ED4                 MOV             R1, R0  ; r1=r0=GetStringUTFChars返回值
.text:00000ED8                 MOV             R0, R4  ; r0=r4=env
.text:00000EDC                 BLX             R3      ; NewStringUTF(env,utfchars)
.text:00000EE0                 LDMFD           SP!, {R3-R5,PC}
.text:00000EE0 ; End of function Java_com_example_javandk1_MainActivity_getText

在安卓逆向的学习中,我们会经常遇到这样的分析,要知道各个寄存器中存储的什么东西,还有关键字的各种意思,当然,这边关键字不需要死记硬背,只要多看代码,不知道就看下笔记,自然就会记住。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值