ARM静态反编译逆向
首先要到JAVA中找到程序的原型(用JD-GUI),为是查看传入的参数和返回参数为byte数组,返回也是byte数组
然后找到在IDA打开libyyjni.so进行反编译
好了,现在大概了解一下汇编的JNI的东西.为了了解JNI,得自己会写一点JNI.根据上面的函数,也写个大概类似的函数
在JNI中,第一个参数为JNIEnv,固定,可以理解为一个类的指针,类里包含了C++与JAVA数据转换的方法,比如把JAVA中的Byte数组转为C++下的jbyteArray
第二个参数为thiz,固定,即相当于JAVA下的this,指向当前类的指针.
第三个才是用户自定的参数, Byte[]在C++下就是jbyteArray
回到 Java_com_duowan_mobile_service_GenKey_generateKey
R0 是 JNIEnv*
R1是thiz
R2 是第一个参数
第1行 PUSH {R4-R7,LR} 如果压入寄存器从R3开始,表示没有参数,从R4则表示有一个或以上.LR是要返回的地址.调用时自动压入LR.
//// 最后一行 POP {R4-R7,PC},一般是和第一行执行相反的出栈动作.将LR放入到PC,PC是下一条命令的地址,改变它的值也就相当跳转.
第2行 MOV R7, R8 把R8传给R7,
第3行 PUSH {R7} 再把R7压入. 相当于把R8也存压入栈,似乎PUSH一次只能压入8个寄存器,所以超过8个要另行压入.
第4行 MOVS R6, R2 把R2传给R6,即把第一个参数Byte[]再放R6中,注意到第二是MOV,这一行是MOVS,其实都差不多,只MOVS会影响到影响CPSR
第5行 LDR R2, 取出R0指针所指向的值放到R2,即取出JNIEnv* ,也就是JNIEnv (JNIEnv*其实是一个指向指针的指针)
第6行 MOVS R3, #0x2AC 将0x2AC传入到R3中,下面介绍用途
第7行 SUB SP, SP, #8 SP指当前栈,此处栈的位置减去8,作用不明.
第8行 LDR R3, 取出R2即JNIEnv(第5行),并偏移0x2AC所指向的内存的值.放到R3中,JNIEnv+0x2AC指向的是GetArrayLength
见下面(所有的函数在附件中)
第9行 MOVS R1, R6 这是GetArrayLength第二个参数(第4行),即第一个参数Byte[]
第10行 MOVS R4, R0 RO一般是放返回值的,调用函数后会被覆盖的,所以复制到R4中
第11行 BLX R3 调用GetArrayLength, 第一个参数是R0,是JNIEnv,本来就在R0的,所以现在直接调用GetArrayLength,获取数组的长度
第13行LDR R2, R4就是JNIEnv*(第10行),取出JNIEnv放到R2中
第14行MOVS R3, #0x2E0 将0x2E0传入到R3中
第15行LDR R3, 取出JNIEnv+0x2E0指向的值,查表,是GetByteArrayElements
第16行MOVS R1, R6 第二参数是本函数的第一个参数Byte[](第4行)
第17行MOV R8, R0 R0现在放着是上面GetArrayLength的返回值,为了不被下面的返回值覆盖,要复制到R8中
第18行MOVS R2, #0 第三个参数是0
第19行MOVS R0, R4 第一个参数是JNIEnv*
第20行BLX R3 调用GetByteArrayElements
第21行 MOVS R7, R0 R0现在放着是上面GetByteArrayElements的返回值,为了不被下面的返回值覆盖,要复制到R7中
第22行 MOVS R0, #0x10 第一个参数10
第22行 BL _Znaj ; operator new[](uint) 即int myint;
前排!看大牛你! 自己分析 ? 膜拜楼主 没搞过这个 顺便前排兜售饮料瓜子爆米花 只能膜拜大神了 挖坟{:1_927:}{:1_927:}非常感谢楼主 又涨姿势了~ good good 谢谢分享,很有帮助
页:
[1]