2012-11-17 2 views
4

그래서 리버스 엔지니어링을 위해 다른 프로그램의 메모리를 읽습니다. kernel32.dll에서 함수를 사용하고 있습니다. 나는 비트에 의해 메모리 비트를 읽을과 같이 그것을 사용하고메모리 덩어리 읽기, 로컬 구조체에 저장

ReadProcessMemory(Handle, new IntPtr(Address), buffer, BytesToRead, out ptrBytesRead); 

:하십시오 프로그램 처리하여 ReadInt32를 호출 다음

public static int ReadInt32(IntPtr Handle, long Address) 
    { 
     return BitConverter.ToInt32(ReadBytes(Handle, Address, 4), 0); 
    } 

및 주소 I

기능은 다음과 같습니다 정적이 아니기 때문에 프로그램의 기본 주소를 추가하여 읽기를 원합니다.

내가 원하는 것은 전체 메모리 (최대 1300 개의 레코드, 각 레코드는 0xB0의 메모리 단계를 가짐)를 읽는 것입니다.

나는 이것에 대해 가장 좋은 방법이 무엇인지 정확히 모르겠습니다. 나는 그것을 들여다 보았고, 내가 모든 것을 취하고 기본적으로 그것을 내 자신의 구조로 버리는 것을 할 수있는 것처럼 보입니다. 내가 겪고있는 문제는 내가 실제로해야 할 일이 무엇인지 알지 못한다는 것입니다. 나는 내 마음 속에서 그것을 볼 수는 있지만 펜을 종이 위에 놓을 수는 없다.

나는 구조에서 다음과 같이보고, 사실 2 차원 배열입니다 것을 보여주기 위해 확장됩니다 :

int OFFSET_CREATURE_ID = 0; 
    int OFFSET_CREATURE_TYPE = 3; 
    int OFFSET_CREATURE_NAME = 4; 
    int OFFSET_CREATURE_Z = 36; 
    int OFFSET_CREATURE_Y = 40; 
    int OFFSET_CREATURE_X = 44; 
    int OFFSET_CREATURE_IS_WALKING = 80; 
    int OFFSET_CREATURE_DIRECTION = 84; 
    int OFFSET_CREATURE_OUTFIT = 100; 
    int OFFSET_CREATURE_OUTFIT_HEAD = 104; 
    int OFFSET_CREATURE_OUTFIT_BODY = 108; 
    int OFFSET_CREATURE_OUTFIT_LEGS = 112; 
    int OFFSET_CREATURE_OUTFIT_FEET = 116; 
    int OFFSET_CREATURE_OUTFIT_ADDON = 120; 
    int OFFSET_CREATURE_LIGHT = 124; 
    int OFFSET_CREATURE_LIGHT_COLOR = 128; 
    int OFFSET_CREATURE_HP_BAR = 140; 
    int OFFSET_CREATURE_WALK_SPEED = 144; 
    int OFFSET_CREATURE_IS_VISIBLE = 148; 
    int OFFSET_CREATURE_SKULL = 152; 
    int OFFSET_CREATURE_PARTY = 156; 
    int OFFSET_CREATURE_WARICON = 164; 
    int OFFSET_CREATURE_ISBLOCKING = 168; 

그 오프셋 각각 내 구조의 다른 요소에 할당해야합니다. 그들 중 일부는 bool, int, 일부 문자열입니다. 나는 구조체를 가지고있다. 나는 각 값을 읽을 때마다 구조체의 새로운 인스턴스를 선언 할 필요가 있다고 생각하지만 길이가 각 오프셋에 대해 전체 "단계"를 소비한다는 사실을 짐작할 수는 없습니다 (각 500ms 정도 읽는다면, 250 레코드의 총 읽기 시간은 약 50ms이며, 이는 내가 읽어야 할 것으로 기대됩니다!하지만 최대 1300 개까지 수행 할 수 있어야합니다.)

혼란스러운 코드는 아니며, 내가해야 할 일에 대한 설명만으로 충분할 것입니다. 나는이 양의 코드로 작업 할 때 많은 어려움을 겪습니다. 누군가가이 모든 것을 읽을 클래스를 만들지 않으면 그것을 저장하는 구조로 (그래서 저는 그것을 내 작업으로 변환 할 수 있습니다), 문자 그대로 최소한의 코드를 고맙게 생각합니다.

답변

3

기본 유형의 경우 옵셋 n (데이터 시작)의 비트를 n+1으로 가져오고 BitConverter을 사용하여 유형으로 변환 할 수 있습니다. ToInt32(byte[] value, int startIndex)과 같은 메서드를 사용하여 끝을 지정할 수 없기 때문에 바이트를 새 배열에 복사해야합니다.

이 예에서는 모든 것이 int 인 것으로 가정합니다. 또한 모든 오프셋이 배열에 있다고 가정합니다. 바이트는이 거대한 단순화하지만 당신이 올바른 방향으로 움직이게하기에 충분합니다 ReadInt32

int[] values = new int[Bytes.Length/4]; 
byte[] current = new byte[4]; 
BitConverter bc = new BitConvert(); 
for (i = 0; i < Bytes.Length/4 -1; i++) 
{ 
    Buffer(Bytes, i(4), current, 0, 4); 
    values[i] = bc.ToInt32(current, 0); 
} 

에서 얻은 memblock입니다. 루프를 사용하고 싶지 않을 수도 있습니다 (C/C++의 db에서 읽을 때 serialization을 수행하는 방법 인 BitConverter 명령어 모두를 하드 코딩해야 할 수도 있습니다). 어느 쪽이든 기본 개념은 비트 변환기를 사용하여 다른 프로그램에서 읽은 바이트 섹션을 데이터 구조의 해당 속성으로 변환하는 것입니다.

+0

관리가 가능해 보이고 개념을 제 코드에 적용 할 수 있다고 생각합니다. 감사합니다. – XtrmJosh