C/C++ BeaEngine 反汇编引擎
反汇编引擎有很多,这个引擎没有Dll,是纯静态链接库,适合r3-r0环境,你可以将其编译为DLL文件,驱动强制注入到游戏进程中,让其快速反汇编,读取出反汇编代码并保存为txt文本,本地分析。
地址:https://github.com/BeaEngine/beaengine
BeaEngine 反汇编特定字符串
#include <stdio.h>
#include <Windows.h>
#define BEA_ENGINE_STATIC // 指明使用静态Lib库
#define BEA_USE_STDCALL // 指明使用stdcall调用约定
extern "C"
{
#include "G:/beaengine/x64/BeaEngine.h"
#pragma comment(lib, "G:/BeaEngine/x64/lib_static/BeaEngine.lib")
}
void DisassembleCode(char *start_offset, int size)
{
DISASM Disasm_Info;
int len;
char *end_offset = (char*)start_offset + size;
(void)memset(&Disasm_Info, 0, sizeof(DISASM));
Disasm_Info.EIP = (UInt64)start_offset;
Disasm_Info.Archi = 1;
Disasm_Info.Options = MasmSyntax;
while (!Disasm_Info.Error)
{
Disasm_Info.SecurityBlock = (UInt64)end_offset - Disasm_Info.EIP;
if (Disasm_Info.SecurityBlock <= 0)
break;
len = Disasm(&Disasm_Info);
switch (Disasm_Info.Error)
{
case OUT_OF_BLOCK:
break;
case UNKNOWN_OPCODE:
printf("%s \n", &Disasm_Info.CompleteInstr);
Disasm_Info.EIP += 1;
Disasm_Info.Error = 0;
break;
default:
printf("%s \n", &Disasm_Info.CompleteInstr);
Disasm_Info.EIP += len;
}
}
}
int main(int argc,char *argv)
{
char *buffer = "\x55\x8b\xec\x81\xec\x24\x03\x00\x00\x6a\x17";
DisassembleCode(buffer, 11);
BYTE bTest[] = { 0x68, 0x37, 0x31, 0x40, 0x00, 0xFF, 0x15, 0x0C, 0x20, 0x40 };
DisassembleCode(buffer, 14);
system("pause");
return 0;
}

反汇编字节数组
// 反汇编字节数组
void DisassembleCodeByte(BYTE *ptr,int len)
{
DISASM Disasm_Info;
char *end_offset = (char*)ptr + 10;
(void)memset(&Disasm_Info, 0, sizeof(DISASM));
Disasm_Info.EIP = (UInt64)ptr;
Disasm_Info.Archi = 1; // 1 = 表示反汇编32位 / 0 = 表示反汇编64位
Disasm_Info.Options = MasmSyntax; // 指定语法格式 MASM
while (!Disasm_Info.Error)
{
Disasm_Info.SecurityBlock = (UInt64)end_offset - Disasm_Info.EIP;
if (Disasm_Info.SecurityBlock <= 0)
break;
len = Disasm(&Disasm_Info);
switch (Disasm_Info.Error)
{
case OUT_OF_BLOCK:
break;
case UNKNOWN_OPCODE:
Disasm_Info.EIP += 1;
Disasm_Info.Error = 0;
break;
default:
printf("%s \n", &Disasm_Info.CompleteInstr);
Disasm_Info.EIP += len;
}
}
}
int main(int argc, char *argv)
{
BYTE bTest[] = { 0x55, 0x8b, 0xec, 0x81, 0xec, 0x24, 0x03, 0x00, 0x00, 0x6a, 0x17 };
DisassembleCodeByte(bTest,10);
system("pause");
return 0;
}
反汇编时,显示虚拟地址
void DisassembleCodeInstr(char *start_offset, char *end_offset, int virtual_address)
{
DISASM Disasm_Info;
int len;
(void)memset(&Disasm_Info, 0, sizeof(DISASM));
Disasm_Info.EIP = (UINT64)start_offset;
Disasm_Info.VirtualAddr = (UINT64)virtual_address;
Disasm_Info.Archi = 0;
Disasm_Info.Options = MasmSyntax;
while (!Disasm_Info.Error)
{
Disasm_Info.SecurityBlock = (UInt64)end_offset - Disasm_Info.EIP;
if (Disasm_Info.SecurityBlock <= 0)
break;
len = Disasm(&Disasm_Info);
switch (Disasm_Info.Error)
{
case OUT_OF_BLOCK:
break;
case UNKNOWN_OPCODE:
Disasm_Info.EIP += 1;
Disasm_Info.VirtualAddr += 1;
break;
default:
printf("%.16llx > %s\n", Disasm_Info.VirtualAddr,&Disasm_Info.CompleteInstr);
Disasm_Info.EIP += len;
Disasm_Info.VirtualAddr += len;
}
}
}
int main(int argc,char *argv)
{
/*
char *buffer = "\x55\x8b\xec\x81\xec\x24\x03\x00\x00\x6a\x17";
DisassembleCode(buffer, 11);
*/
void *pBuffer = malloc(200);
memcpy(pBuffer, main, 200);
DisassembleCodeInstr((char *)pBuffer, (char *)pBuffer + 200, 0x401000);
system("pause");
return 0;
}

检查EAX寄存器状态: 如何只检索修改寄存器eax的指令,也就是说,当我们的寄存器REG0零号,发生写入请求时,将自动获取到此处的汇编代码位置。
void DisassembleCodeInstr(char *start_offset, char *end_offset, int virtual_address)
{
DISASM Disasm_Info;
int len;
(void)memset(&Disasm_Info, 0, sizeof(DISASM));
Disasm_Info.EIP = (UINT64)start_offset;
Disasm_Info.VirtualAddr = (UINT64)virtual_address;
Disasm_Info.Archi = 0;
Disasm_Info.Options = MasmSyntax;
while (!Disasm_Info.Error)
{
Disasm_Info.SecurityBlock = (UInt64)end_offset - Disasm_Info.EIP;
if (Disasm_Info.SecurityBlock <= 0)
break;
len = Disasm(&Disasm_Info);
switch (Disasm_Info.Error)
{
case OUT_OF_BLOCK:
break;
case UNKNOWN_OPCODE:
Disasm_Info.EIP += 1;
Disasm_Info.VirtualAddr += 1;
break;
default:
if (
((Disasm_Info.Operand1.AccessMode == WRITE) && (Disasm_Info.Operand1.Registers.gpr & REG0)) ||
((Disasm_Info.Operand2.AccessMode == WRITE) && (Disasm_Info.Operand2.Registers.gpr & REG0)) ||
(Disasm_Info.Instruction.ImplicitModifiedRegs.gpr & REG0)
)
{
printf("%.16llx > %s \n", Disasm_Info.VirtualAddr, &Disasm_Info.CompleteInstr);
}
Disasm_Info.EIP += len;
Disasm_Info.VirtualAddr += len;
}
}
}

解码第三方可执行文件:
void DisassembleCodeRange(unsigned char *StartCodeSection, unsigned char *EndCodeSection, int(Virtual_Address))
{
DISASM Disasm_Info;
int len;
memset(&Disasm_Info, 0, sizeof(DISASM));
Disasm_Info.EIP = (UInt64)StartCodeSection;
Disasm_Info.VirtualAddr = (UInt64)Virtual_Address;
Disasm_Info.Archi = 0;
Disasm_Info.Options = MasmSyntax;
while (!Disasm_Info.Error)
{
Disasm_Info.SecurityBlock = (int)EndCodeSection - Disasm_Info.EIP;
len = Disasm(&Disasm_Info);
if (Disasm_Info.Error >= 0)
{
printf("%.16llx > %s \n", Disasm_Info.VirtualAddr, &Disasm_Info.CompleteInstr);
Disasm_Info.EIP += len;
Disasm_Info.VirtualAddr += len;
}
}
}
int main(int argc, char *argv)
{
void *uBuffer;
FILE *fp = fopen("c://main.exe", "rb+");
fseek(fp, 0, SEEK_END);
DWORD FileSize = ftell(fp);
rewind(fp);
uBuffer = malloc(FileSize);
memset(uBuffer, 0, sizeof(uBuffer));
fread(uBuffer, 1, FileSize, fp);
fclose(fp);
// 反汇编文件偏移为1025-1099处的机器指令.
DisassembleCodeRange((unsigned char*)uBuffer + 1025, (unsigned char*)uBuffer + 1099, 0x401000);
system("pause");
return 0;
}

XEDPARSE 汇编引擎: 将汇编代码汇编为机器码,keystone 汇编引擎也可,https://www.keystone-engine.org/download
#include <stdio.h>
#include <Windows.h>
#define BEA_ENGINE_STATIC // 指明使用静态Lib库
#define BEA_USE_STDCALL // 指明使用stdcall调用约定
extern "C"
{
#include "G:/XEDParse/XEDParse.h"
#pragma comment(lib, "G:/XEDParse/XEDParse_x86.lib")
}
void printOpcode(const unsigned char* pOpcode, int nSize)
{
for (int i = 0; i < nSize; ++i)
{
printf("%02X ", pOpcode[i]);
}
}
int main(int argc, char *argv)
{
XEDPARSE xed = { 0 };
xed.x64 = TRUE;
scanf_s("%llx", &xed.cip);
// 获取汇编字符串
gets_s(xed.instr, XEDPARSE_MAXBUFSIZE);
if (XEDPARSE_OK != XEDParseAssemble(&xed))
{
printf("指令错误: %s\n", xed.error);
}
// 输出汇编机器码
printf("%s : ", xed.instr);
printOpcode(xed.dest, xed.dest_size);
system("pause");
return 0;
}

一次汇编多条指令
#include <stdio.h>
#include <Windows.h>
#define BEA_ENGINE_STATIC // 指明使用静态Lib库
#define BEA_USE_STDCALL // 指明使用stdcall调用约定
extern "C"
{
#include "G:/XEDParse/XEDParse.h"
#pragma comment(lib, "G:/XEDParse/XEDParse_x86.lib")
}
void printOpcode(const unsigned char* pOpcode, int nSize)
{
for (int i = 0; i < nSize; ++i)
{
printf("%02X ", pOpcode[i]);
}
printf("\n");
}
int main(int argc, char *argv)
{
XEDPARSE xed = { 0 };
xed.x64 = FALSE;
char *abc[] = {
"xor eax,eax",
"xor ebx,ebx",
"push eax",
"push ebx",
"mov ecx,3"
};
for (int x = 0; x < 5; x++)
{
strcpy(xed.instr, abc[x]);
if (XEDPARSE_OK != XEDParseAssemble(&xed))
{
printf("指令错误: %s\n", xed.error);
}
// 输出汇编机器码
printf("%s : ", xed.instr);
printOpcode(xed.dest, xed.dest_size);
}
system("pause");
return 0;
}

汇编引擎实现转ShellCode:
#include <stdio.h>
#include <Windows.h>
extern "C"
{
#include "G:/XEDParse/XEDParse.h"
#pragma comment(lib, "G:/XEDParse/XEDParse_x86.lib")
}
int main(int argc, char *argv)
{
XEDPARSE xed = { 0 };
xed.x64 = FALSE;
unsigned char *p;
p = (unsigned char *)malloc(256);
char *OpCode[15] = {
"push ebp",
"push ebp",
"xor eax,eax",
"mov eax,1",
"endp"
};
for (int x = 0; x < sizeof(OpCode) / sizeof(OpCode[0]); x++)
{
if (strcmp(OpCode[x], "endp") == 0)
break;
strcpy(xed.instr, OpCode[x]);
if (XEDPARSE_OK != XEDParseAssemble(&xed))
break;
// 将汇编机器码生成为ShellCode
for (int y = 0; y < xed.dest_size; y++)
{
p[y] = xed.dest[y];
}
}
system("pause");
return 0;
}
C/C++ BeaEngine 反汇编引擎的更多相关文章
- 反汇编引擎diStorm3
反汇编引擎diStorm3 diStorm3是Kali Linux自带的一款轻量级.容易使用的反汇编引擎.它可以反汇编生成16位.32位和64位指令.它支持的指令集包括FPU.MMX.SSE.SS ...
- 反汇编引擎Capstone
反汇编引擎Capstone Capstone是Kali Linux自带的一款轻量级反汇编引擎.它可以支持多种硬件构架,如ARM.ARM64.MIPS.X86.该框架使用C语言实现,但支持C++.P ...
- 驱动开发:内核LDE64引擎计算汇编长度
本章开始LyShark将介绍如何在内核中实现InlineHook挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用LDE64这个反汇编引擎,该引擎小巧简单可以直接在驱 ...
- c++反汇编与逆向分析 小结
第一章 熟悉工作环境和相关工具 1.1 熟悉OllyDBG 操作技巧 1.2 反汇编静态分析工具 IDA(最专业的逆向工具) 快捷键 功能 Enter 跟进函数实现 ...
- 反汇编基本原理与x86指令构造
反汇编基本原理与x86指令构造 概要:旨在讲述程序的二进制代码转换到汇编.即反汇编的基本原理.以及 x86 架构的 CPU 的指令构造,有这个基础后就能够自己编写汇编程序了,也能够将二进制代码数据转换 ...
- C/C++ Capstone 引擎源码编译
Capstone 是一个轻量级的多平台.多架构的反汇编框架.Capstone 旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎.Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文 ...
- oracle 有用站点
使用oradebug修改数据库scn – 提供专业ORACLE技术咨询和支持@Phone13429648788 - 惜分飞 Solaris上使用DTrace进行动态跟踪 老熊的三分地-Oracle及数 ...
- oracle 常用博客网址
使用oradebug修改数据库scn – 提供专业ORACLE技术咨询和支持@Phone13429648788 - 惜分飞 Solaris上使用DTrace进行动态跟踪 老熊的三分地-Oracle及数 ...
- 汇编与C语句
---恢复内容开始--- 汇编与C语句 4.1C语句与汇编 学习了汇编语言之后,就需要将常用的C语言代码结构与相应的汇编语言联系起来.这样就可以在分析汇编语言的时候,明白它的意思.C语言中函数过程的调 ...
- virut详细分析
Virut分析 0x00.综合描述 virut样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...
随机推荐
- web应用模式 api接口 接口测试工具postman restful规范
目录 web应用模式 前后端混合开发 流程说明(重要) 前后端分离开发 流程说明(重要) api接口 接口测试工具postman 基本介绍 编码格式 restful规范(重要) 简介 主要内容 练习 ...
- GitLab--简单使用
1 创建项目组 项目组说明 Private 私有 只有所有者 组内成员或已分配的用户有查看权限(同GitHub收费版的私有仓库) Internal 内部 拥有GitLab账号的成员可以查看 无账号用户 ...
- C++正则表达式的初步使用
正则表达式(Regular Expressions),又被称为regex.regexp 或 RE,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内容.从C++11开 ...
- POJ 2484博弈——对称法
题目链接:http://poj.org/problem?id=2484 题意:Alice和Bob玩游戏,从一堆圆环形排列的硬币中拿硬币,每次可以拿一个或者两个,但必须拿连续的(两个中间有空位也视为不连 ...
- L2-020 功夫传人 (25分)
分析: ⽤⼆维数 组v存储师⻔谱系关系,v[i]表示编号为i的师傅所拥有的徒弟,如果徒弟个数等于0, 也就是说这是个得道者,那么v[i][0]保存放⼤的倍数,⽽且⽤visit[i] = true标记当 ...
- 基于Kubernetes的Serverless PaaS稳定性建设万字总结
作者:许成铭(竞霄) 数字经济的今天,云计算俨然已经作为基础设施融入到人们的日常生活中,稳定性作为云产品的基本要求,研发人员的技术底线,其不仅仅是文档里承诺的几个九的 SLA 数字,更是与客户切身利益 ...
- 阿里云蝉联 FaaS 领导者,产品能力获最高分
日前,权威咨询机构 Forrester 发布 The Forrester Wave: Functions-As-A-Service Platforms, Q2 2023.阿里云凭借函数计算的产品能力在 ...
- CMake学习,我们怎么从零开始狂写大型项目
CMake 说明 cmake的定义是什么 ?-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----C ...
- qq快速打开邮箱的设置
登陆qq想快速进入邮箱,发现没有入口
- [转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算
https://www.dell.com/community/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BF%9D%E6%8A%A4-%E8%B ...