#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 逆向的更多相关文章

  1. 使用IDA pro逆向ARM M系核心的Bin固件

    使用IDA pro逆向ARM M系核心的Bin固件 ​ 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候, ...

  2. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  3. Android Studio快捷键switch case 轻松转换为if else

    Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...

  4. 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  5. 20145219《网络对抗技术》PC平台逆向破解之逆向与Bof基础

    20145219<网络对抗技术>PC平台逆向破解之逆向与Bof基础 实践目标 实践对象:一个名为pwn1的linux可执行文件. pwn1正常执行流程:main调用foo函数,foo函数会 ...

  6. Android Studio中Switch控件有关 textOn 和 textOff 用法

    •属性 textOn:控件打开时显示的文字 textOff:控件关闭时显示的文字 showText:设置是否显示开关上的文字(API 21及以上) •用法 <?xml version=" ...

  7. Android Studio中Switch控件有关 thumb 和 track 用法

    •任务 •属性 android:track:底部的图片(灰->绿) android:thumb:设置 Switch 上面滑动的滑块,也就是上图中的白色圆形滑块 •switch_thumb 点击 ...

  8. 【android逆向】 ARM for 逆向

    C源码 #include <stdio.h> int nums[5] = {1, 2, 3, 4, 5}; int for1(int n){ //普通for循环 int i = 0; in ...

  9. 【Android 逆向】switch 的smail特征

    JAVA 源码 ... String str1 = packedSwitch(1); ... private String packedSwitch(int i) { String str = nul ...

随机推荐

  1. 【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧

    前言:随着工业化的进一步发展,制造业.工业自动化等多领域,都可能用到上位监控系统.而WPF在上位监控系统方面,应该算是当下最流行的前端框架之一了.而随着监控体系的不断完善与更新迭代,监控画面会变得越来 ...

  2. Linux基础命令、引号和括号的作用

    查看硬件信息 查看 cpu lscpu命令可以查看cpu信息 cat /proc/cpuinfo也可看查看到 查看内存大小 free命令 cat /proc/meminfo 查看硬盘和分区 lsblk ...

  3. Java数组的基本操作

    public class Array1 { public static void main(String[] args) { int [] num={1,2,3,4,5}; System.out.pr ...

  4. mysql密码忘记了重置方法

    #先把mysql停止 service mysqld stop #安全模式进入mysql,并且跳过授权表 mysqld_safe --skip-grant-tables & #如果上面这个命令报 ...

  5. 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)

    本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章<聊聊Netty那些事儿之从内核角度看IO模型>中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以 ...

  6. 创建多线程程序的第一种方式_创建Thread类的子类

    创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...

  7. .NET自定义认证虽然简单,但好用

    前言 有这样一种场景,就是新项目已经集成了认证中心,或者是都用了统一的认证方式(比如现在常用的JWT),这样对于项目之间的对接就显得比较方便,至少在认证这块还是能减少一些工作量的.但当上线的老项目需要 ...

  8. CSS Houdini:用浏览器引擎实现高级CSS效果

    vivo 互联网前端团队-Wei Xing Houdini被称之为Magic of styling and layout on the web,看起来十分神秘,但实际上,Houdini并非什么神秘组织 ...

  9. Bash脚本debug攻略

    初学Bash时, 我从未想过想过bash也能debug, 也从未想过去debug Bash脚本. 随着技术的增长, 写的脚本越来越复杂, 使用echo打印日志来调试脚本的方式越来越捉襟见肘了. 直到某 ...

  10. 无用的IP黑名单

    无效的IP黑名单,有些还没有收集,在阿里云或者腾讯云的安全组里面设置,拦截不必要的IP,免得遭到攻击,也避免的CPU和内存过高 来源 备注82.102.21.217 拒绝 随机访问目录攻击,频繁69. ...