彙編(一) -- 初識彙編

前言

最近準備學習彙編,而後在B站上看到叫iOS小賢的做者發的視頻挺不錯,打算跟着學,文章是看視頻的筆記,最後有原視頻連接,想看視頻的能夠看看經過連接查看視頻。sass

機器語言

  • 由0和1組成的機器指令.
  • 如: 0101 0001 1101 0110

**注:**機器指令最終轉換成電信號。安全

彙編語言(assembly language)

  • 使用符號代替機器語言,也稱爲符號語言
  • 如: mov ax,bx

高級語言

  • C\C++\Java\OC\Swift,更加接近人類的天然語言
  • 如:int a = b

咱們的代碼在終端設備上是這樣的過程:bash

2990730-42c0522b35289061.png

**注:**高級語言根據不一樣的平臺編譯成對應的彙編語言,彙編語言在編譯成機器語言,最終執行的是機器語言,axbx是寄存器,mov ax, bx是將ax寄存器的值放入bx中,mov ax, bx在CPU底層就是1000100111011000,在作逆向開發過程當中有個概念叫反彙編,安裝到手機上是加密或者加殼的機器語言,經過工具能夠砸殼,砸殼以後就能獲得機器語言,而後能夠反彙編成彙編語言(由於一條彙編指令和一條機器指令是一一對應的),可是彙編語言不能反編譯成高級語言,由於不一樣平臺下有不一樣的彙編指令,因此同一條C/OC語言會可能生成不一樣的彙編代碼,也有可能會生成一樣的彙編代碼。架構

高級語言是在彙編語言之上的,作了一層包裝,因此咱們看到的彙編語言有不少代碼是用來配置一些環境的,來支持高級語言的一些語法特性,好比面向對象的特性。iphone

  • 彙編語言與機器語言一一對應,每一條機器指令都有與之對應的彙編指令
  • 彙編語言能夠經過編譯獲得機器語言,機器語言能夠經過反彙編獲得彙編語言
  • 高級語言能夠經過編譯獲得彙編語言\ 機器語言,但彙編語言\機器語言幾乎不可能還原成高級語言

彙編語言的特色

  • 能夠直接訪問、控制各類硬件設備,好比存儲器、CPU等,能最大限度地發揮硬件的功能
  • 可以不受編譯器的限制,對生成的二進制代碼進行徹底的控制
  • 目標代碼簡短,佔用內存少,執行速度快
  • 彙編指令是機器指令的助記符,同機器指令一一對應。每一款型號的CPU都有本身的機器指令集\彙編指令集,因此彙編語言不具有可移植性
  • 知識點過多,開發者須要對CPU等硬件結構有所瞭解,不易於編寫、調試、維護
  • 不區分大小寫,好比mov和MOV是同樣的

**注:**彙編能夠直接訪問CPU,寄存器屬於CPU的,能夠最大限度發揮硬件的功能,並且不受編譯器的限制。好比用匯編寫一些病毒或者作安全相關的東西,爲何能作這些事情呢?由於用高級語言作一些開發的時候,有不少功能是受限制的,可是因爲彙編是直接訪問CPU的,由於操做系統也是指令集,操做系統能作的事情咱們也能作。「執行速度快」是相對高級語言,一條高級語言代碼生成的彙編語言可能會很是多,由於高級語言要搭一個環境,好比面向對象的語言特性,用不少彙編指令才能支撐,因此直接寫彙編語言「目標代碼簡短,佔用內存少,執行速度快」。再說一下「標代碼簡短,佔用內存少」,咱們所寫的代碼在執行的過程當中須要加載進內存,叫裝載的過程,高級語言可能你寫的代碼不多,但生成的彙編不少,因此佔用的內存就會大。並且高級語言最終轉變的二進制,由於要環境搭建,要繞不少彎,連接不少庫,比方說NSLog,須要連接不少系統的庫,因此最終生成的二進制有不少二進制的東西,因此最終轉成的機器碼比較大。ide

彙編的用途

  • 編寫驅動程序、操做系統(好比Linux內核的某些關鍵部分)
  • 對性能要求極高的程序或者代碼片斷,可與高級語言混合使用(內聯彙編)
  • 軟件安全
    • 病毒分析與防治
    • 逆向\加殼\脫殼\破解\外掛\免殺\加密解密\漏洞\黑客
  • 理解整個計算機系統的最佳起點和最有效途徑
  • 爲編寫高效代碼打下基礎
  • 弄清代碼的本質
  • 函數的本質到底是什麼?
    • sizeof
    • ++a + ++a + ++a 底層如何執行的?
    • 編譯器到底幫咱們幹了什麼?
    • DEBUG模式和RELEASE模式有什麼關鍵的地方被咱們忽略
    • ......

下面來新建一個項目Assembly001,而後在Debug中把Debug Workflow設置成Always Show Disassembly,這樣打了斷點會顯示反彙編代碼函數

Screen Shot 2019-08-03 at 6.49.55 PM.png

執行程序工具

Screen Shot 2019-08-03 at 6.56.50 PM.png

剛剛看到的是X86彙編,movl %eax, -0x14(%rbp)在LLDB中輸入memory read 0x10cc7f795能夠獲得這條指令所在的地址,這些都是16進制的,0x10cc7f798減去0x10cc7f795爲4,也就是在內存中佔有4個字節,32位。性能

0x10cc7f795: 89 45 ec e8 e9 02 00 00 8b 7d f8 48 8b 75 f0 48  .E.......}.H.u.H 
0x10cc7f7a5: 8b 0d cd 24 00 00 48 8b 15 be 24 00 00 89 7d e8  ...$..H...$...}.

複製代碼

輸入memory read 0x10cc7f79548 83 ec 30這4個字節就是subq $0x30, %rsp這個指令的意思。學習

0x10cc7f774: 48 83 ec 30 c7 45 fc 00 00 00 00 89 7d f8 48 89  H..0.E......}.H.
0x10cc7f784: 75 f0 bf 01 00 00 00 be 02 00 00 00 e8 bb ff ff  u...............
複製代碼

再輸入s挑戰到test

Screen Shot 2019-08-03 at 6.57.30 PM.png

彙編語言的種類

  • 目前討論比較多的彙編語言有

    • 8086彙編(8086處理器是16bit的CPU)
    • Win32彙編
    • Win64彙編
    • ARM彙編(嵌入式、Mac、iOS)
    • ......
  • 咱們iPhone裏面用到的是ARM彙編,可是不一樣的設備也有差別.因CPU的架構不一樣.

架構 設備
armv6 iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4
armv7s iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 iPhone6s, iphone6s plus, iPhone6, iPhone6 plus, iPhone5S, iPad Air, iPad mini2
  • 由於學習因此建議先從最爲經典的8086開始

    • 結構簡潔,容易理解
    • 指令簡單,便於記憶
    • 原理相通

    2990730-f24b481bdcb65228.png

**注:**手機安裝的App中有不少文件,Mach-O是可執行文件,可執行文件須要裝載進內存。本地圖片,bundle, nib文件不屬於執行文件,屬於數據,也須要加載進內存,只不過在使用的時候才加載,可是執行文件首先加載進內存。加載進內存後,CUP經過地址總線讀指令,讀到對應指令以後會經過控制總線控制終端設備的屏幕每一個像素點是RGBA,每一個值是0到255,255的二進制是1111 1111,8個二進制位,也就是一個字節,內存中最小單元是一個字節。

  • 硬件相關最爲重要是CPU/內存
  • 在彙編中,大部分指令都是和CPU與內存相關的

參考:

底層原理(反編譯)--初識彙編

相關文章
相關標籤/搜索