C++編譯SQLite資料庫以及如何使用加密資料庫SQLCipher
最近在倒騰東西的時候無意中需要在PC端解密某社交工具的資料庫,移動裝置中的加密資料庫資訊,我們也都知道一般採用了免費的SQLCipher進行加密。所以我們想要寫個工具解密,需要解決基礎問題,PC上如何用C++進行資料庫操作和加解密操作。本文主要來介紹如何用VS2017工具以及C++操作SQLite資料庫以及怎麼使用加解密資料庫操作,這裡為什麼要選擇VS工具而不是VC,因為VC的確方便而且也是我之前一直編寫C++的工具,但是VC的確有很多不足的地方,比如最重要的是沒法弄64位的程式,網上說VC也是可以支援的但是需要安裝額外的資料包,我覺得太麻煩了所以選擇VS了,而這一次也直接體會到VS的強大,和AS相比,VS真的太厲害了。以後也都是我編寫C/C++必選之利器。
上面說那麼多下面就來進入本文正題吧,首先我們看看如何藉助VS編寫我們的第一行SQLite程式碼,我們的實現效果很簡單,只要新建資料庫,插入資料然後查詢出來就可以了。關於VS2017安裝就不多說了,網上都有教程,而且就是傻瓜式的下一步即可。安裝好之後我們去SQLite官網下載最新原始碼,主要包括sqlite3.c,sqlite3.h,sqlite3.def,然後我們新建一個dll工程:
這裡我們看到有三個專案型別是我們最常見的,第一個就是我們平常用到最多的工程就是DOS中執行的,入口是main函式,大學四年就是一直倒騰這個的,然後就是Windows下的動態庫檔案dll,這個有點類似於Linux下的共享檔案so,我們在編寫Android的NDK的時候都知道,可以利用dlopen和dlsym等系統函式,呼叫so中的函式功能,這個也是可以在程式碼中呼叫dll的函式。具體後面會詳細介紹。最後一個就是Windows下的靜態庫,這個類似於Java中的jar包,可以把某些功能打包成lib然後提供給其他專案使用。而dll和lib這兩個庫型別直接可以轉化的,後面會詳細介紹。
下面我們就利用sqlite的原始碼,製作動態庫sqlite.dll和靜態庫sqlite.lib,這個可以只新建一個工程,然後改一下配置就可以自動生成lib檔案了。新建dll檔案之後,把上面的sqlite3.h和sqlite3.c,sqlite3.def檔案拷貝到工程中,注意你的工程名字如果是sqlite3,那麼工程會預設生成一個sqlite3.cpp作為入口檔案,不過這都沒關係,我們刪除預設的檔案就可以了。然後我們需要設定一下取消預編譯頭資訊,不然報錯:
然後點選生成即可:
會在控制檯中看到生成dll檔案:
看到到這裡我們就很簡單的生成了我們想要的動態連結庫檔案了,然後我們可以切換成生成lib檔案:
然後在一次點選生成操作:
也是很方便就生成了lib檔案了。其實這裡還可以藉助VS安裝之後自帶的一些工具通過def檔案直接生成lib檔案,而def檔案之前已經有了用lib命令即可:lib /machine:x86 /def:sqlite3.def /out:sqlite3.lib
然後看看生成的檔案:
這裡還有一個比較常用的命令就是檢視dll檔案是32位還是64位的:dumpbin /headers sqlite3.dll
好了,到這裡我們就看到了如何藉助VS生成一個dll檔案和lib檔案。接下來我們就用我們生成的lib庫檔案呼叫看看是否成功,我們只要寫一個demo匯入sqlite3.lib檔案然後運算元據庫即可,這裡我們就新建一個控制檯程式,然後把我們生成的sqlite3.lib和sqlite3.h檔案拷貝到我們工程中:
以後一般用第三方庫都是這麼操作的,會有一個標頭檔案也就是函式的定義,然後就是靜態庫檔案,下面看看運算元據庫的程式碼:
這裡運算元據庫比較簡單了,就是開啟資料庫,然後執行sql語句,最後關閉資料庫,這裡也可以看到C/C++中使用回撥功能都是藉助函式指標來進行的。然後執行專案:
在控制檯看到執行結果:
好了到這裡我們就成功的學會了如何藉助VS中生成dll和lib庫檔案,然後在其他專案中呼叫。這裡全部都是用預設的32位操作的,可以切換成64位來操作。
上面就介紹了SQLite資料庫的操作流程,接下來我們還繼續介紹基於這個知識來看看加密資料庫SQLCipher專案的使用,這個也是我們最終的目標。我們就來看看把資料庫加密即可,這個我們也可以自己去官網去下載SQLCipher下載原始碼自己編譯dll和lib檔案,但是我這裡沒有再去操作了,而是去網上下載了一個別人編譯好的dll和def檔案,這樣我們就可以使用之前說的那個lib命令生成對應的lib庫檔案了。這裡我們介紹兩種方式呼叫,一種是和上面一樣的方式直接呼叫靜態庫檔案lib,還有一個就是利用系統函式呼叫動態庫檔案dll,先來看看如何呼叫靜態庫檔案:
這個不用多說了,用法都很類似,主要需要設定資料庫密碼。然後執行看效果:
然後我們把密碼修改一下,在去運算元據庫:
我們把密碼改了一下發現提示運算元據庫失敗了。所以看到操作很簡單。下面繼續來看看如何呼叫dll檔案:
呼叫dll檔案很簡單,和Linux中使用系統函式dlopen和dlsym呼叫so中的函式一樣,這裡也是使用系統函式LoadLibrary和GetProcAddress來呼叫dll中函式功能,所以我們看到在呼叫之前必須知道dll中匯入函式的定義,不然也沒法操作的,這裡為了操作方便在給每個函式封裝了一下,當然這些函式還是需要提前宣告,這樣在main函式中呼叫沒有問題:
然後看看呼叫程式碼和呼叫結果:
看到操作也是成功的。所以到這裡我們就成功的呼叫了dll檔案。
本文主要介紹瞭如何用VS工具來操作SQLite資料庫,學習到的知識點大概如下:
第一、學會VS的簡單實用
第二、學會生成dll庫和lib庫檔案
第三、如何在專案中使用dll庫和lib庫檔案
第四、SQLite和SQLCipher的基本使用
Windows專案中主要包括編譯dll庫和lib庫,也看到這兩個庫的區別,dll庫是動態庫,是專案中編譯的時候把函式符號填充進去,執行的時候才被匯入進來執行。所以動態庫在使用的時候,肯定需要知道匯出的函式定義,類似於Android NDK中的共享庫so檔案。而靜態庫就是在編譯的時候把庫中的函式程式碼都匯入專案中瞭然後執行,類似於Java中的jar包功能。這兩個庫都有各自的用途,本文就是藉助這個例子來給大家演示效果。而且也看到這兩個庫可以直接轉換的,可以通過dll用命令生成def檔案,然後在用命令藉助def檔案生成lib庫檔案的。然後我們介紹了加密資料庫SQLCipher使用lib庫檔案和dll檔案,使用lib庫檔案很簡單,匯入標頭檔案,然後在匯入庫檔案即可。而是用dll庫檔案主要藉助系統的函式LoadLibrary和GetProcAddress進行操作。
嚴重說明
本文的目的只有一個就是學習逆向分析技巧,如果有人利用本文技術進行非法操作帶來的後果都是操作者自己承擔,和本文以及本文作者沒有任何關係,本文涉及到的程式碼專案可以去編碼美麗小密圈自取,長按下方二維碼加入小密圈一起學習探討技術
本文其實是為了後續文章做基礎的。後續我們會看看WX的資料庫檔案在PC端用工具如何解密,並且我們將一步一步介紹這個工具的開發流程和步驟,所以後面的知識會更多,敬請期待關注。
手機檢視文章不方便,可以網頁看
http://www.520monkey.com
《Android應用安全防護和逆向分析》
長按下面
相關文章
- Android資料儲存之SQLCipher資料庫加密AndroidSQL資料庫加密
- C++ 操作sqlite3資料庫C++SQLite資料庫
- sqlite 資料庫的資料字典SQLite資料庫
- Android 中使用 SQLite 資料庫AndroidSQLite資料庫
- SQLite資料庫中rowid使用SQLite資料庫
- sqlite 資料庫 支援的資料型別 以及常用的函式SQLite資料庫資料型別函式
- android sqlite資料庫 新增資料AndroidSQLite資料庫
- Sql Server資料庫資料匯入到SQLite資料庫中Server資料庫SQLite
- 【Java】操作Sqlite資料庫JavaSQLite資料庫
- 資料庫加密資料庫加密
- sqlite操作--- oracle資料庫中的資料導進sqliteSQLiteOracle資料庫
- 使用sqlite3 模組操作sqlite3資料庫SQLite資料庫
- IOS資料儲存之Sqlite資料庫iOSSQLite資料庫
- 如何在 SAP BTP Java 應用裡使用 SQLite 資料庫JavaSQLite資料庫
- Python操作SQLite資料庫PythonSQLite資料庫
- Python 操作 SQLite 資料庫PythonSQLite資料庫
- sqlite3資料庫操作SQLite資料庫
- [ 物聯網篇 ] 38 -嵌入式Sqlite資料庫加密SQLite資料庫加密
- 如何建立最簡單的 ABAP 資料庫表,以及編碼從資料庫表中讀取資料 (上)資料庫
- sqlite建立本地資料庫並插入資料SQLite資料庫
- 【Android】資料儲存(三) 資料庫(SQLite)Android資料庫SQLite
- SQLite資料庫管理器:SQLPro for SQLite for MacSQLite資料庫Mac
- ChiselStore:Rust編寫的Raft分散式SQLite資料庫RustRaft分散式SQLite資料庫
- 【資料庫資料恢復】SQL server資料庫被加密怎麼辦?如何恢復?資料庫資料恢復SQLServer加密
- 編譯資料庫失效物件指令碼編譯資料庫物件指令碼
- php sqlite 建立本地資料庫PHPSQLite資料庫
- Python連線SQLite資料庫PythonSQLite資料庫
- 用Julia 0.51操作sqlite資料庫SQLite資料庫
- sqlite 資料庫 相關知識SQLite資料庫
- C#訪問SQLite資料庫C#SQLite資料庫
- SQLPro for SQLite Mac(SQLite資料庫管理工具)SQLiteMac資料庫
- 高效操控SQLite資料庫,盡在SQLPro for SQLite for MacSQLite資料庫Mac
- oracle 資料庫加加密。Oracle資料庫加密
- [Sqlite] 嵌入式資料庫事務理解以及例項操作SQLite資料庫
- Android之怎麼使用SQLite資料庫(增、刪、改、查、分頁等)以及ListView顯示資料AndroidSQLite資料庫View
- 資料庫–如何連線RDS例項,使用雲資料庫?資料庫
- 如何為資料庫選擇最佳加密方法資料庫加密
- Python中內建資料庫!SQLite使用指南! ⛵Python資料庫SQLite