1.APK文件

 apk=android Application PacKage=APKapk文件是什么:是安卓app的安装文件本质:(apk文件其实就是个)zip压缩包  意味着可以用解压缩工具把apk当做zip文件一样去解压解压后,得到一堆安卓相关文件可以在apktool等工具破解和修改了安卓文件后,再重新用压缩文件工具或apktool等工具,重新打包为apk文件

2.apk内容结构

3.什么是dex文件

简答:dex = Dalvik EXecutable format=dex文件=dex格式dex之于Android,类似于class之于Java注:java的class文件内部是Java的字节码(Java bytecode)dex=Dalvik EXecutable
相关:dex文件=dex字节码dex反汇编后是:Smali代码即:Android(虚拟机中的dex文件)反汇编(后的)代码:Smali

详解:

安卓系统中,用Dalvik/ART虚拟机(DVM=Dalvik Virtual Machine)去把java源码编译为dex可执行文件(Dalvik Executable)。而dex文件中保存的就是:编译后了的安卓程序代码文件

4.安卓虚拟机

1.历史背景

     Android代码语言:JavaJava的虚拟机是:JVMAndroid:出于性能考虑,没用JVM,用了自己的虚拟机VM安卓虚拟机=Android虚拟机=Android VM旧:Android < 5.0:DalvikDalvik VM=DVM概述Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事新:Android >= 5.0:ARTART=Android RunTimeART的特点:预先编译AOT垃圾回收方面的优化开发和调试方面的优化支持采样分析器支持更多调试功能优化了异常和崩溃报告中的诊断详细信息

5.smali 语法

Smali1.是什么:⼀种 汇编语法 / 汇编⽂件⼀种语法: Smali语法来源:是 Dalvik 的 VM 的字节码,即 dex ⽂件中的 bytecode = ⼆进制数据 ,反汇编后得到的:Smali代码语法:⼀种宽松式的Jasmin/dedexer语法它实现了 .dex 格式所有功能(注解,调试信息,线路信息等)对应⽂件叫: Smali⽂件2.举例java源码:int x = 42Dalvik编译后的,dex中二进制数据=bytecode=字节码:13 00 2A 00二进制,人类很难读懂用工具反汇编后的,smali代码:const/16 v0, 42 smali代码,人类基本可读3.学习Smali的用途分析Apk:静态分析需要动态分析,涉及Smali修改APK逻辑:修改smali 代码,重新编译打包APKAndroid逆向基础:掌握Smail能阅读 smali 代码对进行 android 逆向十分重要4.Smali基本语法

5.1数据类型 Types

5.2寄存器

Java中变量都是存放在内存中的Android为了提高性能,变量都是存放在寄存器中的寄存器为32位,可以支持任何类型
寄存器类型本地寄存器用v开头数字结尾的符号来表示:v0, v1, v2参数寄存器用p开头数字结尾的符号来表示:p0,p1,p2
注意在非static方法中,p0代指this,p1为方法的第一个参数在static方法中,p0为方法的第一个参数
说明指定有多少寄存器是可用.registers:指定了方法中寄存器的总数.locals: 表明了方法中非参寄存器的总数,出现在方法中的第一行

5.3 Smali代码示例

const/4 v0, 0x1 //把值0x1存到v0本地寄存器
iput-boolean v0,p0,Lcom/aaa;->IsRegisterd:Z //把v0中的值赋给com.aaa.IsRegistered,p0代表this,相当于this.Isregistered=true

5.3.1

成员变量

     格式.field public/private [static][final] varName:<类型>指令获取指令iget, sget, iget-boolean, sget-boolean, iget-object, sget-object操作指令iput, sput, iput-boolean, sput-boolean, iput-object, sput-objectarray的操作是aget和aput
Smali代码示例
     sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;获取ID这个String类型的成员变量并放到v0这个寄存器中iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;iget-object比sget-object多一个参数p0,这个参数代表变量所在类的实例。这里p0就是thisconst/4 v3, 0x0  sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;相当于JAVA代码this.timer = null;.local v0, args:Landroid/os/Message;const/4 v1, 0x12iput v1,v0,Landroid/os/Message;->what:I相当于java代码args.what = 18;其中args为Message的实例

方法/函数 Methods

 函数定义格式.method public/private [static][final] methodName()<类型>.end method函数类型  direct method= private方法virtual method = 其余的方法函数调用格式invoke-指令类型 {参数1, 参数2,...}, L类名;->方法名包含invoke-directinvoke-virtualinvoke-staticinvoke-superinvoke-interface
smali代码示例
.method private ifRegistered()Z
.locals 2            // 本地寄存器的个数
.prologue
const/4 v0, 0x1      //v0赋值为1
if-eqz v0, :cond_0   //判断v0是否等于0,等于0则跳到cond_0执行
const/4 v1, 0x1      //符合条件分支
:goto_0              //标签
return v1            //返回v1的值
:cond_0              //标签
const/4 v1, 0x0      //cond_0分支
goto :goto_0         //跳到goto_0执行
.end methodconst-string v0, "NDKLIB"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V相当于java代码System.loadLibrary("NDKLIB")const-string v0, "Eric"
invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2表示将方法t返回的String对象保存到v2中

作业:解释下每行语句 可以百度查询

视频教程:点我跳转

《0基础学安卓逆向》第2集:初始apk文件和smali语法相关推荐

  1. 猿人学安卓逆向对抗比赛(1-5题)

    猿人学安卓逆向对抗比赛(1-5题) 题目大纲 第一题:java层加密 第二题:so层加密 第三题:so层加密带混淆 第四题:grpc 第五题:双向认证 题目大纲 题号 题目 一 java层加密 二 s ...

  2. 0基础学编程需要哪些基础?

    程序员薪酬高.工作环境好,是很多同学向往的职业,让很多非计算机专业的同学羡慕不已.非计算机专业难道就不能成为程序员了吗? 01 学编程需要什么基础? 1.数学基础 从计算机发展和应用的历史来看计算机的 ...

  3. 教你怎么0基础学编程

    大家好,我是爱学习的老实人,学习使我快乐,赚钱使我兴奋. 在日常使用智能工具的时候,如果碰到一个非常好用的软件或者APP,不知道你有没有思考过这么好用的程序是怎么做出来的? 我劝你最好不要思考这个问题 ...

  4. 【0基础学爬虫】爬虫基础之抓包工具的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  5. 80后0基础学python-初次接触-记录202006

    80后0基础学python-初次接触-记录202006 背景: 80后,工作多年,心里也时常会有想创业的想法,也有一些相对靠谱的idear.但这个想法可以说是跨行业又跨专业,本人是建筑类工程师工作,除 ...

  6. 0基础学怎么学习python

    ​ Python相对于其他编程语言来说是比较简单的,非常适合零基础的小白学习,想要进入到互联网行业,可以优先选择学习Python,那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? ​ ...

  7. 0基础学python难吗-0基础学武汉Python开发课程有多难?该怎么入门?

    Python语言可谓十分强大,正如它的两个外号所称,一个是"内置电池",另一个是"胶水语言".开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其 ...

  8. 0基础学python-0基础学python 全套教程送你参考

    我0基础学Python可以吗? 我赞成把Python作为入门语言: 为什么选择python Python可以说是编程语言中罕见的既简单又强大的一门语言,python语言简洁,语言优雅,功能强大,使用p ...

  9. 0基础学python难吗-0基础学Python有多难?该怎么入门?

    0基础学Python有多难?该怎么入门?零基础学Python并不难,因为Python是一门非常适合初学者入门的编程语言.Python语法简单明了,代码可读性很高,容易入门.但Python对代码的要求非 ...

最新文章

  1. python官网 中文版 新闻-用python看新闻
  2. Unity3D专访——真正的面试
  3. 【网络知识】2. 路由、网关(下一跳)、子网掩码之间的关系
  4. Web前端知识技能大汇总
  5. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8700系列电磁流量计和传感器的几种类型!...
  6. [机器视觉] SIFT特征-尺度不变特征理解
  7. 苹果屏蔽更新_iOS 屏蔽更新的最新方法,完美支持 iOS13 系统
  8. 解读Go语言的2021:稳定为王
  9. 22讲MySQL有哪些“饮鸩止渴”提高性能的方法
  10. 几个免费好用的IP查询接口
  11. 基于SVM算法的男女生分类器
  12. 面包板入门电子制作 学习笔记6
  13. PyQt5+Python+Excel链家二手房信息爬取、可视化以及数据存取
  14. 天翼云服务器安装宝塔面板
  15. Codeforces Round #715 (Div. 2) A. Average Height
  16. 计算机等级考试一级在线模拟,全国计算机等级考试一级模拟试题1
  17. 日志搜集、过滤及推送处理框架logstash及fluentd总结
  18. 经典中国黑客站点推荐
  19. 职场新手必备的5款办公软件,特别是第五个百试百用
  20. CSDN博客的第一天

热门文章

  1. UI面试中让我们跌倒的专业问题完
  2. 当FETA40i-C遇上智能驾考,考官不跟车照样“盯”着你
  3. git切换分支及关联远程仓git常用命令。
  4. 利用python+百度智能云为人物头像动漫化(附API代码及SDK代码)
  5. 进口奶粉批发进货渠道
  6. 抽奖的计算方式php,php如何实现计算抽奖概率的算法实例分享
  7. 【web开发网页制作】Html+Css网页制作关于我的家乡(6页面)【附源码下载】
  8. 2022年Q3咖啡行业数据分析(咖啡行业市场未来发展趋势)
  9. 如何快速记住一张表?
  10. 我们分析了1亿条阅读量超高的标题,这就是为什么你会被标题党吸引