1. 程式人生 > >00002 貪婪洞窟.005:存檔修改器

00002 貪婪洞窟.005:存檔修改器



00002 貪婪洞窟.005:存檔修改器

個人精力有限,又急著進入下一個需要重點研究的遊戲《不思議迷宮》,因此,存檔修改器能夠修改的內容不會很多,有:鑽石、金幣、部分人物屬性、裝備和物品。

在上一篇中講解了如何解密存檔檔案,即sqlite資料庫檔案“CaveMaster.db”。本章的存檔修改器會跳過這一環節,直接基於解密後的資料庫檔案進行操作。

首先下載SQLite Database Browser,開啟解密後的“CaveMaster.db”(以下就直接簡稱為“CaveMaster2.db”),可以先觀察一番。我們發現它有很多表。為了將這些表展示給大家,我需要將它們匯出。切換到“Execute SQL

”,執行“SELECT * FROM sqlite_master where type='table'”:

然後,我就在選單上找找匯出、另存之類的選項,結果發現根本就不能匯出查詢結果,只能匯出某張表。sqlite_master是一張特殊的表,在SQLite Database Browser中並非直接可見。那就把查詢結果儲存到自定義的新表中吧。於是,執行“SELECT * INTO myTempTables FROM sqlite_master where type='table'”,然後,軟體就失去響應了。網上查了一下,才知道自己的無知,原來在sqlite中,是另一種語

INSERT INTO myTempTables SELECT * FROM sqlite_master where type='table'。然後,我又悲劇了,看到了錯誤提示:no such table: myTempTables。它不會自動建立表!——我當然可以手工建立,或者想辦法獲取的sqlite_master建立sql。不過我更想知道能否直接用一條sql語句搞定。於是我繼續查,終於:CREATE TABLE myTempTables AS SELECT * FROM sqlite_master wheretype='table'。執行,搞定,匯出表myTempTables
,貼上:

表名

cave_pay

table_root_table

sqlite_sequence

lamp_Task

equip_wear_dl

equip_wear_dl_temp

table_GameController

table_GameController_temp

table_Monsters

table_Achievement

table_Achievement_temp

equip_base2

equip_add2

equip_base2_temp

equip_add2_temp

equip_base8

equip_add8

equip_base8_temp

equip_add8_temp

equip_base1

equip_add1

equip_base1_temp

equip_add1_temp

equip_base4

equip_add4

equip_base4_temp

equip_add4_temp

equip_base3

equip_add3

equip_base3_temp

equip_add3_temp

equip_base7

equip_add7

equip_base7_temp

equip_add7_temp

equip_base6

equip_add6

equip_base6_temp

equip_add6_temp

equip_base5

equip_add5

equip_base5_temp

equip_add5_temp

item_base2

item_base2_temp

item_base8

item_base8_temp

item_base1

item_base1_temp

item_base4

item_base4_temp

item_base3

item_base3_temp

item_base6

item_base6_temp

item_base7

item_base7_temp

item_base5

item_base5_temp

item_choice

item_choice_temp

item_choice_dl

item_choice_dl_temp

equip_wear

equip_wear_temp

item_plus_temp

hero_plus

hero_plus_temp

hero_plus_dl

hero_plus_dl_temp

hero_attr

hero_attr_temp

hero_model

hero_attr_dl

hero_attr_dl_temp

hero_skill

hero_skill_dl

game_incave_status_temp

skill

skill_temp

skill_dl_temp

skill_dl

drama

drama_temp

levelReward

table_Task

table_Task_temp

table_treasure

camp_shop

map

tile_data

open_shadow

map_config

建表語句太長,此處就不貼上了。

好,那麼現在我們來找找,鑽石儲存在哪張表。倒不是不難找,根據表的名稱就可以排除很多張表,然後開啟剩下的幾個看看資料,就知道了。還有另外一種方法——還記得上一章中的函式嗎?裡面有一句:sub_8355FC只要跟蹤跟蹤,就能準確地知道COL_NAME_GEMS的值為"_gems",在表table_root_table中。通過同樣的方法,可以找出“金幣”所在的表和欄位名稱。人物屬性、裝備和物品,它們所對應的表都是一目瞭然的,唯一的問題是,裝備和物品為什麼有8個表?至於那些_temp表,可能是用來臨時儲存角色在地牢中的資訊的,當角色通關或者回城時,再更新到正式表中。說起這個,我想起還有一個_temp資料庫檔案,難道這個才是臨時儲存角色在地牢中的資訊的?管它呢,反正怎麼著都不影響存檔的修改。

準備工作到此就結束了。下面我們先作一下規劃。

修改器需要一個輸入框,或者一個檔案瀏覽按鈕,以讓使用者指定CaveMaster2.db的完整路徑。然後,還需要一個“讀取”或者“載入”按鈕,點選後就立即取得存檔內容。為了顯示和修改存檔內容,還需要一些輸入框,和“修改”按鈕。裝備和物品是列表,需要用列表框顯示,並且要能夠新增、修改、刪除列表項。最後,需要一個“儲存”按鈕,點選後就將當前的內容持久化到CaveMaster2.db

這項工作用VC做很合適。但我選擇了Swift,哈哈,就這麼任性。主要是因為我對Swift不熟,用它練練手。由於Swift的圖形化UI編輯讓人不爽,我就用一個列表框來顯示裝備和物品了。

開啟Xcode,新建Cocoa應用,脫脫拽拽搗鼓UIOutlet繫結,新增libsqlite3.tbdsqlite3橋接檔案,這些我就統統略過了。下面先給出Swift中操作sqlite3資料庫的簡易封裝類(功能太少,不忍直視,但已夠用):

publicclassMySQLite3: NSObject

{

privatevar db : COpaquePointer = nil

publicinit?(file:String)

{

super.init()

ifsqlite3_open(file,&self.db) != SQLITE_OK

{

returnnil

}

}

deinit

{

ifself.db != nil

{

sqlite3_close(db)

}

}

//執行無錯返回nil;否則返回錯誤資訊。好程式碼應當是自我說明的,此處卻有註釋,說明了作者——也就是我——的命名水平的低下

publicfuncexecute(sqlsSeparatedBySemicolon:String)->String?

{

let sqlsOfUtf8 = sqlsSeparatedBySemicolon.cStringUsingEncoding(NSStringEncoding.init(NSUTF8StringEncoding))

var error : UnsafeMutablePointer<CChar> = nil

ifsqlite3_exec(self.db, sqlsOfUtf8!, nil, nil, &error) == SQLITE_OK

{

returnnil

}

else

{

let errorString = String.fromCString(error)

sqlite3_free(error)

return errorString

}

}

publicfuncqueryScaler(sql:String)->(scaler:String?, error:String?)

{

let result = self.query(sql)

if result.recordset == nil

{

return (scaler:nil,error:result.error)

}

else

{

return (scaler:result.recordset!.rows[0][0],error:result.error)

}

}

publicfuncquery(sql:String)->(

recordset:(

columns:[String],

rows:[[String]])?,

error:String?)

{

let sqlOfUtf8 = sql.cStringUsingEncoding(NSStringEncoding.init(NSUTF8StringEncoding))

var recordset : UnsafeMutablePointer<UnsafeMutablePointer<CChar>> =nil

var recordsetRows : Int32 = 0;

var recordsetColumns : Int32 = 0;

var error : UnsafeMutablePointer<CChar> = nil

if (sqlite3_get_table(self.db, sqlOfUtf8!, &recordset, &recordsetRows, &recordsetColumns,&error) != SQLITE_OK) || (recordsetColumns < 1)

{

let errorString = String.fromCString(error)

sqlite3_free(error)

return (nil, errorString);

相關推薦

00002 貪婪洞窟.005存檔修改

 00002 貪婪洞窟.005:存檔修改器 個人精力有限,又急著進入下一個需要重點研究的遊戲《不思議迷宮》,因此,存檔修改器能夠修改的內容不會很多,有:鑽石、金幣、部分人物屬性、裝備和物品。 在上一篇中講解了如何解密存檔檔案,即sqlite資料庫檔

7-高級路由RIP計時修改

fff after oss all send outer png col 查看 一、實驗拓撲:Note:1、R1、R2、R3兩邊路由器計時器一般部署要相同,不然會發生網絡動蕩。2、RIP協議默認為版本1,查看方法:show ip protocal!二、命令部署:1、基本部署

利用python編寫遊戲修改!俗稱外掛!

最近比較懷舊,在玩一個比較老的PC遊戲。由於遊戲難度太高了,於是就打算自己寫一個修改器。 通過查閱資料,在 Windows 下的修改器主要需要用到四個函式:OpenProcess, CloseHandle, WriteProcessMemory, ReadProcessMemory。 這幾個

Eloquent 修改

感覺好長時間沒寫東西了,一方面主要是自己的角色發生了變化,每天要面對各種各樣的事情和突發事件,不能再有一個完整的長時間讓自己靜下來寫程式碼,或者寫文章。 另一方面現在公司技術棧不再停留在只有 Laravel + VUE 了,我們還有小程式、APP 等開發,所以我關注的東西也就多了。 接下來我還是會繼續持續

遊戲修改製作教程一鍵盤滑鼠模擬

本教程面向有C\C++基礎的人,最好還要懂一些Windows程式設計知識 程式碼一律用Visual Studio 2013編譯,如果你還在用VC6請趁早丟掉它... 寫這個教程只是為了讓玩家更好地體驗所愛的單機遊戲,順便學到些逆向知識,我不會用網路遊戲做示範,請自重 先從最

遊戲修改製作教程八D3D函式hook

教程面向有C\C++基礎的人,最好還要懂一些Windows程式設計知識 程式碼一律用Visual Studio 2013編譯,如果你還在用VC6請趁早丟掉它... 寫這個教程只是為了讓玩家更好地體驗所愛的單機遊戲,順便學到些逆向知識,我不會用網路遊戲做示範,請自重 (_(

遊戲修改製作教程三記憶體與Cheat Engine

本教程面向有C\C++基礎的人,最好還要懂一些Windows程式設計知識 程式碼一律用Visual Studio 2013編譯,如果你還在用VC6請趁早丟掉它... 寫這個教程只是為了讓玩家更好地體驗所愛的單機遊戲,順便學到些逆向知識,我不會用網路遊戲做示範,請自重 本章介

分針網——IT教育jquery選擇的用法

jQuery選擇器是jQuery庫的一大特色,用這些選擇器不但可以省去繁瑣的JavaScript 書寫方式,還可以節省時間和效率,正是有這些jQuery選擇器,才讓我們更容易的操作JavaScript的dom。 1. 基本選擇器 ·#id 根據

分針網——每日分享 jquery選擇的用法

提交 -c sce fse edi scrip 偶數 http n) jQuery選擇器是jQuery庫的一大特色,用這些選擇器不但可以省去繁瑣的JavaScript 書寫方式,還可以節省時間和效率,正是有這些jQuery選擇器,才讓我們更容易的操作JavaScript的

App開發模擬服務數據接口 - MockApi

comm roi getname 默認 error: textview 變種 nbsp 訪問 App開發:模擬服務器數據接口 - MockApi 為了方便app開發過程中,不受服務器接口的限制,便於客戶端功能的快速測試,可以在客戶端實現一個模擬服務器數據接口的Moc

爬蟲Scrapy5 - 選擇Selectors

服務器 更多 stars 文件中 alt nic data bar nts 當抓取網頁時,常見的任務是從HTML源碼中提取數據。現有的一些庫可以達到這個目的: BeautifulSoup lxml Scrapy 提取數據有自己的一套機制。它們被稱作選擇器(seletor

8.監控存檔服務

exchange skype forbusiness 持久聊天服務器部署註意事項:1.監控和存檔數據庫,不能使用中央管理存儲實例(RTC),必須單獨安裝SQL實例,此處的原因是方式存檔和監控數據太多導致中央管理存儲故障。2.監控功能所需的SQL後端數據庫必須支持sql代理功能(Express版本不

深入理解JVM垃圾收集與內存分配策略

四種 內存回收 第一次 不可達 append test 方法 static hot 堆裏面存放著Java世界差點兒全部的對象實例,垃圾收集器在對堆進行回收前。第一件事情就是要確定這些對象之中哪些還存活,哪些已經死去。推斷對象的生命周期是否結束有下面幾種方

零基礎讀懂視頻播放控制原理 ffplay 播放源代碼分析

5.4 編碼方式 是否播放 都對 enum 其中 mat 源碼 開始 https://www.qcloud.com/community/article/535574001486630869 視頻播放器原理其實大抵相同,都是對音視頻幀序列的控制。只是一些播放器在音視頻同步上可

只需要一點點C++基礎,新手也可以制作單機遊戲內存修改

獲取 qstring bsp tor 界面布局 而已 star word 綠色 聲明:本文只是為了初學C++的,能夠做出一些實用的東西,跳出管理系統的束縛,提升學習的興趣,在這裏選取了單機遊戲,請不要嘗試在線遊戲,違發而已未必可行。序:首先我們需要一個Qt+VS環境Qt從h

【FAQ系列】DB服務產生大量物理讀問題優化思路

服務器 通過 負責 為什麽 from cnblogs sha stat ron 一 【現象】 1、7點到9點IO監控指標util特別高,如下: 2 、查看讀寫情況:讀產生很高的物理IO,如下 【分析】:對比其他服務器,buffer pool都是80G,正常情況下熱點數

Android零基礎入門第57節日期選擇DatePicker和時間選擇TimePicker

oncreate ted show imageview bce min date 教程 運行程序 在實際開發中,經常會遇見一些時間選擇器、日期選擇器、數字選擇器等需求,那麽從本期開始來學習Android中常用選擇器,今天學習的是DatePicker和TimePicke

Android零基礎入門第58節數值選擇NumberPicker

bundle 介紹 ets ebe db4 是不是 列表 com lin 上一期學習了日期選擇器DatePicker和時間選擇器TimePicker,是不是感覺非常簡單,本期繼續來學習數值選擇器NumberPicker 。 一、NumberPicker概述

Https系列之三讓服務同時支持http、https,基於spring boot

signed 默認 gfs proc idl clas 兩種方法 .... gpg Https系列會在下面幾篇文章中分別作介紹: 一:https的簡單介紹及SSL證書的生成二:https的SSL證書在服務器端的部署,基於tomcat,spring boot三:讓服務器同時

mybatis批量更新兩種方式1.修改值全部一樣 2.修改每條記錄值不一樣

nic mis str link eba encoding type 配置 tails Mybatis批量更新數據 mybatis批量更新兩種方式:1.修改值全部一樣 2.修改每條記錄值不一樣 mybatis批量更新兩種方式: