6. 軟體分析與遊戲修改 - Orange

由 林昱辰、高碩亨、彭彥瑋、潘昱嘉記錄

軟體與分析修改

outline:

  1. 逆向概論

  2. 遊戲修改

  3. 軟體分析

 

逆向工程:

在軟體沒有原始碼的狀況下,了解、分析一個執行檔,或嘗試進行修改。

用處:

  • 軟體除錯(程式不會照自己所想的跑,只會照所寫的跑)
  • 分析軟體安全性
  • 惡意程式分析
  • 程式二次開發(遊戲外掛)
  • 註冊碼破解

 

外掛:

自動化腳本

Ex : Sikuli、按鍵精靈

數值修改

 

軟體工程:人 --> 機器

逆向工程:機器 --> 人

 

人只能看懂高階語言

電腦只能看懂機器語言

C Language -> assembly Language -> Machine Code
 

機器語言                             組合語言                              

 

0804841d<main>:

804841d:      55                                           push  ebp

804841e:      89 e5                                      mov  ebp,esp

8048420:      83 e4 f0                                  and   esp,0xfffffff0

8048423:      83 ec 10                                  sub   esp,0x10

8048426:      c7  04 24 d0 84 04 08             mov DWORD   PTR  [esp], 0x80484d0

804842d:      e8 be fe ff ff                            call  80482f0<printf@plt>

8048432:      c9                                            leave

8048433:      c3                                            ret

 

編譯的過程:

C Language + Header

-->Pre-processor   = 一堆Code

--> Compiler           = Assembly Code

--> Assembler        = Object File

--> Linking               = Executable File

 

執行檔:

•Segments

 大分類,各個Segment下會有1~n個section

•Section

  • .TEXT Section #放實際代碼的地方

  • .DATA Section #放全域變數的地方(有初始)

  • .BSS  Section #放全域變數的地方(未初始)

  • .RODATA Section #放唯獨資料的地方(如寫死的字串)

 

assembly Language(x86)

 

    暫存器           Register

  • EAX                     #通常被當成函數回傳值

  • EBX                      #通常被當成base用

  • ECX                      #通常被當成counter記數用

  • EDX                      #通常被當成data用

  • ESI, EDI                #source, destination

  • ESP,EBP               #Stack堆疊相關

  • EIP                       #PC==當前執行處

 

C to ASM (PSEUDO CODE)

int count = 1+2;

mov eax , 1

mov ebx , 2

add eax , ebx

mov DWORD PTR [count] , eax

 

if ( count == 0 ) { do(); }

       mov eax, DWORD PTR [count]

       cmp eax, 0

       jne exit

       call do

exit:

      ret

 

執行程式

程式要執行時,程式本身會被放置(mapping)記憶體中

    之前所講到的各個section會被mapping到記憶體中不同的位置

    各個section會有不同的權限

  • .text可執行可讀不可寫

  • .data 可寫可讀不可執行

  • .rodata可讀不可寫不可執行

    作業系統會分配stack以及heap給程式使用

 

Stack  v.s. Heap

  • 大小位置寫死 v.s. 動態決定大小位置
  • 程式編譯時就必須決定變數的位置以及大小,所以無法動態分配

 

堆疊

•程式在執行時stack扮演重要的角色

  • 存放函數執行資訊

  • 存放函數所傳入之參數

  • 存放各個函數所使用之區域變數

  • ...

•Stack Frame

  • 各個函數有屬於自己的Frame

  • ex MAIN()呼叫A()則會有兩個Frame排再一起

 

 

 

 

分析程式

如何去分析一個執行檔?

  • 動態分析
  • 靜態分析

分析程式主要分為兩個部分

  • 程式區段
  • 記憶體區段

 

修改DEMO

遊戲修改:皮卡丘打排球

使用工具 : Cheat Engine

 

軟體修改:Sublime3

使用工具 : IDA Pro、OllyDbg

 

破解分兩種

  • 爆破:修改
  • 完美破解:找到漏洞

找到要改哪裡才是難處

如何找到要改哪裡?

  • 關鍵字串
  • 關鍵函數