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. Moriis神级遍历!

    Moriis 遍历 Morris 遍历是二叉树遍历的一种方式,传统的递归和非递归遍历的时间复杂的都是O(N),空间复杂度都是O(h)(h为树的高度),而 Morris 遍历可以做到时间复杂的依然为 O ...

  2. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第七版,体验GPGPU。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  3. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  4. 交警也觉得妙——Python 识别车牌

    车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下 车库门禁也会用到,基本上凡是需要对车辆进行身份检测的地方都会用到. 一些背景: 车牌 ...

  5. -bash: nignx: 未找到命令

    nignx -t 如果报错: 因为没有配置环境变量吧,把nginx路径 配置到环境变量里面就可以. 按照配置: 1:进入 vim /etc/profile 文件 在配置文件的最后面添加PATH(PAT ...

  6. 04 MySQL_数据相关的SQL

    字符编码问题: 如果使用Windows电脑SQL语句中写中文报错的话,通过以下指令解决 set names gbk; 判空NULL问题: 判值用=,判空用is xxx = 非空值; xxx is nu ...

  7. Solution -「二项式定理与组合恒等式」一些练习

    Task 1 \(\mathcal{Prob:}\) \((3x - 2y)^{18}\) 的展开式中, \(x^5y^{13}\) 的系数是什么?\(x^8y^9\) 的系数是什么? \(\math ...

  8. CSDN垃圾的没有底线!

    平时写代码,经常需要百度. 今天我输入搜索关键词"access sql字符串转日期"进行百度搜索: 然后点开第一条: 这个加粗的标题可以点的,再点开: 这个内容跟我的搜索关键词有什 ...

  9. 类型转换_str()函数与int()函数

    数据类型转换 需要将不同数据类型拼接在一起的时候就需要先进行数据类型转换 str+str//这里的+叫做连接字符,有点类似C++中的操作符重载,老对象里面的内容了 在python中整型和字符串类型不能 ...

  10. Vue 模板语法 && 数据绑定

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...