2012-06-22 4 views
-1

C++ 메소드의 asm 메소드를 호출 할 권리가 있는지 확실하지 않습니다.C++ 라인에서 asm을 호출하십시오.

C++ hkDrawIndexdPrimitive 방법 :

__declspec(naked) void DIP_Mid() { 
__asm { 
    pushad 
    pushfd 

    PUSH DWORD PTR SS:[EBP+0x1C]   // primCount    [4 Bytes] 
    PUSH DWORD PTR SS:[EBP+0x18]   // startIndex    [4 Bytes] 
    PUSH DWORD PTR SS:[EBP+0x14]   // NumVertices    [4 Bytes] 
    PUSH DWORD PTR SS:[EBP+0x10]   // minIndex    [4 Bytes] 
    PUSH DWORD PTR SS:[EBP+0x0C]   // PrimType    [4 Bytes] 
    PUSH DWORD PTR SS:[EBP+0x08]   // pDevice     [4 Bytes] 

    CALL hkDrawIndexedPrimitive 

    popad 
    popfd 

    XOR ESI,ESI        // Replace Code 0x6D9D73D1 [2 Bytes] 
    CMP DWORD PTR DS:[ESI+18],EBX   // Replace Code 0x6D9D73D3 [3 Bytes] 

    JMP dwDIPRet;       // Return to 0x6D9D73D6 
    } 
} 
+1

왜 '0x00000018'에서 읽었습니까 ('xor esi, esi; cmp [esi + 18h], ...))? – DCoder

+0

0x6D6D73D1에이 "__declspec (naked) void DIP_Mid"를 삽입하십시오. 이 "__declspec (naked) void DIP_Mid"는 5 바이트를 사용합니다. 0X6D6D73D1 및 0x6d9D73D3 = 5 바이트. 내 인라인 asm에서 코드를 대체하고 0x6D9D73D6로 돌아갑니다. – lannyboy

+0

내 질문에 대한 이해가 어렵습니까? – lannyboy

답변

1

왜 당신이 그것을 어려운 방법을하고있다 :

HRESULT WINAPI hkDrawIndexedPrimitive (LPDIRECT3DDEVICE8 pDevice, 
D3DPRIMITIVETYPE PrimType, UINT minIndex, UNIT NumVertices, UNIT startIndex, UINT primCount) 

ASM 코드 hkDrawIndexdPrimitive 메서드를 호출? D3D는 모든 객체 메소드에 대한 가상 함수 테이블을 가진 COM을 사용합니다. 즉, 어셈블리 깊이를 파헤 치지 않고 시스템/컴파일러 종속 인라인 ASM에 의존 할 필요가 없습니다. 또한 응용 프로그램 또는 시스템 로컬이 아닌 오브젝트 로컬이라는 추가 이점이 있습니다.

또한 이런 종류의 쉽게 만드는 도서관 등 MS Detours로, here는, 동일한는 D3D8을 신청할 것 D3D9 객체를 후킹에 대한 우회 사용에 대한 좋은 튜토리얼 (해당이 변경 될 수 있습니다 VFT 오프셋입니다 있습니다.

올바른 어셈블리 측면에서 이미 스택 프레임이 설치되어 있다고 가정하지만 AFAIK, COM은 스택 프레임을 사용하지 않으므로 EBP가 스택 맨을 가리 키지 않을 수 있습니다. 예를 들어, 귀하의 경우, 당신은해야한다 :

PUSHFD 
PUSHAD 
//code... 
POPAD 
POPFD 

그렇지 않으면 임의의 쓰레기가 EFLAGS와 다른 레지스터에 다시 나타납니다.

+0

예, 감사합니다. 나는 FILO라고 불리는 방법의 순서를 고쳤지 만 여전히 충돌은있다. 그것이 속임수 방지 게임 프로그램 보호 기능을 가지고 있기 때문에 우회로가 내 게임에서 작동하지 않습니다. 유일한 단단한 방법은 반대로 치트 게임 프로그램을 우회하기 위하여 해결할 수있다 ... – lannyboy

관련 문제