ARM学习之------注释--c层调用java层方法

 

2020-04-24

  • 本次学习内容为通过调试so来理解arm各种指令

  • 详细的在下图中
  • libjavandk1.so:B4B012BC ; =============== S U B R O U T I N E =======================================
    libjavandk1.so:B4B012BC
    libjavandk1.so:B4B012BC
    libjavandk1.so:B4B012BC Java_com_example_javandk1_MainActivity_chengyuan1
    libjavandk1.so:B4B012BC LDR             R3, [R0]								//R0=B4C96F60   计算之后R3=B4AB397C 也就是JNIEnv * env
    libjavandk1.so:B4B012C0 STMFD           SP!, {R4-R6,LR}	//计算之前SP=BEE67F70 之后BEE67F60 相差0x10 也就是将R4-R6 LR压栈
    libjavandk1.so:B4B012C4 MOV             R5, R1				//R5 = R1	= BEE67F7C		= obj					
    libjavandk1.so:B4B012C8 LDR             R1, =(aComExampleJava - 0xB4B012DC)	//获取偏移地址 R1 = 0x1914
    libjavandk1.so:B4B012CC MOV             R4, R0			//R4=R0=B4C96F60=env
    libjavandk1.so:B4B012D0 LDR             R3, [R3,#0x18]		//R3 = [R3+0x18] R3= [B4AB397C +0x18] = [B4AB3994]  findClass
    libjavandk1.so:B4B012D4 ADD             R1, PC, R1              ;PC=12D4,R1=1914 => R1 = 12D4+1914 + 8 = 2BF0 也就是定义的类名className="com/example/javandk1/MainActivity"
    libjavandk1.so:B4B012D8 BLX             R3				//执行FindClass,参数是env,className	
    																									执行之前·R0 = B4C96F60	R1 = B4B02BF0 LR=B37074AB
    																									进入FindClass LR=B4B012DC也就是下一条指令地址libjavandk1.so:B4B012DC 010 LDR R12, [R4]
    																									返回值放在R0中
    libjavandk1.so:B4B012DC LDR             R12, [R4]	//R12 = env;
    libjavandk1.so:B4B012E0 LDR             R2, =(aChengyuan - 0xB4B012F0)			//R2=1948
    libjavandk1.so:B4B012E4 LDR             R3, =(aLjavaLangStrin - 0xB4B012F8) //R3=194c
    libjavandk1.so:B4B012E8 ADD             R2, PC, R2              ; "chengyuan"	//R2=12E8+1948+8=2c38 该处是字符串chengyuan
    libjavandk1.so:B4B012EC LDR             R12, [R12,#0x84]		//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    libjavandk1.so:B4B012F0 ADD             R3, PC, R3       ;// //R3=12F3+194c+8=2C44 该处是字符串"(Ljava/lang/String;)Ljava/lang/String;"
    libjavandk1.so:B4B012F4 MOV             R1, R0	//R1=R0=0x00100025
    libjavandk1.so:B4B012F8 MOV             R0, R4	//R0=R4=env地址
    libjavandk1.so:B4B012FC BLX             R12	//执行GetMethodID,结束之后R0 = MethodID
    libjavandk1.so:B4B01300 LDR             R3, [R4]	// R3存放env地址
    libjavandk1.so:B4B01304 LDR             R1, =(a123456 - 0xB4B01314)	//R1=00001958
    libjavandk1.so:B4B01308 LDR             R3, [R3,#0x29C]	//没数,直接调试得知是NewStringUTF
    libjavandk1.so:B4B0130C ADD             R1, PC, R1              ; "123456"//寻址,计算方式上面又,此处不重复,,需要注意的是pc+8
    libjavandk1.so:B4B01310 MOV             R6, R0	//R6=R0=MethodID
    libjavandk1.so:B4B01314 MOV             R0, R4	//R0 = env;
    libjavandk1.so:B4B01318 BLX             R3	//调用NewStringUTF 返回R0 = jstring
    libjavandk1.so:B4B0131C LDR             R12, [R4]	//R12=env
    libjavandk1.so:B4B01320 MOV             R1, R5	//R1 = obj
    libjavandk1.so:B4B01324 MOV             R2, R6	// R2 = MethodID
    libjavandk1.so:B4B01328 LDR             R12, [R12,#0x88]	//根据0x88/4=34,查找jni.h或者直接调试,得知此处是jobject (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
    libjavandk1.so:B4B0132C MOV             R3, R0	//R3=R0=jstring="123456";
    libjavandk1.so:B4B01330 MOV             R0, R4	//R0=R4=env
    libjavandk1.so:B4B01334 BLX             R12		//执行GetObjectClass
    libjavandk1.so:B4B01338 LDMFD           SP!, {R4-R6,PC}	//平栈
    libjavandk1.so:B4B01338 ; End of function Java_com_example_javandk1_MainActivity_chengyuan1
    
    public native String chengyuan1();
    
    还原之后
    JNIEXPORT jstring Java_com_example_javandk1_MainActivity_chengyuan1(JNIEnv* env,jobject obj){
    		jclass clazz = (*env)->findClass(env,"com/example/javandk1/MainActivity");
    		jmethodID methoid = (*env)->GetMethodID(env,clazz,"chengyuan","(Ljava/lang/String;)Ljava/lang/String;");
    		jstring tstr = (*env)->NewStringUTF(env,"123456",);
    		return (*env)->CallObjectMethod(env,obj,methoid,tstr);
    }
    
    
    libjavandk1.so:B4B0134C     Java_com_example_javandk1_MainActivity_jingtai1
    libjavandk1.so:B4B0134C 000 LDR             R12, [R0]							//R0=B4C96F60   计算之后R12=B4AB397C 也就是JNIEnv * env
    libjavandk1.so:B4B01350 000 LDR             R2, =(aJingtai - 0xB4B01364)	//R2=0x1910
    libjavandk1.so:B4B01354 000 LDR             R3, =(aLjavaLangStrin - 0xB4B0136C)	//R3=180D
    libjavandk1.so:B4B01358 000 STMFD           SP!, {R4-R6,LR}	//SP= BEE67F70-0x10 =BEE67F60 R4,R5,R6,LR压栈 SP保存的数据是 LR=F3333334
    libjavandk1.so:B4B0135C 010 ADD             R2, PC, R2              ; "jingtai"//R2 = pc + R2 +8 = 135C+8+0x1910=2c47="jingtai"
    libjavandk1.so:B4B01360 010 LDR             R12, [R12,#0x1C4]		//jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
    libjavandk1.so:B4B01364 010 ADD             R3, PC, R3              ; "(Ljava/lang/String;)Ljava/lang/String;"
    libjavandk1.so:B4B01368 010 MOV             R4, R0		//R4=R0 =env
    libjavandk1.so:B4B0136C 010 MOV             R5, R1		//R5=R1 =clazz
    libjavandk1.so:B4B01370 010 BLX             R12	//执行GetStaticMethodID R0 = methodid
    libjavandk1.so:B4B01374 010 LDR             R3, [R4] 	//R3 = env
    libjavandk1.so:B4B01378 010 LDR             R1, =(a654321 - 0xB4B01388)	//计算方式同上
    libjavandk1.so:B4B0137C 010 LDR             R3, [R3,#0x29C]	// jstring     (*NewStringUTF)(JNIEnv*, const char*);
    libjavandk1.so:B4B01380 010 ADD             R1, PC, R1              ; "654321"
    libjavandk1.so:B4B01384 010 MOV             R6, R0	//R6=methodid;
    libjavandk1.so:B4B01388 010 MOV             R0, R4	//R0 = env
    libjavandk1.so:B4B0138C 010 BLX             R3	//执行NewStringUTF,R0 = jstring
    libjavandk1.so:B4B01390 010 LDR             R12, [R4]	//R12 = env
    libjavandk1.so:B4B01394 010 MOV             R1, R5		//R1 = R5 = clazz
    libjavandk1.so:B4B01398 010 MOV             R2, R6		//R2 = R6 = methodid
    libjavandk1.so:B4B0139C 010 LDR             R12, [R12,#0x1C8]	//R12 = jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
    libjavandk1.so:B4B013A0 010 MOV             R3, R0	//R3 = jstring
    libjavandk1.so:B4B013A4 010 MOV             R0, R4	//R0 = env
    libjavandk1.so:B4B013A8 010 BLX             R12		//执行CallStaticObjectMethod 返回值是jstring
    libjavandk1.so:B4B013AC 010 LDMFD           SP!, {R4-R6,PC}
    libjavandk1.so:B4B013AC     ; End of function Java_com_example_javandk1_MainActivity_jingtai1
    
    public static native String jingtai1();
    还原之后
    JNIEXPORT jstring Java_com_example_javandk1_MainActivity_jingtai1(JNIEnv* env,jclass clazz){
    		jmethodID methoid = (*env)->GetStaticMethodID(env,clazz,"jingtai","(Ljava/lang/String;)Ljava/lang/String;");
    		
    		jstring tstr = (*env)->NewStringUTF(env,"654321",);
    		
    		return (*env)->CallStaticObjectMethod(env,clazz,methoid,tstr);
    }

     

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值