C/C++ Capstone 引擎原始碼編譯

2022-09-08 09:00:17

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;
}

預覽效果如下: