首页
社区
课程
招聘
未解决 [求助]Capston汇编解析错误
发表于: 2020-1-7 14:45 3126

未解决 [求助]Capston汇编解析错误

2020-1-7 14:45
3126
MBR读取之后,利用引擎转汇编代码,但是分析发现是错误的,最后找了标准的MBR对比了结果,发现确实错误的:
发现解析机器码7C的时候,总与后面一起汇编了,导致出错:
编译器:vs15  x64,系统:win10 x64,Capstone也是用的64的dll与lib, 核心代码如下:
参数pAddr传入需要转换成汇编hex,后面是大小
void Capstone::ShowAssembly(const void* pAddr, int nLen)
{
	this->InitCapstone();
	// 接收OpCode大小 最大16保存机器指令			
	BYTE* pOpCode = (BYTE *)malloc(nLen * 16);
	memset(pOpCode, 0, (sizeof(BYTE) * 16 * nLen) );
	SIZE_T read = 0;			
	// 反汇编指定条数的语句
	// 用来读取指令位置内存的缓冲区信息
	cs_insn* ins = nullptr;

	// 读取指定长度的内存空间
	DWORD dwCount = 0;

	// 参数1:表示那个进程  参数2:表示进程地址,address startRead ,参数三:空间大小
	// ReadProcessMemory(NULL, pAddr, pOpCode, nLen * 16, &dwCount);
	
	memcpy(pOpCode, pAddr, nLen);

	int count = cs_disasm(Handle, (uint8_t*)pOpCode, nLen * 16, (uint64_t)pAddr, 0, &ins);

	for (int i = 0; i < count; ++i)
	{
		printf("%08X\t", ins[i].address);
		for (uint16_t j = 0; j < 16; ++j)
		{
			if (j < ins[i].size)
				printf("%02X", ins[i].bytes[j]);
			else
				printf(" ");
		}
		printf("\t");
		printf("%s  ", ins[i].mnemonic);
		cout << ins[i].op_str << endl;  
	}
	printf("\n");
	// 释放动态分配的空间
	delete[] pOpCode;
	cs_free(ins, count);
}
错误如下所示:
引擎的BUG还是代码编写的不规范?如何进行优化需要啃引擎的那些模块?大佬们

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 341
活跃值: (1005)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
mbr应该是16位的汇编吧。你这个解析的模式中有'eax和esp'是32位的汇编。
2020-1-7 14:57
0
雪    币: 1790
活跃值: (3766)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
楼上说对了。 你设置的是32位模式。
2020-1-7 14:59
0
雪    币: 6052
活跃值: (12569)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
4
这个问题我忽略了,是应该在实模式下做解析,如何引擎调整的?支持16bit吗?
2020-1-7 16:01
0
雪    币: 6052
活跃值: (12569)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
5
让编译器支持16呢还是需要引擎解析的时候用16汇编解析
2020-1-7 16:02
0
雪    币: 660
活跃值: (1465)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl
6
有一个结构体,是定义解析的是16位还是32位,或者64位的,看它CAPSTONE的示例代码
2020-1-7 16:27
0
雪    币: 6052
活跃值: (12569)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
7
lwl 有一个结构体,是定义解析的是16位还是32位,或者64位的,看它CAPSTONE的示例代码
能发一个链接吗?感谢
2020-1-7 17:37
0
雪    币: 6052
活跃值: (12569)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
8
结帖:以前用得反汇编引擎,有些代码只是用库,又了解一下然后去看了看.h找到了设置16bit得结构体,然后想了想这东西应该初始化能设置
// 注册堆空间管理组函数
cs_option(NULL, CS_OPT_MEM, (size_t)&OptMem);
// 打开一个句柄
cs_open(CS_ARCH_X86, CS_MODE_16, &Handle);
找到了cs_open,第二个参数CS_MODE_16,可以设置汇编模式,感谢上面朋友
2020-1-7 19:38
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我用过Capstone的可执行文件,有参数可以指定解析的平台和位数。
2020-5-30 20:37
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666
2020-5-30 22:45
0
游客
登录 | 注册 方可回帖
返回
//