2009-09-09 3 views
2

내가 만든이 DLL이 있습니다. 그것은 다른 프로세스에 주입됩니다. 다른 프로세스 내에서, 나는 다음과 같은 기능을 가진 그것의 메모리 공간에서 검색을 수행삽입 된 프로세스의 메모리 공간에서 데이터 구조를 재구성하는 방법은 무엇입니까?


void MyDump(const void *m, unsigned int n) 
{ 
     const char *p = reinterpret_cast(m); 

     for (unsigned int i = 0; i < n; ++i) { 
       // Do something with p[i]... 
     } 
} 

을 이제 내 질문에. 대상 프로세스는 데이터 구조를 사용하는 경우의이

 
struct S 
{ 
     unsigned char a; 
     unsigned char b; 
     unsigned char c; 
}; 

는 항상 프로세스의 메모리에 같은 방법을 제시 가정 해 봅시다? 사행은 = 2

 
Offset 
--------------------- 
0x0000 | 0x020x030x04 

같이, 메모리 공간 '과정의 연속 행에 나타난 구조 (항상 B = 3, C = 4 뒤에있는), 또는 이러한 변수가 될 수 있는지를 의미 메모리에서 다양한 지점에서의 데이터 구조를 재구성하는 방법 후자 경우

 
Offset 
--------------------- 
0x0000 | 0x00 0x02 0x00 
0x03fc | 0x00 0x03 0x04 

, 등이 다른 장소에서? 미리

많은 감사
nhaa123

답변

1

희생자가 C 또는 C++로 작성되었고 사용 된 데이터 유형이 정말 간단하면 메모리의 단일 바이트 블록으로 항상 찾아 낼 수 있습니다.

그러나 관찰이 더 이상 유지되지 않는 std::string과 같은 C++ 유형을 사용하는 즉시. 처음에는 C++ 컴파일러와 동일한 컴파일러의 다른 버전 사이에서도 정확한 레이아웃이 달라집니다. std :: string의 바이트는 인접 배열에 있지 않을 가능성이 있지만 가끔씩 있습니다. 2 점으로 갈라지는 경우, 후반전을 찾는 것이 전반전을 찾는 데 도움이되지 않을 것입니다.

Java 응용 프로그램을 실행하는 JIT'ting JVM과 같이 더 복잡한 환경에서는 실행하지 마십시오. 메모리에서 발생하는 타입은 매우 복잡합니다. 하나는 그들을 디코딩에 대한 책을 쓸 수 있습니다.

+0

음, 응용 프로그램 자체가 분할 된 표준 : : 문자열을 찾는 방법 : 스크린 샷을 확인? 내 말은, 그 정보는 어딘가에 있어야한다는 거지, 그렇지? – nhaa123

+0

응용 프로그램 자체가 해당 C++ 런타임을로드했을 것입니다. 런타임은 첫 번째 절반을 찾을 필요가 없습니다 (프로그램 논리가이를 처리 할 것입니다, 예를 들어 스택에 그 부분을 놓음으로써). 첫 번째 절반은 C++ 런타임에 의해 만들어 졌으므로 동일한 런타임에서이 부분을 사용하여 다른 부분을 다시 찾을 수 있습니다. 주된 문제는 문자 자체를 포함하는 std :: string의 두 번째 부분이므로 특정 문자열을 검색 할 때 찾을 수있는 유일한 부분 일 것입니다. – MSalters

0

부재의 순서는 반드시 동일 할 것이고, 구조가 인접한 메모리 블록을 차지한다.

컴파일러에 따라 구성원간에 패딩이 추가 될 수 있지만 프로그램이 동일한 컴파일러 및 동일한 설정으로 다시 컴파일되는 경우에도 동일하게 유지됩니다. 패딩이 추가되었고 당신이 그것을 인식하지 못한다면 런타임에이를 확실히 감지 할 수 없습니다 - 컴파일러가 가지고 있던 모든 정보는 그 순간에 사라지고 패턴과 추측을 분석해야합니다.

0

구조의 정렬에 따라 다릅니다.

이 같은 경우 : 한 바이트 B 후 패딩이로 C의 오프셋 (offset)

struct A 
{ 
    int16_t a; 
    char b; 
    int32_t c; 
    char d; 
} 

후 기본적으로 32 비트 플랫폼 (즉, 64 비트에 해당하는 경우 내가 아는 그나마), 4 , 그리고 d가 끝나면 3 개의 더 많은 bytess가 덧붙여집니다 (정확하게 기억한다면).

구조체에 지정된 정렬이있는 경우에는 달라집니다.

0

내 질문에.대상 프로세스가 데이터 구조 [...]를 사용한다면 프로세스의 메모리에서 항상 동일한 방식으로 표현됩니까? 즉, S.a = 2 (항상 b = 3, c = 4 다음에 오는)가 프로세스의 메모리 공간에서 연속적인 행으로 표시되는 구조입니까?

예, 그러나 예상치 못한 방식으로 회원을 정렬하기 위해 종종 패딩 처리됩니다. 따라서 단순히 코드 삽입을 통해 데이터 구조와 상호 작용하기 위해 데이터 구조를 다시 생성하십시오.

ReClassEx 또는 ReClass.NET, 메모리에서 데이터 구조를 재구성하고 유용한 C++ 코드를 생성하기 위해 특별히 만들어진 두 개의 오픈 소스 프로그램을 사용하는 것이 좋습니다!

Screenshot of ReClass.NET