• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            QuickBMS通用解包器使用指南

            轉載自:http://www.81256.com/game-24905-1-1.html

            猛犸漢化組教學筆記
              
            第二篇:QuickBMS通用解包器使用指南
            作者:SMKB
            首發于猛犸論壇,如轉載請保留全部信息。
              
            重要聲明:本篇教學筆記的內容僅用于學習交流之目的,任何后續發生的和本篇教學筆記內容相關的商業利益行為均與猛犸論壇、猛犸漢化組及作者無關。
              
            前言
              
                  從本質上來說,QuickBMS只是一個通用解包器引擎,由Luigi Auriemma開發并維護,雖然QuickBMS簡單而高效,技術組也經常使用QuickBMS來解包游戲的資源文件,但任何技術都存在一個入門門檻,而本篇以及后續教學筆記就試圖為同學們拆除這個門檻。
              
                  那么,進入QuickBMS世界的門檻有多高呢?我將使用什么方法來拆除這個門檻呢?
              
            第一節 QuickBMS使用方法
                  
                QuickBMS的使用方法沒有任何難度,其步驟如下所示:
              
            1、使用鼠標左鍵雙擊運行quickbms.exe程序。
            2、選擇一個解包腳本。
            3、選擇一個游戲資源文件(包文件)。
            4、選擇一個輸出文件夾來存放解包出來的文件。
            5、觀察解包進度。
              
                  就這么幾個步驟,是不是很簡單???請同學們牢記,針對QuickBMS程序來說,無論在任何情況下,解包腳本、包文件和輸出文件夾都是必須的,讓我們來仔細的觀察一下這三個必須存在的東西:包文件已經由等待漢化的游戲提供出來了,輸出文件夾我們自己在硬盤上建立一個就行了,那解包腳本在哪里呢?答案是沒有。這也是我們為什么把QuickBMS稱為通用解包器引擎而不是通用解包器的原因,QuickBMS本身并不包含萬能的解包腳本(因為根本不存在什么萬能解包腳本),而是需要使用者自己針對特定的包文件結構編寫出特定的解包腳本,這就是所謂的QuickBMS技術門檻,對猛犸技術組來說,這個門檻的高度是零,技術組的真正門檻是分析和匯總各種各樣的包文件結構并最終整合,但對于同學們來說,在已知包文件結構的前提下,如何編寫出解包腳本是現階段必須跨過的門檻。
              
                在討論怎樣編寫解包腳本之前,先讓我們簡單了解一下QuickBMS程序的術語或適用范圍,如下所示:
              
            1、編程技術并不是必須的,但是會編程能夠讓你更好的理解解包腳本的邏輯性。
            2、解包過程并不需要知道全部的包文件格式,只要知道了文件名稱、數據偏移和文件大小就可以解包。
            3、解包腳本中的命令和變量名稱大小寫不敏感。
            4、任何32位數值都是有符號的(-2147483648到2147483647),因此QuickBMS不能處理大于2GB的文件,但是能夠在小于4GB的文件上進行查找,也就是說只能處理最大4GB的包文件和最大2GB的包內文件。
            5、被稱為常量的字符串(依賴于命令的上下文)可以處理成C語言中的字符串標記法,例如: "\x12\x34\\hello\"bye\0",這里的關鍵是C語言的轉義字符或轉義序列。
            6、支持由0x開頭的16進制數值,例如1234和0x4d2是相同的。
            7、任何大于8位的操作都要受控于全局大小序,默認是小序,否則需要使用Endian命令來指定。
            8、注釋能夠使用C語言的//和/* */,以及BMS語法#。
            9、QuickBMS中打開的每個文件都有一個關聯號,所有的命令都使用這個號碼來存取文件,默認為0。
            10、內存文件是臨時文件的一種特殊類型,駐留在內存中,其工作類似于普通文件。
            11、臨時文件可代替存儲在物理硬盤上的相同文件。
              
                  了解了這么多,那么我們該如何編寫解包腳本呢?其實所謂的解包腳本就是一個文本文件,其內容描述了特定包文件的邏輯結構關系,QuickBMS本身為我們提供了20種數據類型和40條命令,用來方便我們編寫解包腳本,這就像炒菜一樣,油鹽醬醋、蔬菜和肉類都放在那里了,你只要按照一定的順序依次下鍋,就會色香味俱全了。
              
                  下面的兩個小節就分別列出QuickBMS提供的數據類型和命令(截止于0.4.6a版本),同學們可以細細體會一番,而后續教學筆記將使用具體的游戲實例來講解這些數據類型和命令的使用方法以及如何分析出特定的包文件結構,這就是前言里面提到的拆除門檻的方法,必須要經過多個游戲實例的練習才能夠有所掌握,希望同學們能夠下定決心并堅持到底。
              
            第二節 QuickBMS的數據類型

            序號
            類型名稱
            類型描述
            1
            BYTE
            8位數值,00xff
            2
            SHORT
            16位數值,00xffff
            3
            THREEBYTE
            24位數值,00xffffff
            4
            LONG
            32位數值,00xffffffff
            5
            LONGLONG
            假的64位,所以數值是00xffffffff,但是卻讀取8個字節
            6
            STRING
            空結尾字符串(每個字符一個字節)
            7
            ASIZE
            特殊類型,用于返回打開文件的大小,僅用于GET命令
            8
            FILENAME
            特殊類型,用于返回打開文件的名稱,如:"myfile.zip",僅用于GET命令
            9
            BASENAME
            特殊類型,用于返回打開文件的基本名稱,如:"myfile",僅用于GET命令
            10
            EXTENSION
            特殊類型,用于返回打開文件的擴展名,如:"zip",僅用于GET命令
            11
            UNICODE
            特殊類型,用于統一碼utf16字符串,utf16的大小序與腳本里的Endian命令設置相同,也可用于轉換統一碼字符串到ascii,如:Set ASCII_STRING UNICODE UNICODE_STRING,很顯然這是假的utf16,所以僅對英文字符串有效
            12
            BINARY
            特殊類型,用于C語言中的二進制字符串標記法,如:"\xff\x00\x12\x34",主要用于常量
            13
            COMPRESSED
            特殊類型,用于設置大的字符串和內存文件僅使用少量的文本,要使用這個類型,你必須獲得原始文本或文件,使用zlib進行壓縮,然后使用base64對輸出文件進行編碼,例如:set MEMORY_FILE compressed eNrtwbEJACAMBMBecIfvnMUxPuEJAe0UHN81LLzrbYKwDOjI96IN1cLveRfAGqYu
            14
            LINE
            特殊類型,用于處理回車換行為界定符的字符串(所以任何字符串都要使用0x00、 0x0a0x0d結尾)
            15
            FULLNAME
            文件的完整路徑,實際上就是輸入文件的完整路徑
            16
            CURRENT_FOLDER
            啟動QuickBMS的路徑
            17
            BMS_FOLDER
            定位腳本的文件夾
            18
            OUTPUT_FOLDER
            輸出文件夾
            19
            INPUT_FOLDER
            輸入文件夾
            20
            ALLOC
            僅用于Set命令的特殊情況


            第三節 QuickBMS的命令

            序號
            命令及描述
            1
            quickbmsver VERSION
            檢查QuickBMS的當前版本是否可以支持解包腳本,這個命令很少使用。
            參數:VERSION QuickBMS的版本號
            2
            clog NAME OFFSET ZSIZE SIZE [FILENUM]
            提取文件并實時解壓,本操作不影響輸入文件的當前位置計數器,解壓算法由ComType命令指定,提取的文件內容能夠自動使用Encryption命令進行解密。
            參數:      NAME 輸出文件的名稱
                  OFFSET 定位文件在資源中的位置
                  ZSIZE 資源中壓縮的數據大小
                  SIZE 解壓后的文件大小
                  FILENUM 與資源關聯的文件號
            3
            findloc VAR TYPE STRING [FILENUM] [ERR_VALUE]
            從資源的當前位置查找首次出現的字符串或數值,這個命令通常用于未知資源格式或特殊文本文件,很少使用    
            參數:
                  VAR 存儲找到的位置
                  TYPE 能夠是字符串、統一碼或數值
                  STRING C語言的字符串標記法,依賴于TYPE參數
                  FILENUM與資源關聯的文件號
                  ERR_VALUE 如果沒有找到字符串,默認時FindLoc將終止解包腳本,但是若ERR_VALUE指定了值,那么這個值將被分配給VAR參數,從而不會終止解包腳本
            4
            for [VAR1] [OP] [VALUE] [COND] [VAR2]
            ...
            next [VAR]
            經典的帶有初始化、條件和步進的"for"循環。在任何時候可使用break指令中斷循環 (注意:break指令在多個for循環中并不直觀,因為某些情況下會產生問題),next用來界定循環,同時進行步進。實際步驟是:將VALUE賦值給VAR1 (或執行一個數學操作);執行循環直到VAR1大于VAR1的限定條件;執行fornext之間的全部操作;增量VAR1    
            參數:
                  VAR1 初始化變量
                  OP 操作符
                  VALUE 賦給初始化變量的值
                  COND 退出循環條件
                  VAR2 條件的第二部分
            5
            get VAR TYPE [FILENUM]
            從打開的文件讀取字符串或數值,這是經常使用的命令   
            參數:
                  VAR 存儲讀取數據的變量
                  TYPE 請查看前面解釋的類型描述
                  FILENUM 與資源關聯的文件號
            6
            getdstring VAR LENGTH [FILENUM]
            從文件或變量中讀取定長數據,用于指定長度的文件名或其它字符串    
            參數:
                  VAR 存儲讀取數據的變量
                  LENGTH 讀取的字節數
                  FILENUM 與資源關聯的文件號
            7
            goto OFFSET [FILENUM] [TYPE]
            轉到文件的絕對位置   
            參數:
                  OFFSET 到達的位置,如果是負數則從文件末尾向前推,能夠處理的范圍是(0 0xffffffff)
                  FILENUM 與資源關聯的文件號
                  TYPE SEEK_SET (默認),SEEK_CUR,SEEK_END
            8
            idstring [FILENUM] STRING
            如果文件當前位置處的簽名與提供的字符串不符則終止解包腳本。    
            參數:
                  FILENUM與資源關聯的文件號
                  STRING C語言的字符串標記法
            9
            log NAME OFFSET SIZE [FILENUM]
            提取文件,本操作不影響輸入文件的當前位置計數器,提取的文件內容能夠自動使用Encryption命令進行解密。    
            參數:
                  NAME 輸出文件名稱
                  OFFSET 定位文件在資源中的位置
                  SIZE 提取的數據大小
                  FILENUM 與資源關聯的文件號
            10
            math VAR1 OP VAR2
            執行兩個變量的數學操作,并將結果放置在第一個變量里,注意:為了兼容性考慮,全部的操作都默認使用有符號32位數值    
            參數:
                  VAR1 擔當輸入和輸出變量
                  OP + 相加
                     * 相乘
                     / 相除
                     - 相減
                     ^ 異或
                     & 
                     | 
                     % 取模
                     ! (0成為1,其他值成為0)
                     ~ 補碼(類似于異或0xffffffff)
                     < 左移
                     > 右移
                     l 左轉
                     r 右轉
                     s 字節交換
                     w 位交換
                     = VAR2賦值給VAR1
                     n 負數
                     a 絕對值
                     v 
                     p 乘方
                     x 對齊,例如:var1=1, var2=16, result=16
                                   var1=16, var2=16, result=16
                                   var1=17, var2=16, result=32
                     z 公共位交換:var1=0xab, var2=4, result=0xba
                                   var1=0xabcd, var2=4, result=0xdc
                                   var1=0xabcd, var2=8, result=0xcdab
                     OP的前面或后面添加u可以強制使用無符號操作
                  VAR2 其它的輸入變量
            11
            open FOLDER NAME [FILENUM] [EXISTS]
            打開文件以便進行讀取    
            參數:
                  FOLDER 文件夾名稱,FDDE表示NAME參數是輸入文件夾里要打開的文件的擴展名,FDSE將認為NAME參數就是輸入文件夾里要打開的文件名,"."表示當前輸出文件夾
                  NAME 請看上面解釋,NAME能夠是?,這樣QuickBMS將告之用戶插入文件并手動打開,若NAME"",將執行清空操作
                  FILENUM 與資源關聯的文件號
                  EXISTS 若文件不存在,此變量將設置為0,否則為1,若文件不存在,QuickBMS默認使用一個錯誤進行終止
            12
            savepos VAR [FILENUM]
            返回文件的當前位置    
            參數:
                  VAR 存儲位置的變量
                  FILENUM 與資源關聯的文件號
            13
            set VAR1 [TYPE] VAR2
            將常量或變量賦值給其它變量,也可以在賦值時改變類型    
            參數:
                  VAR1 輸出變量或內存文件
                  TYPE 沒什么作用
                  VAR2 等待賦值的變量或常量
            14
            do
            ...
            while VAR1 COND VAR2
            一個不經常使用的循環類型,在循環的末尾執行條件檢查,實際上很少使用。    
            參數:
                  VAR1 條件的第一部分
                  COND 條件
                  VAR2 條件的第二部分
            15
            string VAR1 OP VAR2
            相當于math命令的字符串形式    
            參數:
                  VAR1 輸入和輸出變量
                  OP = 直接復制,如果VAR2是數值,則作為原始字符串,例子:var2="0x44434241", result="ABCD"
                     + VAR2附加到VAR1的末尾
                     - 如果VAR2是正數,那么VAR1將從末尾截斷指定的字節數;如果VAR2是負數,那么VAR1將從開頭截斷指定的字節數,否則將從VAR1中移除全部的VAR2
                     ^ 使用VAR2異或VAR1(若較短則循環異或)
                     < VAR1的前面截斷VAR2指定的字符數量,var1="thisisastring",var2="4", result="isastring"
                     % 截斷頭尾字符
                     & var1="thisisastring", var2="isa", result="isastring"
                     | var1="thisisastring", var2="isa", result="string"
                     $
                     !
                     > var1="thisisastring", var2="4", result="thisisast";var1="thisisastring", var2="isa", result="this"
                     b 字節轉16進制數,var2="abc", result="616263"
                     B 字節轉16進制數,但VAR2是一個空結尾字符串
                     h 16進制數轉字節,var2="616263", result="abc"
                     e 基于Encryption命令的加密
                     E 基于Encryption命令的加密,但VAR2是一個空結尾字符串
                     c 基于ComType命令的壓縮
                     C基于ComType命令的壓縮,但VAR2是一個空結尾字符串
                     u var2="hello", result="HELLO"
                     l var2="HELLO", result="hello"
                     p
                     s
                     r 反轉字符串
                     R 替換字符
                  VAR2 第二個變量或字符串
            16
            cleanexit
            終止解包腳本
            17
            if VAR1 COND VAR2
            ...
            [elif VAR1 COND VAR2]
            ...
            [else]
            ...
            endif
            檢查條件并當條件滿足時執行必要的操作:
                - If 是第一個條件
                - Elif 是其它條件,能夠是多個
                - Else 沒有條件匹配時執行的操作,一般放在最后
                - EndIf 定界標記    
            參數:
                  VAR1 條件的第一部分
                  COND 可以是字符串和數值
                      < 小于
                      > 大于
                      != 不等
                      == 相等
                      >= 大于等于
                      <= 小于等于
                      & 字符串:VAR1包含VAR2;數值:與
                      ^ 字符串:等于;數值:異或
                      | 
                      % 取模
                      / 相除
                      << 左移
                      >> 右移
                      ! 取反
                      !! VAR2為非零值則為真
                      ~ 補碼
                  VAR2 條件的第二部分
            18
            getct VAR TYPE CHAR [FILENUM]
            讀取字符串直到CHAR表示的定界符    
            參數:
                  VAR 輸出變量
                  TYPE 忽略了
                  CHAR 8位數值的定界字符
                  FILENUM 與資源關聯的文件號
            19
            comtype ALGO [DICT]
            指定clog命令使用的壓縮算法    
            參數:
                  ALGO 各種壓縮算法名稱
                DICT 可選的字典或與算法相關的參數
            20
            reverselong VAR
            交換32位變量,例如:0x44332211交換為0x11223344    
            參數:
                  VAR 交換的變量
            21
            reverseshort VAR
            交換16位變量,例如:0x2211交換為0x1122    
            參數:
                  VAR 交換的變量
            22
            endian TYPE
            改變讀寫數據的全局大小序,默認為小序    
            參數:
                  TYPE 小序的0x11223344存儲為44 33 22 11;大序的0x11223344存儲為11 22 33 44
            23
            filexor SEQ 
            任何讀取操作(get, *log 等等)都將執行異或    
            參數:
                  SEQ 8位數值序列,可以是:如0x12或由空格分開的字節序列如"0x12 0x34 0x56"16進制字符串如"\x12\x34\x56";設置為0""將禁止異或
            24
            filerot SEQ 
            filexor命令類似,但執行的是求和操作,若SEQ0x01且文件包含"hello",則變成 "ifmmp"
            25
            strlen VAR1 VAR2
            計算VAR2的長度并存儲在VAR1    
            參數:
                  VAR1 存儲長度的變量
                  VAR2 需要計算長度的變量
            26
            getvarchr VAR1 VAR2 OFFSET [TYPE]
            定制字符串以便包含不同信息    
            參數:
                  VAR1 目的變量,包含讀取的元素
                  VAR2 想要獲取元素的變量或內存文件
                  OFFSET 指定VAR2中獲取元素的位置
                  TYPE 默認為字節
            27
            putvarchr VAR1 OFFSET VAR2 [TYPE]
            允許使用自定義規則執行寫入的復雜操作    
            參數:
                  VAR1 想要放置元素的變量或內存文件
                  OFFSET 在指定位置放置元素
                  VAR2 包含想要寫入的元素的變量
                  TYPE 默認為字節
            28
            debug
            用于調試
            29
            padding VAR [FILENUM]
            執行此命令將自動跳轉到對齊后的數據位置,如果文件使用4字節對齊,當前位置是0x39,那么在使用padding 4之后,其位置將自動變為0x3c    
            參數:
                  VAR 對齊大小
                  FILENUM 與資源關聯的文件號
            30
            append
            *log命令中使能附加模式,因此當輸出文件名已經存在時將不會覆蓋而是添加
            31
            encryption ALGO KEY [IVEC] [MODE] [KEYLEN]
            為文件的讀取操作設置一個解密算法,此命令僅工作于log clog命令。    
            參數:
                  ALGO 各種解密算法
                  KEY 類似于"\x11\x22\x33\x44"的鍵值
                  IVEC 用于增加解密算法的安全性
                  MODE 默認為0,表示解密,否則為1,表示加密
                  KEYLEN 強制鍵值的長度,主要是避免使用變量作為鍵值時出現問題(因為可能包含0
            32
            print MESSAGE
            打印字符串,若變量在兩個%字符之間則打印變量的值    
            參數:
                  MESSAGE 字符串
            33、34
            getarray VAR1 ARRAY VAR2
            putarray ARRAY VAR1 VAR2
            使用動態數組來存儲數據,類似于臨時區或堆棧
            35
            callfunction NAME [KEEP_VAR]
            startfunction NAME
            ...
            endfunction
            聲明一個函數,請牢記規則:若KEEP_VAR1,則函數結束時會保存變量的值,通常在解包腳本的后面放置函數    
            參數:
                  NAME 函數名稱
                  KEEP_VAR 0 = 遞歸函數(默認)                1 = 正常函數,會改變變量
            36
            scandir PATH NAME SIZE [FILTER]
            掃描文件,沒什么用處,可以忽略    
            參數:
                  PATH 必須是".",代表當前文件夾
                  NAME 接收文件名稱,可以是""
                  SIZE 接收文件大小,可以是-1
                  FILTER 過濾器,僅當指定-F參數時才有效
            37
            calldll DLLNAME FUNC/OFF CONV RET [ARG1] [ARG2] ... [ARGn]
            本命令允許使用QuickBMS內部的插件,可用于存儲在可執行文件或動態鏈接庫中的自定義解壓或解密函數    
            參數:
                  DLLNAME 動態鏈接庫或可執行文件名稱
                  FUNC/OFF 函數名稱或相對位置偏移,請牢記相對地址不是絕對地址,而是與基地址有關
                  CONV 函數調用慣例:stdcall,cdecl,fastcall,borlandwatcom,pascal,safecall,syscall,optlinkcarion,thiscall
                  RET 函數返回值,""表示沒有返回值
                  [ARGS] 函數的所有參數
            38、3940
            put VAR TYPE [FILENUM]
            putdstring VAR LENGTH [FILENUM]
            putct VAR TYPE CHAR [FILENUM]
            類似于get*命令,但執行的是寫入操作


            【第二篇 完結】
            猛犸漢化組教學筆記下一篇預告:【解包練習之磁力大冒險】

            本篇筆記用到的工具

            posted on 2014-04-20 02:36 楊粼波 閱讀(6029) 評論(0)  編輯 收藏 引用

            久久精品国产亚洲AV影院 | 国内精品伊人久久久久| 久久精品卫校国产小美女| 久久久久亚洲av综合波多野结衣| 亚洲国产精品无码久久久不卡| 99久久精品影院老鸭窝| 久久久久国产一区二区| 伊人久久大香线蕉亚洲五月天| 91久久成人免费| 亚洲AV无码成人网站久久精品大| 国产日韩久久免费影院 | 91精品国产综合久久精品| 久久精品国产精品亚洲| 久久久久亚洲AV无码麻豆| 久久亚洲天堂| 国产精品久久久天天影视香蕉| 狠狠色婷婷久久一区二区| 国产午夜精品理论片久久| 无码精品久久久久久人妻中字| 久久免费国产精品| 亚洲狠狠综合久久| 69SEX久久精品国产麻豆| 中文字幕久久波多野结衣av| 久久精品国产第一区二区| 91亚洲国产成人久久精品| 97久久天天综合色天天综合色hd| 久久91精品国产91久| 久久亚洲高清综合| 久久久久亚洲AV综合波多野结衣| 久久国产精品成人免费| 精品久久久无码人妻中文字幕豆芽| 午夜肉伦伦影院久久精品免费看国产一区二区三区| 国内精品久久久久影院一蜜桃| 精品国产乱码久久久久软件| 亚洲国产成人精品女人久久久| 久久se精品一区精品二区国产| 欧美日韩中文字幕久久伊人| 亚洲国产成人久久综合碰碰动漫3d | 色欲av伊人久久大香线蕉影院| 久久中文字幕视频、最近更新| 久久这里有精品视频|