【Android 逆向】ARM switch 逆向
#include <stdio.h>
int switch1(int a, int b, int i){
switch (i){
case 1:
return a + b;
break;
case 2:
return a - b;
break;
case 3:
return a * b;
break;
case 4:
return a / b;
break;
default:
return a + b;
break;
}
}
int main(int argc, char* argv[]){
printf("switch1:%d\n", switch1(3, 5, 3));
return 0;
}
.text:000085A0 ; =============== S U B R O U T I N E =======================================
.text:000085A0
.text:000085A0
.text:000085A0
.text:000085A0 switch1 ; CODE XREF: main+10↓p
.text:000085A0 ; __unwind {
.text:000085A0 SUB R2, R2, #1 ; arg2 = arg2 - 1
.text:000085A4 PUSH {R4,LR} ; 栈上保存R4 和 LR 的值,当前LR是外层调用函数调用处下一行的地址
.text:000085A8 MOV R3, R0 ; a = arg0
.text:000085AC CMP R2, #3 ; switch 4 cases
.text:000085B0 ADDLS PC, PC, R2,LSL#2 ; switch jump (if R2 <=3 则 PC = PC + R2*4)
.text:000085B4 ; ---------------------------------------------------------------------------
.text:000085B4
.text:000085B4 loc_85B4 ; CODE XREF: switch1+10↑j
.text:000085B4 B def_85B0 ; jumptable 000085B0 default case
.text:000085B8 ; ---------------------------------------------------------------------------
.text:000085B8
.text:000085B8 loc_85B8 ; CODE XREF: switch1+10↑j
.text:000085B8 B loc_85E0 ; jumptable 000085B0 case 0
.text:000085BC ; ---------------------------------------------------------------------------
.text:000085BC
.text:000085BC loc_85BC ; CODE XREF: switch1+10↑j
.text:000085BC B loc_85D8 ; jumptable 000085B0 case 1
.text:000085C0 ; ---------------------------------------------------------------------------
.text:000085C0
.text:000085C0 loc_85C0 ; CODE XREF: switch1+10↑j
.text:000085C0 B loc_85D0 ; jumptable 000085B0 case 2
.text:000085C4 ; ---------------------------------------------------------------------------
.text:000085C4
.text:000085C4 loc_85C4 ; CODE XREF: switch1+10↑j
.text:000085C4 B loc_85C8 ; jumptable 000085B0 case 3
.text:000085C8 ; ---------------------------------------------------------------------------
.text:000085C8
.text:000085C8 loc_85C8 ; CODE XREF: switch1+10↑j
.text:000085C8 ; switch1:loc_85C4↑j
.text:000085C8 BL sub_8620 ; jumptable 000085B0 case 3
.text:000085CC POP {R4,PC} ; 弹出栈上的值,其中LR的值直接赋给了PC,实现出函数
.text:000085D0 ; ---------------------------------------------------------------------------
.text:000085D0
.text:000085D0 loc_85D0 ; CODE XREF: switch1+10↑j
.text:000085D0 ; switch1:loc_85C0↑j
.text:000085D0 MUL R0, R3, R1 ; jumptable 000085B0 case 2
.text:000085D4 POP {R4,PC}
.text:000085D8 ; ---------------------------------------------------------------------------
.text:000085D8
.text:000085D8 loc_85D8 ; CODE XREF: switch1+10↑j
.text:000085D8 ; switch1:loc_85BC↑j
.text:000085D8 RSB R0, R1, R0 ; jumptable 000085B0 case 1
.text:000085DC POP {R4,PC}
.text:000085E0 ; ---------------------------------------------------------------------------
.text:000085E0
.text:000085E0 loc_85E0 ; CODE XREF: switch1+10↑j
.text:000085E0 ; switch1:loc_85B8↑j
.text:000085E0 ADD R0, R1, R0 ; jumptable 000085B0 case 0
.text:000085E4 POP {R4,PC}
.text:000085E8 ; ---------------------------------------------------------------------------
.text:000085E8
.text:000085E8 def_85B0 ; CODE XREF: switch1+10↑j
.text:000085E8 ; switch1:loc_85B4↑j
.text:000085E8 ADD R0, R1, R0 ; jumptable 000085B0 default case
.text:000085EC POP {R4,PC}
.text:000085EC ; } // starts at 85A0
.text:000085EC ; End of function switch1
.text:000085EC
.text:000085F0
.text:000085F0 ; =============== S U B R O U T I N E =======================================
.text:000085F0
.text:000085F0 ; arg0
.text:000085F0 ;
.text:000085F0
.text:000085F0 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:000085F0 main ; CODE XREF: j_main↑j
.text:000085F0 ; __unwind {
.text:000085F0 MOV R0, #3
.text:000085F4 PUSH {R4,LR}
.text:000085F8 MOV R2, R0 ; arg2
.text:000085FC MOV R1, #5 ; arg1
.text:00008600 BL switch1 ; arg2 = arg2 - 1
.text:00008604 MOV R1, R0
.text:00008608 LDR R0, =(aSwitch1D - 0x8614) ; "switch1:%d\n"
.text:0000860C ADD R0, PC, R0 ; "switch1:%d\n"
.text:00008610 BL printf
.text:00008614 MOV R0, #0
.text:00008618 POP {R4,PC}
.text:00008618 ; End of function main
.text:00008618
.text:00008618 ; ---------------------------------------------------------------------------
【Android 逆向】ARM switch 逆向的更多相关文章
- 使用IDA pro逆向ARM M系核心的Bin固件
使用IDA pro逆向ARM M系核心的Bin固件 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候, ...
- 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- Android Studio快捷键switch case 轻松转换为if else
Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...
- 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- 20145219《网络对抗技术》PC平台逆向破解之逆向与Bof基础
20145219<网络对抗技术>PC平台逆向破解之逆向与Bof基础 实践目标 实践对象:一个名为pwn1的linux可执行文件. pwn1正常执行流程:main调用foo函数,foo函数会 ...
- Android Studio中Switch控件有关 textOn 和 textOff 用法
•属性 textOn:控件打开时显示的文字 textOff:控件关闭时显示的文字 showText:设置是否显示开关上的文字(API 21及以上) •用法 <?xml version=" ...
- Android Studio中Switch控件有关 thumb 和 track 用法
•任务 •属性 android:track:底部的图片(灰->绿) android:thumb:设置 Switch 上面滑动的滑块,也就是上图中的白色圆形滑块 •switch_thumb 点击 ...
- 【android逆向】 ARM for 逆向
C源码 #include <stdio.h> int nums[5] = {1, 2, 3, 4, 5}; int for1(int n){ //普通for循环 int i = 0; in ...
- 【Android 逆向】switch 的smail特征
JAVA 源码 ... String str1 = packedSwitch(1); ... private String packedSwitch(int i) { String str = nul ...
随机推荐
- RocketMQ事务消息机制
1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...
- RPA应用场景-对公账户开户资质审查
场景概述 对公账户开户资质审查 所涉系统名称 人民银行账户管理系统 人工操作(时间/次) 0.5小时 所涉人工数量 132 操作频率 不定时 场景流程 1.机器人自动登录人民银行账户管理系统 2.查询 ...
- 在.NET 6.0上使用Kestrel配置和自定义HTTPS
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本章是<定制ASP NET 6.0框架系列文章>的第四篇.在本章,我们 ...
- 扩展新的WCV到标准的WC后,不能在业务角色里面看见视图解决方法
by zyi 感谢群主红枣的分享 1.把你的WCVIEW扩展进WC中 2.使用UI Designer打开你的WCVIEW 3.更改你的WCVIEW名字
- 实现一个Prometheus exporter
Prometheus 官方和社区提供了非常多的exporter,涵盖数据库.中间件.OS.存储.硬件设备等,具体可查看exporters.exporterhub.io,通过这些 exporter 基本 ...
- ArrayList分析2 :Itr、ListIterator以及SubList中的坑
ArrayList分析2 : Itr.ListIterator以及SubList中的坑 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/16409137.html ...
- 网络通讯之Socket-Tcp(一)
网络通讯之Socket-Tcp 分成3部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 网络通讯之Socket-Tcp(二): 1.简单So ...
- 类似Tower的而故事还没结束
我对于SaaS一种有一种英雄主义的情怀在里面,无论是早期的推事本,还是后面我去调研的麦客CRM,国内的SaaS都在努力生长,在后疫情时代剩下的都是平台级的钉钉.飞书,或者垂直领域的王炸app了. 我早 ...
- S32K148-CAN收发
最近在搞一个转换板开发,大概意思把CAN信号转换成SPI信号,方案有两种:1)通过硬件电路直接把信号的bit位一位一位移给两个集成芯片:2)通过MCU接收CAN信号,再把信号变量转换成SPI信号发送给 ...
- 函数式接口的概念&函数式接口的定义和函数式接口的使用
函数式接口概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambd ...