DMM游戏,PC端,11.28关服,有大佬知道如何获得资源列表吗
sqlite的key是 P97V23NO,不过他用的是 Community::CsharpSqlite ,感兴趣的话自己研究下实现来解密吧。
大佬,这个key怎么用
RivalArenaVS\RivalArenaVS_Data\StreamingAssets文件夹下找到
main_resource_info和resbuild_resource_info
这两个文件都是以SQLite开头,喂AI还是直接使用AssetStudio都打不开
那你就不能搜一下SQLite用什么打开?
他不是标准的SQLite,我上面说了他用的Community::CsharpSqlite
dnSpy 載點
https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-net-win64.zip
DMM遊戲安裝目錄下
使用dnSpy 開啟 Assembly-CSharp.dll (沒加殼可直接反編譯)
dnSpy反編譯Assembly-CSharp.dll - function code
function.rar (1.4 MB)
左上角Community.CsharpSqlite
點選Sqlite3 搜索 sqlite3_key
加密function可看到
看起來是SQLite資料庫加密
AES-256-CBC 加密
key = P97V23NO
iv = SQLite format 3\0
然後再來我就卡關了 : )
飄去繼續寫其他遊戲教學 (あやかしランブル)
hsxx大加油 : )
最近刚好在看灌篮高手
現在放棄的話 解包就結束了 : )
你可以直接调用他的运行库得到原始的sqlite
import clr # pip install pythonnet
clr.AddReference(r"F:\game\dmm\RivalArenaVS\RivalArenaVS_Data\Managed\Assembly-CSharp.dll")
from Community.CsharpSqlite import Sqlite3
status,db = Sqlite3.sqlite3_open(r'main_resource_info')
status = Sqlite3.sqlite3_key(db,"P97V23NO",8)
status = Sqlite3.sqlite3_rekey(db,"",0)
status,decrypted_db = Sqlite3.sqlite3_open(r'decrypted.db')
backup = Sqlite3.sqlite3_backup_init(decrypted_db, "main", db,"main")
Sqlite3.sqlite3_backup_step(backup,1)
rc = Sqlite3.sqlite3_backup_step(backup,backup.nPagecount)
Sqlite3.sqlite3_backup_finish(backup)
Sqlite3.sqlite3_close(decrypted_db)
Sqlite3.sqlite3_close(db)
被AI带到沟里去了,一直在本地部署数据库,完全不行,晚点再试试看 ![]()
使用Fiddler抓取遊戲資產清單
使用Fiddler抓取遊戲資產清單
使用EmEditor整理URL
得到遊戲資產清單
https://ravsbundle.sagames.net/DB/v021500_92_1_64/resbuild_resource_info (5785KB)
https://ravsbundle.sagames.net/DB/v021500_92_1_64/main_resource_info (3827KB)
分析遊戲資產清單 - SQLite數據庫
遊戲資產清單
resbuild_resource_info (5785KB)
main_resource_info (3827KB)
使用EmEditor查看HEX
檔頭 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33
ANCII SQLite format 3
SQLite 數據庫 (*.db)
使用DB Browser for SQLite 開啟數據庫
https://github.com/sqlitebrowser/sqlitebrowser/releases/download/v3.13.1/DB.Browser.for.SQLite-v3.13.1-win64.zip
無法開啟(file is not a database) 但可見File Header
表示內容paper被加密
需要先解密數據庫資料
解密SQLite數據庫
由 dewrfe53535 大提供的python腳本可將被加密的 SQLite 數據庫解密
確認DMM遊戲安裝目錄
C:\Users\Nazon\RivalArenaVS\RivalArenaVS_Data\Managed
確認 Assembly-CSharp.dll 所在路徑
C:\Users\Nazon\RivalArenaVS\RivalArenaVS_Data\Managed\Assembly-CSharp.dll
在桌面上建立工作目錄 D
C:\Users\Nazon\Desktop\D
D大 python 解密腳本複製另存為 py 文件
因為腳本是一對一生成需修改腳本內文
修改D大 python 解密腳本 另存為 db_decrypt.py
自動輸入檔頭開頭為 53 51 4C 69 的文件
解密腳本不變
解密後自動生成同文件名加上 .db
db_decrypt.py 放入目錄 D
C:\Users\Nazon\Desktop\D\db_decrypt.py
db_decrypt.bat 放入目錄 D
C:\Users\Nazon\Desktop\D\db_decrypt.bat
將要解密的數據庫放入目錄D
C:\Users\Nazon\Desktop\D\main_resource_info
C:\Users\Nazon\Desktop\D\resbuild_resource_info
運行db_decrypt.bat
自動運行db_decrypt.py
自動對main_resource_info生成main_resource_info.db
自動對resbuild_resource_info生成resbuild_resource_info.db
得到解密後遊戲資產清單
再將*.db文件拿去給下個python腳本使用
解密遊戲資產清單 - 批次下載遊戲數據AB包
開啟 main_resource_info.db 資料表 BUNDLE_INFO_MST (共4392筆資料)
開啟 resbuild_resource_info.db 資料表 BUNDLE_INFO_MST (共4352筆資料)
使用python腳本批次下載遊戲數據AB包
由前面Fiddler分析可得前綴網址
運行db2url.bat
自動運行db2url.py
自動生成 main_resource_info_url.txt (共4392筆資料)
自動生成 resbuild_resource_info_url.txt (共4352筆資料)
接下來拿去餵wget
pyhthon腳本
讀取 SQLite 3 資料庫檔案
讀取 main_resource_info.db
讀取 資料表 BUNDLE_INFO_MST 內 BUNDLE_NAME 每一行
加上前端 url https://ravsbundle.sagames.net/AssetBundle/subV021500_92_1_64/StandaloneWindows64/
逐行讀取 生成 main_resource_info_url.txt
讀取 resbuild_resource_info.db
讀取 資料表 BUNDLE_INFO_MST 內 BUNDLE_NAME 每一行
加上前端 url https://ravsbundle.sagames.net/AssetBundle/subV021500_92_1_64/StandaloneWindows64/
逐行讀取 生成 resbuild_resource_info_url.txt
遊戲資產清單下載比較
main_resource_info_url.txt (共4392筆資料)
resbuild_resource_info_url.txt (共4352筆資料)
dmm 熱更新fiddler分析清單 (共4360筆資料)
無聊做個實驗
單獨下載 main_resource_info_url.txt (實際下載文件數 4352)
單獨下載 resbuild_resource_info_url.txt (實際下載文件數 4352)
合併下載 main + resbuilid (實際下載文件數 4352)
單獨下載 dmm 熱更新 fiddler清單 (實際下載文件數 4358)
dmm 多了5個db數據庫 + subBundleHeaderFile 共6個文件
dmm 熱更新文件數 = 4358 - 6 =4352
結論 : SQLite 3數據庫下載數與Fiddler清單下載數一致
都是 4352個 (文件最後更新日期 : 2025.09.12)
接下來使用 AnimeStudio 開啟AB包抽出資源
使用AnimeStudio開啟AB包抽出資源
使用 AnimeStudio 開啟AB包抽出資源(AB包沒加密)
out-1 : TextAsset、Texture2D、AudoClip
out-2 : Sprite
遊戲資源沒有SPINE與LIVE2D
立繪圖和精靈圖一堆
接下來處理精靈圖
由Texturepacker生成的精靈圖(Sprite) - 拆分思路
texturepacker 生成的精靈圖(Sprite)
會看到一張大張合併後的圖檔 _tex.png
會看到每個精靈圖的(x,y) 座標檔 _uv.txt
一張精靈圖檔文件名對應一個 (x,y) 座標
可使用python腳本拆分精靈圖
依照精靈圖的(x,y) 座標
輸出每一張精靈圖
並還原圖檔文件名
由Texturepacker生成的精靈圖(Sprite) - python腳本拆分
運行sprite.bat
自動運行sprite.py
自動生成拆分後精靈圖
輸出於新目錄 sprite_out 內各子目錄內
精靈圖總張數 8598
後面還要對差分表情圖做合併的動作
pyton腳本
自動遞迴搜尋所有子目錄下所有文件檔名中有 _tex 的 png 圖檔
自動遞迴搜尋所有子目錄下所有檔名中有 _uv 的 txt 文件
txt 文件為 (x,y) 座標檔
讀取同目錄下每一個座標檔
座標檔中有每一張 sprite 圖檔原始檔名與 (x,y) 座標
依照(x,y)座標檔 切割輸出 sprite 圖檔
依照(x,y)座標檔 輸出 sprite 圖檔對應檔名
在python腳本同目錄下
自動生成sprite_out目錄
複製來源端目錄結構於新目錄 sprite_out 內
輸出分離後的 sprite 圖檔放入 sprite_out 內各子目錄
差分表情圖合併輸出為每一張不同表情大圖思路
這原本是正在寫 あやかしランブル 那邊的教程想出來的方法
あやかしランブル 差分表情圖很多 慢慢比對中
這遊戲的差分表情圖和あやかしランブル有所不同
基底圖 (base) 沒有透明方形區域
只能完全手動定位
1.python腳本批次對特定表情圖檔生成紅色外框
2.photoshop手動將帶紅色外框表情圖檔貼到基底圖上
另存新檔 , 文件名帶有_merge
3.python腳本求出基底圖上面紅色外框 (x,y) 座標並生成座標文字檔
4.python腳本依照 (x,y) 座標檔 將每一張表情圖檔貼到基底圖上
額外輸出生成每一張帶有不同表情的大張圖檔
python腳本要分三部分處理
特定表情圖檔生成紅色外框 - python腳本
運行add_red_border.bat
自動運行add_red_border.py
自動對png檔名中有 talk_100_01 或 tips_100_01 圖檔加上1個像素紅色外框
python腳本
瀏覽所有子目錄底下 *.png 檔案
腳本只處理png檔名中有 talk_100_01 或 tips_100_01 圖檔
讀取png圖檔 width 與 height 的數值
然後將png圖檔增加1像素的紅色外框
紅色外框包圍整個png圖檔最外層1個像素
新的png圖檔 width 與 height 不會改變
新的png圖檔檔名加上_red_border
比如
i90400001_talk_100_01.png
改成
i90400001_talk_100_01_red_border.png
加上1像素的紅色外框
width 與 height 不改變
加紅框的圖檔為帶透明層PNG
比如
i90400012_tips_100_01.png
改成
i90400012_tips_100_01_red_border.png
加上1像素的紅色外框
width 與 height 不改變
加紅框的圖檔為帶透明層PNG
尋找檔名帶有_merge基底圖檔依照圖檔上面紅色外框生成 (x,y)座標文字檔 - python腳本
運行xy_positioning.bat
自動運行xy_positioning.py
自動尋找檔名帶有_merge基底圖檔
並依照圖檔上面紅色外框
找出(x,y) 座標並生成座標文字檔 _xy-coordinate.txt
python腳本
瀏覽所有子目錄底下 *.png 檔案
只處理檔名中有 merge 的png圖檔
png圖檔中內部圖像中有一個紅色外框
需要python腳本找出
這張png圖檔中內部的紅色外框4個頂點所在(x,y)座標
並生成txt文件
txt文件檔名為原png圖檔檔名加上_xy-coordinate
記錄錄(x,y)座標訊息
這個(x,y)座標訊息可以供後面python腳本讀取
如
讀取i90400001_talk_merge.png
生成(x , y)座標文字檔
i90400001_talk_xy-coordinate.txt
(x , y)座標文字檔內容如下
Image: i90400001_talk_merge.png
Width: 483, Height: 958
top_left: (127, 101)
top_right: (205, 101)
bottom_left: (127, 185)
bottom_right: (205, 185)
多張表情圖檔依照(x,y)座標文字檔與單張基底圖檔合併 - python腳本
運行facial_png_generator.bat
自動運行facial_png_generator.py
自動依照(x,y)座標文字檔將多張表情圖檔與單張基底圖檔合併
自動輸出生成每一張帶有不同表情的大張圖檔
自動放入merge_out 目錄內
python腳本
多張表情圖檔與單張基底圖檔合併
基底png圖檔挑選
使用檔名來過濾
檔名中沒有100_01
檔名中沒有100_02
檔名中沒有100_03
檔名中沒有200_01
檔名中沒有200_02
檔名中沒有200_03
檔名中沒有300_01
檔名中沒有300_02
檔名中沒有300_03
檔名中沒有400_01
檔名中沒有400_02
檔名中沒有400_03
檔名中沒有500_01
檔名中沒有500_02
檔名中沒有500_03
檔名中沒有600_01
檔名中沒有600_02
檔名中沒有600_03
檔名中沒有merge
檔名中沒有border
根據以上條件
這png圖檔當做基底圖檔
基底圖檔數量只有一張
表情png圖檔挑選
使用檔名來過濾
檔名中包含100_01
檔名中包含100_02
檔名中包含100_03
檔名中包含200_01
檔名中包含200_02
檔名中包含200_03
檔名中包含300_01
檔名中包含300_02
檔名中包含300_03
檔名中包含400_01
檔名中包含400_02
檔名中包含400_03
檔名中包含500_01
檔名中包含500_02
檔名中包含500_03
檔名中包含600_01
檔名中包含600_02
檔名中包含600_03
檔名中沒有merge
檔名中沒有border
這些png圖檔當做表情圖檔
讀取(x,y)座標文字檔
讀取檔名中有 xy-coordinate 字樣 txt 文件座標檔
比如 讀取座標檔內
top_left: (127, 101)
top_right: (205, 101)
bottom_left: (127, 185)
bottom_right: (205, 185)
以 top_left (x,y)座標為主
選擇基底png圖檔
選擇表情png圖檔
讀取(x,y)座標文字檔
依照(x,y)座標將表情png圖檔正確地貼在基底圖檔上面
生成新的輸出目錄 merge_out (merge_out 與 python腳本同在一個目錄下)
merge_out 內生成新的子目錄 (目錄名與基底圖檔所在目錄名相同)
輸出新png圖檔 (檔名與表情png圖檔相同)
新png圖檔放入 merge_out 內新子目錄內
比如
表情png圖檔為 i90400001_talk_100_01.png
基底png圖檔為 i90400001_talk.png
讀取(x,y)座標文字檔
讀取 i90400001_talk_xy-coordinate.txt
依照(x,y)座標將表情
i90400001_talk_100_01.png 與 i90400001_talk.png 合併
生成新的輸出目錄 merge_out
生成新的子目錄 i90400001_talk 放入merge_out 目錄內
生成新的 i90400001_talk_100_01.png 放入merge_out 目錄內的子目錄 i90400001_talk
依此類推
比如
表情png圖檔為 i90400009_tips_100_01.png
基底png圖檔為 i90400009_tips.png
讀取(x,y)座標文字檔
讀取 i90400009_talk_xy-coordinate.txt
i90400009_tips_100_01.png 與 i90400009_tips.png 合併
生成新的輸出目錄 merge_out
生成新的子目錄 i90400009_tips 放入merge_out 目錄內
生成新的 i90400009_tips_100_01.png 放入merge_out 目錄內的子目錄 i90400009_tips
依此類推
遊戲資源AB包與抽出資源懶人包載點詳情
遊戲資源AB包與抽出資源懶人包
ravsbundle.sagames.net_20251124.rar (14.15GB) (RAR密碼 : 1234)
Google Drive載點
Mega.nz載點
百度盤載點



































