查找操作码汇编指令
Finding opcode assembly instruction
我一直在尝试一个变形引擎。我开始试图分析操作码汇编指令,但它似乎没有给我任何东西。我在函数中寻找的指令是MOV。为什么它不返回任何东西,即使它们在函数中?
#include <iostream>
#include <Windows.h>
using namespace std;
struct OPCODE
{
unsigned short usSize;
PBYTE pbOpCode;
bool bRelative;
bool bMutated;
};
namespace MOVRegisters
{
enum MovRegisters
{
EAX = 0xB8,
ECX,
EDX,
EBX,
ESP,
EBP,
ESI,
EDI
};
}
bool __fastcall bIsMOV(PBYTE pInstruction)
{
if (*pInstruction == MOVRegisters::EAX || *pInstruction == MOVRegisters::ECX || *pInstruction == MOVRegisters::EDX || *pInstruction == MOVRegisters::EBX ||
*pInstruction == MOVRegisters::ESP || *pInstruction == MOVRegisters::EBP || *pInstruction == MOVRegisters::ESI || *pInstruction == MOVRegisters::EDI)
return true;
else
return false;
}
void pCheckByte(PVOID pFunction, PBYTE pFirstFive)
{
if (*pFirstFive == 0x0)
memcpy(pFirstFive, pFunction, 5);
else
memcpy(pFunction, pFirstFive, 5);
PBYTE pCurrentByte = (PBYTE)pFunction;
while (*pCurrentByte != 0xC3 && *pCurrentByte != 0xC2 && *pCurrentByte != 0xCB && *pCurrentByte != 0xCA)
{
OPCODE* pNewOp = new OPCODE();
pNewOp->pbOpCode = pCurrentByte;
if (bIsMOV(pCurrentByte))
{
cout << "mov instr.n";
}
}
}
void function()
{
int eaxVal;
__asm
{
mov eax, 5
add eax, 6
mov eaxVal, eax
}
printf("Testing %dn", eaxVal);
}
int main()
{
PBYTE pFirstFive = (PBYTE)malloc(5);
RtlZeroMemory(pFirstFive, 5);
while (true)
{
pCheckByte(function, pFirstFive);
system("pause");
}
return 0;
}
您看过function()
的拆卸吗?第一条指令可能不会是mov eax, 5
,因为MSVC可能在函数中使用内联asm创建堆栈帧。(push ebp
/mov ebp, esp
).
你的代码实际上在函数的字节上循环吗?你有一个循环,但是每次迭代都会泄漏内存。pNewOp
唯一出现的是,所以它是只写的。
OPCODE* pNewOp = new OPCODE();
pNewOp->pbOpCode = pCurrentByte;
注意,遍历所有字节将给出假阳性,因为0xb3
或其他任何可能作为非操作码字节出现。(例如ModR/M或SIB字节,或即时数据。)同样,你的0xC3
可能有假阳性,…扫描ret
指令。同样,看看原始机器码的反汇编。
同样,在调试器中单步检查你的c++代码,看看它做了什么。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 如何将RDRAND指令添加到与2008年汇编的64位代码中
- 什么样的C++代码将生成此 x86 汇编指令
- x86汇编指令优化
- 汇编AND指令和c++等效指令
- 如何通过反汇编从C++函数获取"lea"指令?
- 如何获得gdb tui汇编输出显示指令
- 汇编器消息:错误:拇指条件指令应该在 IT 块中 - "strexeq r1,r2,[r4]"
- 分析崩溃-翻译反汇编指令到c++等效
- Microsoft 绕道 - 带有汇编器"call"指令的钩子功能
- BFD_RELOC_64:用c++在32位linux上编译汇编指令
- 查找操作码汇编指令
- 将汇编指令翻译成c++
- 汇编器消息:编译C++时没有这样的指令
- visual如何在64位C++代码中使用暂停汇编指令
- 如何在c++中自动编写xchg汇编指令
- 如何在visual c++中使用TSL汇编指令处理线程
- 用于汇编指令的正则表达式