Capstone 是一個輕量級的多平臺、多架構的反組合框架。Capstone 旨在成為安全社群中二進位制分析和反組合的終極反組合引擎。Capstone的編譯非常簡單隻需要一步即可輕鬆得到對應的Lib庫檔案,如下將介紹該引擎如何被編譯,以及簡單的測試編譯。
下載好以後直接開啟專案,切換到msvc
目錄下,該目錄下就是引擎的編譯入口,我們直接開啟capstone.slh
檔案,設定平臺工具集為編譯器的版本。
在右側選擇capstone_static
也就是編譯為靜態庫,然後直接編譯檔案。
編譯成功後直接將其中的capstone.lib
庫檔案拿出來,64位元也是如此操作。
編譯成功後會得到兩個檔案,直接新建lib目錄,將其放進去。
然後再將專案中的include
檔案一併拷貝到新建的目錄下。至此庫就編譯好了。
當需要在專案中使用該庫時,只需要簡單的引入到專案中。
接著新建一個專案,寫入如下一段測試程式碼,編譯執行即可實現對特定字串的反組合操作。
#include <stdio.h>
#include <inttypes.h>
#include <capstone/capstone.h>
#pragma comment(lib,"capstone32.lib")
int main(int argc, char *argv[])
{
char *buffer = "\x55\x8b\xec\x81\xec\x24\x03\x00\x00\x6a\x17\x90\x90\x90";
csh handle;
cs_insn *insn;
size_t count;
int size = 14;
printf("By: LyShark \n\n");
// 開啟控制程式碼
if (cs_open(CS_ARCH_X86, CS_MODE_32, &handle) != CS_ERR_OK)
{
return 0;
}
// 反組合程式碼,地址從0x1000開始,返回總條數
// https://www.cnblogs.com/lyshark
count = cs_disasm(handle, (unsigned char *)buffer, size, 0x1000, 0, &insn);
if (count > 0)
{
size_t index;
for (index = 0; index < count; index++)
{
for (int x = 0; x < insn[index].size; x++)
{
printf("機器碼: %d -> %02X \n", x, insn[index].bytes[x]);
}
printf("地址: 0x%"PRIx64" | 長度: %d 反組合: %s %s \n", insn[index].address, insn[index].size, insn[index].mnemonic, insn[index].op_str);
}
cs_free(insn, count);
}
else
{
printf("反組合返回長度為空 \n");
}
cs_close(&handle);
getchar();
return 0;
}
預覽效果如下: