C++編譯SQLite資料庫以及如何使用加密資料庫SQLCipher

編碼美麗發表於2018-05-22
一、前言

最近在倒騰東西的時候無意中需要在PC端解密某社交工具的資料庫,移動裝置中的加密資料庫資訊,我們也都知道一般採用了免費的SQLCipher進行加密。所以我們想要寫個工具解密,需要解決基礎問題,PC上如何用C++進行資料庫操作和加解密操作。本文主要來介紹如何用VS2017工具以及C++操作SQLite資料庫以及怎麼使用加解密資料庫操作,這裡為什麼要選擇VS工具而不是VC,因為VC的確方便而且也是我之前一直編寫C++的工具,但是VC的確有很多不足的地方,比如最重要的是沒法弄64位的程式,網上說VC也是可以支援的但是需要安裝額外的資料包,我覺得太麻煩了所以選擇VS了,而這一次也直接體會到VS的強大,和AS相比,VS真的太厲害了。以後也都是我編寫C/C++必選之利器。


二、SQLite資料庫操作解析

上面說那麼多下面就來進入本文正題吧,首先我們看看如何藉助VS編寫我們的第一行SQLite程式碼,我們的實現效果很簡單,只要新建資料庫,插入資料然後查詢出來就可以了。關於VS2017安裝就不多說了,網上都有教程,而且就是傻瓜式的下一步即可。安裝好之後我們去SQLite官網下載最新原始碼,主要包括sqlite3.c,sqlite3.h,sqlite3.def,然後我們新建一個dll工程:

640?wx_fmt=png

這裡我們看到有三個專案型別是我們最常見的,第一個就是我們平常用到最多的工程就是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作為入口檔案,不過這都沒關係,我們刪除預設的檔案就可以了。然後我們需要設定一下取消預編譯頭資訊,不然報錯:

640?wx_fmt=png

然後點選生成即可:

640?wx_fmt=png

會在控制檯中看到生成dll檔案:

640?wx_fmt=png

看到到這裡我們就很簡單的生成了我們想要的動態連結庫檔案了,然後我們可以切換成生成lib檔案:

640?wx_fmt=png

然後在一次點選生成操作:

640?wx_fmt=png

也是很方便就生成了lib檔案了。其實這裡還可以藉助VS安裝之後自帶的一些工具通過def檔案直接生成lib檔案,而def檔案之前已經有了用lib命令即可:lib /machine:x86 /def:sqlite3.def /out:sqlite3.lib

640?wx_fmt=png

然後看看生成的檔案:

640?wx_fmt=png

這裡還有一個比較常用的命令就是檢視dll檔案是32位還是64位的:dumpbin /headers sqlite3.dll

640?wx_fmt=png

好了,到這裡我們就看到了如何藉助VS生成一個dll檔案和lib檔案。接下來我們就用我們生成的lib庫檔案呼叫看看是否成功,我們只要寫一個demo匯入sqlite3.lib檔案然後運算元據庫即可,這裡我們就新建一個控制檯程式,然後把我們生成的sqlite3.lib和sqlite3.h檔案拷貝到我們工程中:

640?wx_fmt=png

以後一般用第三方庫都是這麼操作的,會有一個標頭檔案也就是函式的定義,然後就是靜態庫檔案,下面看看運算元據庫的程式碼:

640?wx_fmt=png

這裡運算元據庫比較簡單了,就是開啟資料庫,然後執行sql語句,最後關閉資料庫,這裡也可以看到C/C++中使用回撥功能都是藉助函式指標來進行的。然後執行專案:

640?wx_fmt=png

在控制檯看到執行結果:

640?wx_fmt=png好了到這裡我們就成功的學會了如何藉助VS中生成dll和lib庫檔案,然後在其他專案中呼叫。這裡全部都是用預設的32位操作的,可以切換成64位來操作。


三、SQLCipher操作解析

上面就介紹了SQLite資料庫的操作流程,接下來我們還繼續介紹基於這個知識來看看加密資料庫SQLCipher專案的使用,這個也是我們最終的目標。我們就來看看把資料庫加密即可,這個我們也可以自己去官網去下載SQLCipher下載原始碼自己編譯dll和lib檔案,但是我這裡沒有再去操作了,而是去網上下載了一個別人編譯好的dll和def檔案,這樣我們就可以使用之前說的那個lib命令生成對應的lib庫檔案了。這裡我們介紹兩種方式呼叫,一種是和上面一樣的方式直接呼叫靜態庫檔案lib,還有一個就是利用系統函式呼叫動態庫檔案dll,先來看看如何呼叫靜態庫檔案:640?wx_fmt=png

這個不用多說了,用法都很類似,主要需要設定資料庫密碼。然後執行看效果:

640?wx_fmt=png

然後我們把密碼修改一下,在去運算元據庫:

640?wx_fmt=png

我們把密碼改了一下發現提示運算元據庫失敗了。所以看到操作很簡單。下面繼續來看看如何呼叫dll檔案:

640?wx_fmt=png

呼叫dll檔案很簡單,和Linux中使用系統函式dlopen和dlsym呼叫so中的函式一樣,這裡也是使用系統函式LoadLibrary和GetProcAddress來呼叫dll中函式功能,所以我們看到在呼叫之前必須知道dll中匯入函式的定義,不然也沒法操作的,這裡為了操作方便在給每個函式封裝了一下,當然這些函式還是需要提前宣告,這樣在main函式中呼叫沒有問題:

640?wx_fmt=png

然後看看呼叫程式碼和呼叫結果:

640?wx_fmt=png

看到操作也是成功的。所以到這裡我們就成功的呼叫了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進行操作。


嚴重說明

本文的目的只有一個就是學習逆向分析技巧,如果有人利用本文技術進行非法操作帶來的後果都是操作者自己承擔,和本文以及本文作者沒有任何關係,本文涉及到的程式碼專案可以去編碼美麗小密圈自取,長按下方二維碼加入小密圈一起學習探討技術

640?wx_fmt=png


五、總結

本文其實是為了後續文章做基礎的。後續我們會看看WX的資料庫檔案在PC端用工具如何解密,並且我們將一步一步介紹這個工具的開發流程和步驟,所以後面的知識會更多,敬請期待關注。


手機檢視文章不方便,可以網頁看

http://www.520monkey.com


《Android應用安全防護和逆向分析》 

 點選檢視圖書詳情

640?wx_fmt=jpeg

長按下面

相關文章