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); }