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

.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

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

该文章属于:计算机技术网原创

转载请注明标题:IDA调试之动态注册arm代码解析-计算机技术网

转载请注明出处:https://www.ctvol.com/asreverse/41028.html

(0)
上一篇 2020年4月21日
下一篇 2020年4月21日

精彩推荐