2016-11-26 5 views
0

메모리에 점프를 쓰려고하는데, 어떻게 작동하는지 설명 할 수있는 곳을 찾을 수없는 것 같습니다. 나는 내가 hookAddr에 기록 할 수 E9 XX XX XX XX에 ASM JMP 0x7FE12345678 변환 어떻게 :메모리에 점프 쓰기

typedef UINT(WINAPI* tResetWriteWatch)(LPVOID lpBaseAddress, SIZE_T dwRegionSize); 

UINT WINAPI ResetWriteWatchHook(LPVOID lpBaseAddress, SIZE_T dwRegionSize){ 
    printf("Function called\n"); 
    return 0; 
} 

void main(){ 
    DWORD64 hookAddr = (DWORD64)&ResetWriteWatch; 
    WriteJump(hookAddr, ResetWriteWatchHook/*Let's say it's 0x7FE12345678*/);//Writes E9 XX XX XX XX to memory 
} 

내 주요 문제는 내가 이해하지 못하는 것입니다.

프로세스는 64 비트입니다.

+0

기존 C++로 수행 할 수없는 작업은 무엇입니까? 이것은 우회적 인 각도와 관련이 있습니까? – tadman

+0

기존의 C++을 사용하여 수행 할 수 있는지 확실하지 않지만 Windows API 함수를 많이 알지 못하므로이 방법이 가장 적합합니다. (ResetWriteWatch는 kernel32.dll에 있습니다.) – ioospa

답변

0

정확한 바이트를 생성하기 위해 어셈블러를 사용할 것을 제안합니다. 간단하게 다음과 같은 파일을 생성하고 NASM을 통해 그것을 실행

BITS 64 
JUMP 0x7fe1234 

결과는 다음과 같습니다

(때문에 LE 바이트 순서로)

2f e9 fe 12 00 07. 이것은 상대적인 점프이므로 높은 수준의 코드에서 생성하기가 어려울 것입니다. 대신 절대 점프를 수행하는 opcode EA을 사용할 수 있습니다. 그런 다음 점프하려는 위치의 절대 주소를 사용하면됩니다.

+0

xx는 자리 표시 자임을 알고 있습니다. 거기에는 적절한 바이트가 무엇인지 알기가 어렵습니다. "07 FE 12 34"부분을 어떻게 얻습니까? – ioospa

+0

그 주소가 점프되고 있습니다. 프로그램 실행이 필요한 곳입니다. –

+0

초 내에 편집하겠습니다. 실제 주소는 4 바이트 이상입니다. – ioospa

1

이것은 32 비트 프로그램에서 일반적으로 수행되는 방법입니다 (64 비트에서 얼마나 차이가 나지는 모르겠 음). 그러나 이것은 어디로 가야하는지에 대한 아이디어를 제공합니다. 이것은 VirtualProtect 때문에 창과 관련이 있지만, 리눅스를 사용하고 있다면 mprotect을 사용할 수 있습니다.

#include <stdio.h> 
#include <windows.h> 

void foo() { 
    printf("Foo!"); 
} 

void my_foo() { 
    printf("My foo!"); 
} 

int setJMP(void *from, void *to) { 
    DWORD protection; 
    if (!VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &protection)) { // We must be able to write to it (don't necessarily need execute and read) 
     return 0; 
    } 

    *(char *)from = 0xE9; // jmp opcode 
    *(int *)(from + 1) = (int)(to - from - 5); // relative addr 

    return VirtualProtect(from, 5, protection, &protection); // Restore original protection 
} 

int main() { 
    setJMP(foo, my_foo); 
    foo(); // outputs "My foo!" 

    return 0; 
}