本篇文章为大家展示了如何进行Android逆向基础中的so文件分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在so文件的分析上,我们需要对一些ARM汇编的逻辑实现。
在代码逻辑上,只对if,switch,还有循环进行一个demo分析和创建。可能会篇幅比较大。1.if逻辑NDK编程
2.if逻辑ARM分析
3.switch逻辑NDK编程
4.switch逻辑ARM分析
5.循环逻辑NDK编程
6.循环逻辑ARM分析demo使用之前的demo,如果有兴趣,可以去看看
博客导航戳这里demo主要实现一个输入,然后根据输入的内容返回不同的内容。在Native层进行实现。首先添加一个函数,然后使用 ALT+Enter进行自动创建
在.cpp文件里会自动生成一个函数这个是MainActivity的代码。这个是主要的代码。很简单,不过多解释。反汇编分析,当然是要丢在IDA里进行分析了。
这里有个问题就是,IDA只有32位才可以使用F5插件,我之前不知道,坑了好久。
我假装自己不知道自己的函数名称啊什么的。就按照流程进行分析。
本来第一步是要进行试玩的,demo试玩我就算了吧。反编译,找Android Killer找到函数之后进行反汇编。双击进入函数。F5插件真的比较好用,但是我们还是以ARM为主。首先来看下流程图从流程图上可以看到这是一个if逻辑的流程图。我们来看主要代码PUSH 是入栈的意思
R7是通用寄存器
LR就是:R14:链接寄存器(LR) LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器,当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。那么这句话的意思就是把R7 和LR入栈这句话好理解,就是把sp的值给R7。
在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push )。通常用一个指针(堆栈指针 SP—Stack Pointer)实现做一次调整,SP 总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。SUB 是减法运算。
简单的翻译一下就是:sp=sp-#0x20
这里的#0x20就是十六进制的意思。R3=R2R12=R1LR=R0STR{条件} 源寄存器,
STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用。翻译一下就是 把R0这里的数据送到[SP,#0x28+var_10]中同理同理LDR 伪指令用于加载立即数或一个地址值到指定寄存器.CMP是比较命令,R0和#1进行比较
CF=1,因为有借位
OF=0,未溢出
SF=1,结果是负数
ZF=0,结果不全是零[SP,#0x28+var_1C] 的数据送入R3中.W 是wide。指定汇编器必须为这条指令选择一个32位的编码模式。如果办不到,汇编器报错。bne: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处
也就是说当Z不等于0的时候也就是不相等的时候就会跳转到loc_4676无条件跳转恩,我大概懂了。如果不满足就跳转到这里。如果满足的话,叫跳转到这里最后就会归结在这里:其中有很多是自带的东西,所以重要的东西画出来。首先是这个参数调用参数,然后进行比较根据寄存器进行跳转直接使用上次的demo来进行更改,然后直接修改c语言程序就可以了。编写还是非常简单的,只要知道接口函数,在前期没有什么困难的地方。暂停:2018年2月15日02:29:01
原因:该睡觉了。恩,要好好的睡一觉,然后起来学习。开始时间:2018年2月15日11:33:13
原因:刚吃完午饭首先来说,这些ARM代码,个人理解,就是在进行函数以及函数内参数的初始化过程,也可以理解为在构建一个我们主要ARM进行逻辑运算的环境或者是平台,之后也有一相对应的环境释放。免费云主机域名我们来看一下主要的逻辑判断部分。用R0和#1进行比较。标志寄存器中Z标志位等于零时, 跳转到BEQ后标签处。然后就会突然跳转突然发现判断逻辑好简单,可能是我太无知了。无条件跳转到下一个判断。
之前还在想多个if怎么实现,现在发现还是按照一个块一个来进行运行。
现在知道了那两周学习8086不是白学习的了。这是剩下的代码逻辑,如果有兴趣可以自己进行分析使用。感觉自己一下次大彻大悟了。
接下来就是循环逻辑了。步骤和之前一样,我只是改变一下c代码。写一个简单的逻辑。
就是判断质数。这里是主体部分,类似于main的开头这些ARM代码就是在搭建环境。MOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr,可能会影响到T标志位
MOVS总是会影响CPSR, 包括N,Z,C标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态,USER和SYSTEM模式下没有SPSR)再简单的说就是 R0=#1然后把这个值存放在 [SP,#0x30+var_20]这里把[SP,#0x30+var_18]的值取出来给R0然后拿出来比较其实我真的不知道这是什么东西,如果有人知道的话可以告诉我不。反正我忽略了。不影响分析逻辑bne: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处如果不等于#1的话就会进行跳转如果相等,就会执行无条件跳转。我们现在来看loc_466C这一个块调用接口函数,返回一个字符串。”Sorrry”;
程序最后跳转到 loc_46E4这个就是拆环境的部分。来看第一句[SP,#0x30+var_18]这里的数据给R0
之前[SP,#0x30+var_18]的数据就是我们输入的数据。如果等于#2 就跳转到loc_4682,如果不等于#2就跳转到loc_4690。如果等于就会跳转到loc_4682这一块就是返回”ZHUZHU I Love YOU”这个字符串,然后到loc_46E4,恢复环境。程序结束。这个是不等于#2时进行跳转的来看第一句把#2的值给R0然后把R0的值给[SP,#0x30+var_1C]这个存储位置。跳转到 loc_4696块。第一句把[SP,#0x30+var_1C]取出来给R0把[SP,#0x30+var_18]的数据给R1,这个[SP,#0x30+var_18]就是我们输入的数据。R0和R1比较跳转的意思,BGE就是大于或等于才跳。也就是说当R0>=R1就跳转到loc_46C0其他情况跳转到 loc_46A0把[SP,#0x30+var_20]的值拿出来给R0然后进行比较。不相等就跳转到loc_46D6,loc_46D6返回sorry相等就跳转到loc_46C8,返回 “ZHUZHU I Love YOU”第一句取出[SP,#0x30+var_18]的数据给R0,[SP,#0x30+var_18]就是输入的数值。去除 [SP,#0x30+var_1C]的数据给R1, [SP,#0x30+var_1C]就是在loc_4690中存取的数据,现在是#2跳转到 sub_1422C我们来看看 sub_1422C比较R1和0,之前的R1就是#2相等则进行跳转入栈跳转到sub_1416csub_1416c逻辑异或EOR(Exclusive OR)指令将寄存器
loc_46A0这一句的逻辑就是计算R1被整除之后的内容比较是不是相等不相等跳转到loc_46B6模块如果相等的话。取出来,把变量+1然后存进去跳转到 loc_4696这里就是整个循环了。##loc_46B0模块分析这个模块就是更改[SP,#0x30+var_20]存储的值改变为#0然后就是继续循环。上述内容就是如何进行Android逆向基础中的so文件分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注云编程开发博客行业资讯频道。
相关推荐: H3C F1000-S防火墙基础配置及telnet登录!
一、场景说明: 准备调试的防火墙在机房,由于现场配置比较麻烦,所以决定先调测到可以通过核心交换下面的一台跳板机可以访问后在远程调试。二、拓扑图: 拓扑如下:外网通过箭头1的方向访问到箭头2所指向的跳板机,然后如logo覆盖的箭头3所示在通过跳板机访问与华为…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。