2016-08-18 8 views
0

私は変成エンジンに試しています。私はopcodeアセンブリ命令を分析しようと試み始めましたが、それは私に何も与えていないようです。私がこの機能で探している命令は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 %d\n", eaxVal); 
} 

int main() 
{ 
    PBYTE pFirstFive = (PBYTE)malloc(5); 
    RtlZeroMemory(pFirstFive, 5); 


    while (true) 
    { 
     pCheckByte(function, pFirstFive); 
     system("pause"); 
    } 
    return 0; 
} 
+1

「bIsPUSH」はどこにも定義されていないため、コードはコンパイルされません。あなたの実際のコードを投稿してください。 –

答えて

0

function()の分解を見ましたか? MSVCはおそらくインラインasmで関数内にスタックフレームを作成するので、最初の命令はおそらくmov eax, 5にはなりません。 (push ebp/mov ebp, esp)。


実際にコードが関数のバイトをループしますか?ループがありますが、繰り返しごとにメモリがリークします。 pNewOpの唯一の出現は、書き込み専用です。

OPCODE* pNewOp = new OPCODE(); 
    pNewOp->pbOpCode = pCurrentByte; 

0xb3または任意の非オペコードバイトとして発生する可能性があるため、すべてのバイトをループすると、偽陽性を与えることに注意してください。 (ModR/MまたはSIBバイト、または即時データなど)。同様に、0xC3 ...に偽陽性を示す可能性があります。ret instructionsをスキャンします。繰り返しますが、生のマシンコードで逆アセンブリを見てください。

のx86マシンコードを解析するための独自のコードを書くことは、不必要な多くの作業のように思えます。すでにこれを行っているライブラリがたくさんあります。また

、それが何を参照するには、デバッガでのC++のコードを通してシングルステップ。

+0

はこれを追加します: vOpCodes =ベクトル();これは:vOpCodes.push_back(pNewOp);メモリリークを防ぐ – SamLaren