C源码

  1. #include <stdio.h>
  2. int nums[5] = {1, 2, 3, 4, 5};
  3. int for1(int n){ //普通for循环
  4. int i = 0;
  5. int s = 0;
  6. for (i = 0; i < n; i++){
  7. s += i * 2;
  8. }
  9. return s;
  10. }
  11. int for2(int n){ //访问全局数组
  12. int i = 0;
  13. int s = 0;
  14. for (i = 0; i < n; i++){
  15. s += i * i + nums[n-1];
  16. }
  17. return s;
  18. }
  19. int main(int argc, char* argv[]){
  20. printf("for1:%d\n", for1(5));
  21. printf("for2:%d\n", for2(5));
  22. return 0;
  23. }
android.mk
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_ARM_MODE := arm
  4. LOCAL_MODULE := for
  5. LOCAL_SRC_FILES := for.c
  6. include $(BUILD_EXECUTABLE)

逆向代码+注释

main
  1. .text:000085FC ; int __cdecl main(int argc, const char **argv, const char **envp)
  2. .text:000085FC main ; CODE XREF: j_mainj
  3. .text:000085FC ; __unwind {
  4. .text:000085FC PUSH {R4,LR}
  5. .text:00008600 MOV R0, #5
  6. .text:00008604 BL for1
  7. .text:00008608 MOV R1, R0
  8. .text:0000860C LDR R0, =(aFor1D - 0x8618) ; "for1:%d\n"
  9. .text:00008610 ADD R0, PC, R0 ; "for1:%d\n"
  10. .text:00008614 BL printf
  11. .text:00008618 MOV R0, #5
  12. .text:0000861C BL for2
  13. .text:00008620 MOV R1, R0
  14. .text:00008624 LDR R0, =(aFor2D - 0x8630) ; "for2:%d\n"
  15. .text:00008628 ADD R0, PC, R0 ; "for2:%d\n"
  16. .text:0000862C BL printf
  17. .text:00008630 MOV R0, #0
  18. .text:00008634 POP {R4,PC}
  19. .text:00008634 ; End of function main
  20. .text:00008634
  21. .text:00008634 ; ---------------------------------------------------------------------------
  22. .text:00008638 off_8638 DCD aFor1D - 0x8618 ; DATA XREF: main+10r
  23. .text:00008638 ; "for1:%d\n"
  24. .text:0000863C off_863C DCD aFor2D - 0x8630 ; DATA XREF: main+28r
  25. .text:0000863C ; } // starts at 85FC
for1
  1. .text:00008590 ; =============== S U B R O U T I N E =======================================
  2. .text:00008590
  3. .text:00008590
  4. .text:00008590 for1 ; CODE XREF: main+8p
  5. .text:00008590 ; __unwind {
  6. .text:00008590 CMP R0, #0
  7. .text:00008594 MOVLE R0, #0 ; if arg0 <=0 s = 0
  8. .text:00008598 BXLE LR ; if arg0 <= 0 return s = 0
  9. .text:0000859C MOV R3, #0 ; i = 0;
  10. .text:000085A0 MOV R2, R0,LSL#1 ; n = arg0*2 = 10
  11. .text:000085A4 MOV R0, R3 ; s = 0
  12. .text:000085A8
  13. .text:000085A8 loc_85A8 ; CODE XREF: for1+24j
  14. .text:000085A8 ADD R0, R0, R3 ; s += i
  15. .text:000085AC ADD R3, R3, #2 ; i += 2
  16. .text:000085B0 CMP R3, R2
  17. .text:000085B4 BNE loc_85A8 ; if (i != n) continue
  18. .text:000085B8 BX LR
  19. .text:000085B8 ; } // starts at 8590
  20. .text:000085B8 ; End of function for1
for2
  1. .text:000085BC ; =============== S U B R O U T I N E =======================================
  2. .text:000085BC
  3. .text:000085BC
  4. .text:000085BC for2 ; CODE XREF: main+20p
  5. .text:000085BC ; __unwind {
  6. .text:000085BC SUBS R1, R0, #0
  7. .text:000085C0 MOVLE R0, #0 ; s = 0
  8. .text:000085C4 BXLE LR
  9. .text:000085C8 LDR R3, =(__data_start_ptr - 0x85DC) ; nums 首地址在GOT中的偏移
  10. .text:000085CC SUB R2, R1, #1 ; n = arg0 - 1 = 4
  11. .text:000085D0 MOV R0, #0 ; i = 0
  12. .text:000085D4 LDR R3, [PC,R3] ; __data_start ; num 首地址
  13. .text:000085D8 LDR R12, [R3,R2,LSL#2] ; num + 4*4 = num[4]
  14. .text:000085DC MOV R3, R0 ; i = 0
  15. .text:000085E0
  16. .text:000085E0 loc_85E0 ; CODE XREF: for2+34j
  17. .text:000085E0 MLA R2, R3, R3, R12 ; R2 = i*i + num[4]
  18. .text:000085E4 ADD R3, R3, #1 ; i++
  19. .text:000085E8 CMP R3, R1 ; i < n
  20. .text:000085EC ADD R0, R0, R2 ; s += R2
  21. .text:000085F0 BNE loc_85E0 ; i < n ;继续循环
  22. .text:000085F4 BX LR
  23. .text:000085F4 ; End of function for2

【android逆向】 ARM for 逆向的更多相关文章

  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的ARM汇编语言系列】之三:ARM汇编语言程序结构

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

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

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

  5. 【Android 逆向】ARM switch 逆向

    #include <stdio.h> int switch1(int a, int b, int i){ switch (i){ case 1: return a + b; break; ...

  6. 【Android 逆向】ARM while 逆向

    #include <stdio.h> int dowhile(int n){ int i = 1; int s = 0; do{ s += i; }while(i++ < n); r ...

  7. 一些Android程序的反逆向方法

    1.检测调试器 在代码中检测调试器的动态调试 首先在AndroidMainfest.xml文件中设置android:debuggable="false",让程序不可调试.这样别人想 ...

  8. [Android Security] Smali和逆向分析

    copy : https://blog.csdn.net/u012573920/article/details/44034397 1.Smali简介 Smali是Dalvik的寄存器语言,它与Java ...

  9. 【逆向工具】逆向工具101editor使用-游戏快速通关

    [渡者游戏简介] 船夫小江将运送客人的,羊.狐狸.草等物品过河,如果留下动物被其它种类吃掉任务就失败了.你需要帮助他做出正确的顺序选择.Ferryman是一款根据经典谜题改编的解谜游戏. 一.查看文件 ...

随机推荐

  1. bat-windows系统激活

    激活命令 slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D slmgr -skms kms.03k.org slmgr -ato slmgr -dlv 激活异常处理方法 ...

  2. Vue的基础语法

    前言 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是, Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手, ...

  3. Navicat中查询mysql版本

    SELECT VERSION( ) FROM DUAL

  4. 模拟HashMap冲突

    最近看HashMap的源码,其中相同下标容易产生hash冲突,但是调试需要发生hash冲突,本文模拟hash冲突. hash冲突原理 HashMap冲突是key首先调用hash()方法: static ...

  5. MySQL原理

    MySQL基础: sql语句的执行过程: 连接器:登录连接sql数据库 分析器:分析解读sql语句,并检查是否符合SQL语法规则 优化器:对实现方式进行优化,比如在查询时决定使用哪个索引. 执行器:执 ...

  6. 'cross-env' 不是内部或外部命令

    yarn start yarn run v1.22.10$ cross-env APP_TYPE=site umi dev'cross-env' 不是内部或外部命令,也不是可运行的程序或批处理文件.e ...

  7. 适用于MES、WMS、ERP等管理系统的实体下拉框设计

    场景 该设计多适用于MES,ERP,WMS 等管理类型的项目. 在做管理类型项目的时候,前端经常会使用到下拉框,比如:设备,工厂等等.下拉组件中一般只需要他们的ID,Name属性,而这些数据都创建于其 ...

  8. 5-15 Virtual 虚拟机

    虚拟机基本使用 Virtualbox安装流程 RockyLinux VirtualBox清华大学个版本下载路径 https://mirrors.tuna.tsinghua.edu.cn/virtual ...

  9. Solution -「SDOI2011」拦截导弹

    Sol.   题目要求一个数对序列的二维最长下降子序列,我们称其为 Q.并求出每一个元素分别在可能的 Q 中出现了多少次.   直接 Dp,时间复杂度 \(O(n^2)\) 不行.考虑 CDQ 分治 ...

  10. Linux配置Oracle JAVA环境

    1.下载java jdk的安装包 #pwd /usr/local/src 2.解压二进制文件并设置软连接 # tar -xvf jdk-8u241-linux-x64.tar.gz # ln -sv ...