【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 ...
随机推荐
- 几百行代码实现一个 JSON 解析器
前言 之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来. 一次无意间看到有人提起 JSON 解析器,这类工具充斥着我们的日常开 ...
- rhel挂载本地光盘为yum源
挂载光盘 mount /dev/sr0 /mnt/cdrom mkdir /mnt/cdrom 临时挂载 mount /dev/sr0 /mnt/cdrom 永久挂载光盘 mount -a 执行挂载 ...
- Java开发问题:Column 'AAA' in where clause is ambiguous解决办法
当在java开发中遇到了Column 'AAA' in where clause is ambiguous问题时, 你需要去看看:多表查询的时候不同的表是否出现了相同名称相同的列, 如果存在,你需要在 ...
- 如何将 DevSecOps 引入企业?
前 言 现如今,大部分企业已经在内部实现了 DevOps 实践.DevOps 为团队提供了交付可靠软件和快速更新的方法论.这种方法让团队更专注于质量而不是将时间浪费在运维上.然而,结果是,安全实践往往 ...
- JDBC:Statement问题
1.Statement问题 2.解决办法:通过PreparedStatement代替 实践: package com.dgd.test; import java.io.FileInputStrea ...
- 生成RSA密钥的方法[转载]
openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成(测试常 ...
- 06 MySQL_数据冗余
数据冗余--拆分表 如果表设计不合理,可能会出现大量的重复数据,这种现象被称为数据冗余,通过拆分表的形式可以解决此问题 保存集团总部下财务部里面的财务A部的张三工资8000 年龄18 保存集团总部下研 ...
- Python网页解析库:用requests-html爬取网页
Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...
- 【USACO 2012 Open】奶牛赛跑_题解
奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...
- 一款性价比很高的PLC网关如何采集西门子PLC到Thingsboard
PLC转MQTT网关金鸽BL100 西门子S7-200smart对接thingsboardBL102是一款采集西门子.三菱.欧姆龙.台达.AB.施耐德等各种PLC数据转换为Modbus TCP.OPC ...