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样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...
随机推荐
- Go--统计数组中重复的元素及重复次数
代码: package main import ( "fmt" ) func main() { //创建有重复数值的数组 a1 := []int{1, 2, 3, 1, 4, 5, ...
- Java Kafka 消费积压监控
Java Kafka 消费积压监控 后端代码: Monitor.java代码: package com.suncreate.kafkaConsumerMonitor.service; import c ...
- #2089: 不要62 (数位dp模板题,附带详细解释)
题目链接 题意:问区间[n,m]中,不含数字4,也不含数字串"62"的所有数的个数. 思路:可以转化成求区间[0,x] 第一次接触数位dp,参考了这几篇博客. 不要62(数位dp) ...
- Codeforces Round #739 (Div. 3) 个人题解(A~F2)
比赛链接:Here 1560A. Dislike of Threes Description 找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数 直接枚举出前 1000 个符合条件的数 ...
- C#排序算法3:插入排序
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的.记录数增1的有序表. 原理: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已 ...
- python常见面试题讲解(七)合并表记录
题目描述 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的in ...
- java进阶(7)--Object类-toString()/equals()/finalize()/hashCode()
一.object类介绍 object类这个老祖宗中的方法,所有子类通用,直接或间接继承. 学习常用方法即可 列表 prtected object clone() //对象克隆 ...
- Linux 中常见目录的作用
by emanjusaka from https://www.emanjusaka.top/2024/01/linux-directory-role 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下 ...
- Angular系列教程之路由守卫
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- APB Slave设计
APB Slave位置 实现通过CPU对于APB Slave读写模块进行读写操作 规格说明 不支持反压,即它反馈给APB的pready信号始终为1 不支持错误传输,就是说他反馈给APB总线的PSLVE ...