查找操作码汇编指令

Finding opcode assembly instruction

本文关键字:指令 汇编 操作码 查找      更新时间:2023-10-16

我一直在尝试一个变形引擎。我开始试图分析操作码汇编指令,但它似乎没有给我任何东西。我在函数中寻找的指令是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指令。同样,看看原始机器码的反汇编。

编写自己的代码来解析x86机器码似乎是很多不必要的工作;有许多工具和库已经做到了这一点。

同样,在调试器中单步检查你的c++代码,看看它做了什么。