2012-10-11 2 views
1

여기 거래가 있습니다. 타겟 프로세스에 DLL을 주입하고 레지스터 중 일부를 읽도록하겠습니다. 문제는 내 함수가 호출 될 때마다 내가 잡아야하는 콘텐츠의 크기가 끊임없이 변화한다는 것입니다.알몸 함수의 동적 크기 배열

벡터를 사용할 수 없기 때문에 미리 크기를 모르는 바이트 배열을 저장하는 경우 어떻게해야합니까?

여기 내 코드가 있는데, 분명히 C3068 때문에 컴파일되지 않습니다.

__declspec(naked) void _LocalHandleMessage() 
{ 
    __asm { 
     // Here i obviously have to store the data i'm sending to HandlePaquet 
     sub esp, __LOCAL_SIZE 
     pushad 
     pushfd 
    } 

    { 
     DWORD opcode; 
     DWORD size; 
     std::vector<BYTE> packetContent; 
     HandlePaquet(opcode, size, packetContent, true); 
    } 

    __asm { 
     popfd 
     popad 
     add esp, __LOCAL_SIZE 
     retn 
    } 
} 

또한, 나는 대상 프로세스에 클래스 멤버 메소드의 주소를 삽입 할 수 있기를 바라지 만 그것은 내가 충분히 구글 didnt는하지 않는 한이 불가능 보인다. 에서 VirtualAlloc - 데이터를 저장하는 데

+1

왜 벡터를 사용할 수 없습니까? 어떤 이유로 동적 메모리 할당을 일반적으로 사용할 수 없기 때문입니까? –

+0

정확히,이 바이트들을 하나의 유일한 컨테이너에 넣어야합니다. 그 기능은 알몸이기 때문에 벡터는 받아 들여지지 않을 것입니다. 그냥 객체를 선언하고 컴파일러가 파산 할 나체 함수를 컴파일 해보십시오. – Warpten

+0

왜 정적 또는 전역 벡터를 사용하지 않습니까? –

답변

1
  • 당신은 아주 간단한 방법이있다.
  • 또는 dll에서 정적 벡터 변수를 사용해보십시오.

주소 삽입 정보 - 후킹에 대해 이야기하고 있다면 가능합니다. virtual method table을 수정해야합니다. 오픈 소스 게임 해킹에서 예제를 찾을 수 있습니다.

멤버 메소드가 가상의 방법은 아닙니다 당신이 전화 오피 코드를 변경해야 vtable에 존재하지 않는, 또는 단지 방법의 시작에 JMP XXXXXXXX을 넣어합니다. 자세한 내용은 here을 참조하십시오.

+0

예, 미안 해요. 메서드의 주소를 후킹하는 것이 좋습니다. 나는 hookinh _class_ 메서드의 주소가 괜찮은지 알아낼 수 없습니다. – Warpten

+1

+1하지만 메소드가 가상 일지라도 컴파일 타임에 객체의 동적 유형을 알고 있다면 컴파일러에서 직접 호출 (즉, vtable을 통해 간접적으로 호출하지 않음)을 발행 할 수 있습니다. 그리고 컴파일러는 소스 코드를 볼 수 있다면 콜을 인라인 할 수 있습니다. –

+0

예, 그 괜찮습니다. 같은 클래스의 모든 객체는 일반적인 메소드 구현을가집니다. 새 개체를 만들 때 클래스 멤버 변수 만 할당됩니다. 메소드 코드는 프로세스 시작 후 영원히 같은 위치에 있습니다. 모든 메소드는 n + 1 개의 인수를가집니다 (n = 실제 인수 번호). 메소드의 첫 번째 인수는 'this'입니다. – kuperspb