C源码

#include <stdio.h>

int nums[5] = {1, 2, 3, 4, 5};

int for1(int n){	//普通for循环
int i = 0;
int s = 0;
for (i = 0; i < n; i++){
s += i * 2;
}
return s;
} int for2(int n){ //访问全局数组
int i = 0;
int s = 0;
for (i = 0; i < n; i++){
s += i * i + nums[n-1];
}
return s;
} int main(int argc, char* argv[]){
printf("for1:%d\n", for1(5));
printf("for2:%d\n", for2(5));
return 0;
}
android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm
LOCAL_MODULE := for
LOCAL_SRC_FILES := for.c
include $(BUILD_EXECUTABLE)

逆向代码+注释

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

    根据客户要求,每次视觉取像运行完毕后,按需保存OK或NG图像,图像分两种: 1.带视觉工具运行结果图像: 2.相机取像原图,.bmp格式. 保存图像代码如下: using System; using ...

  2. NC24017 [USACO 2016 Jan S]Angry Cows

    NC24017 [USACO 2016 Jan S]Angry Cows 题目 题目描述 Bessie the cow has designed what she thinks will be the ...

  3. 详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 这段时间有几个技术小伙伴问了我一个有意思的问题:"你的前端脚本是 ...

  4. 全国土壤阳离子交换量CEC空间分布数据

    数据下载链接:百度云下载链接​ 土壤阳离子交换量,简称CEC,是指土壤胶体所能吸附各种阳离子的总量.土壤阳离子交换量 cation exchange capacity 即CEC 是指土壤胶体所能吸附各 ...

  5. 深入剖析(JDK)ArrayQueue源码

    深入剖析(JDK)ArrayQueue源码 前言 在本篇文章当中主要给大家介绍一个比较简单的JDK为我们提供的容器ArrayQueue,这个容器主要是用数组实现的一个单向队列,整体的结构相对其他容器来 ...

  6. kube-shell安装

    1.开源项目kube-shell可以为kubectl提供自动的命令提示和补全,对于初学kubernetes比较友好. https://github.com/cloudnativelabs/kube-s ...

  7. 爬虫部署 Gerapy 安装(centos 8)演示

    一.安装 pip3 install -U gerapy 使用python3.68版本安装gerapy,报错提示:ModuleNotFoundError: No module named 'setupt ...

  8. 获取某个html元素相对于视窗的位置集合

    getBoundingClientRect() getBoundingClientRect()获取元素位置,这个方法没有参数 getBoundingClientRect()用于获得页面中某个元素的左, ...

  9. Vue 配置代理

    说明:这里的vue代理是指用vue静态服务器做代理.使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件). 版本: vue-cli 3.0以上 修 ...

  10. GIt后悔药:还原提交的操作(谨慎操作)

    一.背景: 偶尔会遇到git的版本分支的文件被误改的情况,需要还原,此篇文章可能会帮助到你. PS: 来理解下 Git 工作区.暂存区和版本库概念,可以更好的理解以下的还原操作. * 工作区:就是你在 ...