吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14990|回复: 9
收起左侧

[Android 分享] ARM静态反编译逆向

[复制链接]
七寸往事 发表于 2014-10-31 18:30
首先要到JAVA中找到程序的原型(用JD-GUI),为是查看传入的参数和返回
1.jpg 参数为byte数组,返回也是byte数组


然后找到在IDA打开libyyjni.so进行反编译

2.jpg
好了,现在大概了解一下汇编的JNI的东西.为了了解JNI,得自己会写一点JNI.根据上面的函数,也写个大概类似的函数
3.jpg
在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]   取出R0指针所指向的值放到R2,即取出JNIEnv* ,也就是JNIEnv (JNIEnv*其实是一个指向指针的指针)

第6行 MOVS    R3, #0x2AC     将0x2AC传入到R3中,下面介绍用途

第7行 SUB     SP, SP, #8     SP指当前栈,此处栈的位置减去8,作用不明.

第8行 LDR     R3, [R2,R3]    取出R2即JNIEnv(第5行),并偏移0x2AC所指向的内存的值.放到R3中,JNIEnv+0x2AC指向的是GetArrayLength
见下面(所有的函数在附件中)
4.jpg
第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]       R4就是JNIEnv*(第10行),取出JNIEnv放到R2中

第14行  MOVS    R3, #0x2E0     将0x2E0传入到R3中

第15行  LDR     R3, [R2,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[0x10];
JNI_ENV_FUNCTIONS.rar (17.54 KB, 下载次数: 73)

免费评分

参与人数 3吾爱币 +1 热心值 +3 收起 理由
(り帕克先森 + 1 + 1 谢谢@Thanks!
Mouse.JiangWei + 1 谢谢@Thanks!
Ja5on + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

SoulKingLHW 发表于 2014-10-31 18:36
前排!看大牛你!
黑龍 发表于 2014-10-31 18:43
头像被屏蔽
yyz219 发表于 2014-10-31 19:07
Avenshy 发表于 2014-10-31 19:33
膜拜楼主 没搞过这个 顺便前排兜售饮料瓜子爆米花
manbajie 发表于 2014-10-31 20:24
只能膜拜大神了
LCH111 发表于 2016-8-10 18:22
挖坟非常感谢楼主
Loopher 发表于 2016-8-11 09:21
又涨姿势了~
kingkaling37 发表于 2016-9-30 19:53
good good
(り帕克先森 发表于 2017-3-14 22:53
谢谢分享,很有帮助
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表