Android_Re

以前打比赛的时候就是我负责Android题目的,顺便上传一些工具,IDA7.0等

Android

工具链接:https://pan.baidu.com/s/1poQEL-RlQgqRLhnfzozbpw 密码:n6bp

1、Android

Android是基于liunx内核的,我们简单看一个hello world的执行过程

2、Android相关的语言

Java:开发安卓SDK的软件
smali:安卓的反汇编语言
c/c++:开发安卓NDK的软件,也就是包括so
Python:开发脚本插件,开发IDA脚本
C#:Unity3d游戏开发
Lua:重要的脚本插件或中间语言,在游戏中实用很多
JS:开发用于和服务器协议算法相关

3、ARM汇编基础知识

1、初识ARM

Intel8086是英特尔公司的16位处理器,ARM是ARM公司的32位处理器。每个处理器都对应自己的一套汇编语言,所以两个处理器分别对应于8086汇编和ARM汇编。由于处理器的位数,所以8086汇编指令的机器码是16位,而ARM汇编指令的机器码就是32位。机器码可以看作是二进制指令,其实所谓的HEX即称为十六进制操作码或十六进制机器码,也是二进制指令,只是把二进制的数值用十六进制去展示。,如果你会了ARM,就会了主流的嵌入式开发,然后就是硬件编程,然后就是机器人或机械制造。所以,ARM真的非常重要,希望可以去认真学习,不仅是ARM指令集,还有ARM的机器码的原理,以及ELF文件在linux下的objdump反编译。ARM机器码32位,我们以跳转指令BEQ指令为例讲解汇编指令的机器码。

31-28位,Cond
27-25位,101,B指令标识
25-24位,Link
23-0位,Offset,跳转处与当前指令差值

例:
00001BD0 BRQ loc_1C04
Cond:0000,表示EQ
101,B系列指令固定标识
L:0,表示不需要保存下一条指令
Offset:该值位0x1C04-0x1BD0=0000 0000 0000 0000 0000 1011
整体为:0000 1010 0000 0000 0000 0000 0000 1011
Cond B+Link Offset
0A 00 00 0B
再根据汇编倒序特点,显示为0B 00 00 0A

2、ARM与Thumb、Thunmb2指令

当我们把SO里的汇编语言放到工具中去转换为HEX时,会发现和IDA中的HEX有时是完全不同的,这是因为IDA中有时反编译SO使用的不是ARM,而是16位的ARM,也就是Thumb指令,但有时却是ARM的32位指令。其实对于指令集的判断应该看机器码,当机器码第5位statebit值位1为Thumb指令集,当为0时位ARM指令集。Thunmb2指令为32位,只有当15-13位为111,12-11位不为00的情况下才是。如同beq,bne这两个汇编指令,用ARM的4个HEX表示时,其实HEX的值位0A,1A,而当用2个HEX数表示时,其HEX值为D0,D1。有时候动态调试的时候需要手工IDA转为Thumb指令

3、ARM的寄存器

首先以标准ARM指令来看,有R0-R15个寄存器
R0-R7:通用寄存器
R8-R10:不通用寄存器
R15:程序计数器(PC),相当重要的一个寄存器,可以实现地址跳转,记的不是数,而是地址,直接关系着系统中断
R13:堆栈指针(SP)
R14:链接寄存器(LR)
R11:基址指针(FP)
R12:暂时寄存器(IP)
CPSR:状态寄存器

4、ARM的指令

CMP:比较
CMP R0,#0 (R0寄存器中的值与0比较 标志位z=0,表示相等,在动态调试中可以看到)

LDR: 从存储器中加载数据到寄存器 <–Load
LDR R0,[R9,#04] 将R9+0x04指向存储单元的值赋给R0

STR: 将寄存器的数据存储到存储器 –> Store
STR R0,[R9,#04] R0的值存储到R9+0x04指向存储单元

LDM: 将寄存器的数据加载到一个寄存器列表
LDM R0,{R1-R3} 将R0的数据依次加载到R1,R2,R3寄存器

SDM: 一个寄存器列表的数据存储到指定寄存器
SDM R0,{R1-R3}

PUSH: 将寄存器值压入堆栈中
POP: 将堆栈中的数据推出到寄存器

ADD,SUB,MUL,DIV 加减乘除

AND,ORR,EOR 与,或,异或

LSL 逻辑左移
LSR 逻辑右移

LSL R0,R1,#2 R0=R1*4

5、ARM寻址方式

1). 寄存器: MOV R1,R2 ; R2->R1
2). 立即数: SUBS R0,R1,#1; R0=R1-1
3). 寄存器移位:MOV R0,R2,LSL #3 ;R2左移三位->R0
4). 间接寻址: LDR R1,[R2] ; 装载R2指向的内存数值至R1
5). 基址寻址: LDR R2,[R3,#0x0F] ;R3+0x0F作为地址,将所

6、函数传参

一般从R0-R3,多于4个参数便会压入栈中

Liunx

由于Android是基于liunx内核的

1、什么是Liunx

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,诞生于1991年10月5日。

2、Liunx的特点

1、一切都是文件(就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件)。
2、Linux在内存管理优势:Windows是只在需要内存时,才为应用程序分配内存;Linux 无论物理内存有多大,都将其充份利用。
3、不需要整理磁盘碎片
4、每个软件都有确定的用途

3、Liunx文件

1、文件系统

1、普通文件:就是一般存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。
2、目录文件(directory):就是目录,第一个属性为 [d],例如 [drwxrwxrwx]。
3、连接文件(link):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。
4、设备与设备文件(device):系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:块设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]。字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
5、套接字(sockets):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。
6、管道(FIFO,pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]。[

2、文件结构

/:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。
根目录下一层一般有基础的15个目录:bin,boot,dev,etc,lib,media,mnt,opt,root,sbin,srv,tmp,usr,var

/etc:etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。
/var:这个目录的内容是经常变动的,看名字就知道,可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/ www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地。
/mnt:这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。可以参看/etc/fstab的定义
/usr/local:这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面、。

3、文件操作

cd-切换;
pwd-显示当前目录;
mkdir-新建一个新目录;
rmdir-删除一个空目录;
ls-查看文件目录;
cp-复制文件;
rm-删除文件;
mv-移动文件

4、Liunx常用命令及技巧

一。 通用命令:

  1. date :print or set the system date and time
      2. stty -a: 可以查看或者打印控制字符(Ctrl-C, Ctrl-D, Ctrl-Z等)
      3. passwd: print or set the system date and time (用passwd -h查看)
      4. logout, login: 登录shell的登录和注销命令
      5. pwd: print or set the system date and time
      6. more, less, head tail: 显示或部分显示文件内容.
      7. lp/lpstat/cancel, lpr/lpq/lprm: 打印文件.
      8. 更改文件权限: chmod u+x…
      9. 删除非空目录:rm -fr dir
      10.拷贝目录: cp -R dir
      11. fg jobid :可以将一个后台进程放到前台。
      Ctrl-z 可以将前台进程挂起(suspend), 然后可以用bg jobid 让其到后台运行。
      job & 可以直接让job直接在后台运行。
      12. kill 的作用: send a signal to a process. eg: kill -9 发送的是SIG_KILL信号。。。 具体发送什么信号 可以通过 man kill 查看。
      13. ps 的用法, ps -e 或 ps -o pid,ppid,session,tpgid, comm (其中session显示的sessionid, tpgid显示前台进程组id, comm显示命令名称。)
    二 .ubuntu常用命令:
  2. dpkg: package manager for Debian
       安装: dpkg -i package    卸载: dpkg -r package
       卸载并删除配置文件: dpkg -P |–purge package    如果安装一个包时。说依赖某些库。 可以先 apt-get install somelib…
       查看软件包安装内容 :dpkg -L package    查看文件由哪个软件包提供: dpkg -S filename
      * 另外 dpkg还有 dselect和aptitude 两个frontend.
  3. apt
       安装: apt-get install packs    apt-get update : 更新源
       apt-get upgrade: 升级系统。    apt-get dist-upgrade: 智能升级。安装新软件包,删除废弃的软件包
       apt-get -f install : -f == –fix broken 修复依赖    apt-get autoremove: 自动删除无用的软件
       apt-get remove packages :删除软件    apt-get remove package –purge 删除包并清除配置文件
       清除所以删除包的残余配置文件: dpkg -l |grep ^rc|awk ‘{print $2}’ |tr [“/n”] [“ “]|sudo xargs dpkg -P    安装软件时候包的临时存放目录 : /var/cache/apt/archives
       清除该目录: apt-get clean    清除该目录的旧版本的软件缓存: apt-get autoclean
       查询软件some的依赖包: apt-cache depends some    查询软件some被哪些包依赖: apt-get rdepends some
       搜索软件: apt-cache search name|regexp    查看软件包的作用:apt-cache show package
       查看一个软件的编译依赖库: apt-cache showsrc packagename|grep Build-Depends    下载软件的源代码 : apt-get source packagename (注: sources.list 中应该有 deb-src 源)
       安装软件包源码的同时, 安装其编译环境 :apt-get build-dep packagename (有deb-src源)    如何将本地光盘加入安装源列表: apt-cdrom add
  4. 系统命令:
       查看内核版本: uname -a    查看ubuntu 版本: cat /etc/issue
       查看网卡状态 : ethtool eth0    查看内存,cpu的信息: cat /proc/meminfo ; cat /proc/cpuinfo
      (/proc下面的有很多系统信息)
       打印文件系统空间使用情况: df -h    查看硬盘分区情况: fdisk -l
       产看文件大小: du -h filename;    查看目录大小: du -hs dirname ; du -h dirname是查看目录下所有文件的大小
       查看内存的使用: free -m|-g|-k    查看进程: ps -e 或ps -aux –>显示用户
       杀掉进程: kill pid    强制杀掉: killall -9 processname
  5. 网络相关:
       配置 ADSL: sudo pppoeconf    ADSL手工拨号: sudo pon dsl-provider
       激活 ADSL : sudo /etc/ppp/pppoe_on_boot    断开 ADSL: sudo poff
       根据IP查网卡地址: arping IP地址    产看本地网络信息(包括ip等): ifconfig | ifconfig eth0
       查看路由信息: netstat -r    关闭网卡: sudo ifconfig eth0 down
       启用网卡: sudo ifconfig eth0 up    添加一个服务: sudo update-rc.d 服务名 defaults 99
       删除一个服务: sudo update-rc.d 服务名 remove    临时重启一个服务: /etc/init.d/服务名 restart
       临时关闭一个服务: /etc/init.d/服务名 stop    临时启动一个服务: /etc/init.d/服务名 start
       控制台下显示中文: sudo apt-get install zhcon    查找某个文件: whereis filename 或 find 目录 -name 文件名
      *通过ssh传输文件
      scp -rp /path/filename username@remoteIP:/path #将本地文件拷贝到服务器上
      scp -rp username@remoteIP:/path/filename /path #将远程文件从服务器下载到本地
  6. 压缩:
      解压缩 a.tar.gz: tar zxvf a.tar.gz   解压缩 a.tar.bz2: tar jxvf a.tar.bz2
      压缩aaa bbb目录为xxx.tar.gz: tar zcvf xxx.tar.gz aaa bbb   压缩aaa bbb目录为xxx.tar.bz2: tar jcvf xxx.tar.bz2 aaa bbb[6]
  7. Nautilus:
      特殊 URI 地址
       computer:/// - 全部挂载的设备和网络    network:/// - 浏览可用的网络
       burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录    smb:/// - 可用的 windows/samba 网络资源
       x-nautilus-desktop:/// - 桌面项目和图标    file:/// - 本地文件
       trash:/// - 本地回收站目录    ftp:// - FTP 文件夹
       ssh:// - SSH 文件夹    fonts:/// - 字体文件夹,可将字体文件拖到此处以完成安装
       themes:/// - 系统主题文件夹    显示隐藏文件: Ctrl+h
       显示地址栏: Ctrl+l    查看已安装字体: 在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts[6]
    7.补充部分:
  • 查看本地所有的tpc,udp监听端口: netstat -tupln (t=tcp, u=udp, p=program, l=listen, n=numric)
       通过man搜说相关命令: man -k keyword . eg: man -k user    或者用 apropos
       统计文件所占用的实际磁盘空间: du (du - estimate file space usage)    统计文件中的字符,字节数: wc -c/-l/-w (wc - print the number of newlines, words, and bytes in files)
       查看文件的内容: od -x/-c/…. (od - dump files in octal and other formats)
      我认为od最有用的就是文件的字节流了: od -t x1 filename
      查看文件的 Ascii 码形式: od -t c filename (其中统计信息最左边的是: 字节数)   
    查找命令所在文件的位置: which od 输出: /usr/bin/od
      查看该文件由哪个包提供: dpkg -S /usr/bin/od 输出: coreutils: /usr/bin/od
      再查看coreutils包的全部内容就知道了linux的核心命令: dpkg -L coreutils
      然后 info coreutils 哈哈,认真学吧, 满世界都是命令!
       可以用man 命令产看某个命令的所有section 的解释: man -a tty
      然后用q,和next 转换到下一个section的解释   
    bash 的好用的快捷键:
      ctrl+a:光标移到行首。
      ctrl+b:光标左移一个字母
      ctrl+c:杀死当前进程。
      ctrl+d:退出当前 Shell。
      ctrl+e:光标移到行尾。
      ctrl+h:删除光标前一个字符,同 backspace 键相同。
      ctrl+k:清除光标后至行尾的内容。
      ctrl+l:清屏,相当于clear。
      ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history
      ctrl+u: 清除光标前至行首间的所有内容。
      ctrl+w: 移除光标前的一个单词
      ctrl+t: 交换光标位置前的两个字符
      ctrl+y: 粘贴或者恢复上次的删除
      ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符
      ctrl+f: 光标右移
      ctrl+z : 把当前进程转到后台运行,使用’ fg ‘命令恢复。比如top -d1 然后ctrl+z ,到后台,然后fg,重新恢复
       快速粘贴:先在一个地方选中文字,在欲粘贴的地方按鼠标 中键 即可。    等效中键:a 、按下滑轮等效于中键。b、同时按下鼠标 左右键,等效于中键。
       快速重启X服务: 同时按下: Alt + Ctrl + Backspace 三个键。    打开”运行”窗口: 同时按下 Alt + F2 键。
       戴屏: a、全屏:直接按下 PrtScr 键。
      b、当前窗口:同时按下 Alt + PrtScr 键。
      c、延时戴屏:在 终端 或 “运行”窗口中输入命令: gnome-screenshot –delay 3 ,将延时 3 秒后戴屏。   
    直接将 文件管理器 中的文件拖到 GNOME终端 中就可以在终端中得到完整的路径名。[6] 8.ulimit
      ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。
      ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)
      和可同时运行的最大进程数(max user processes)无效
      -a 列出所有当前资源极限
      -c 设置core文件的最大值.单位:blocks
      -d 设置一个进程的数据段的最大值.单位:kbytes
      -f Shell 创建文件的文件大小的最大值,单位:blocks
      -h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
      -l 可以锁住的物理内存的最大值
      -m 可以使用的常驻内存的最大值,单位:kbytes
      -n 每个进程可以同时打开的最大文件数
      -p 设置管道的最大值,单位为block,1block=512bytes
      -s 指定堆栈的最大值:单位:kbytes
      -S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
      -t 指定每个进程所使用的秒数,单位:seconds
      -u 可以运行的最大并发进程数
      -v Shell可使用的最大的虚拟内存,单位:kbytes
      eg: ulimit -c 1000(可以先通过ulimit -c 查看原来的值)
Donate
-------------本文结束感谢您的阅读-------------