2014-09-01 1 views
0

이 뮤니티 디버거의 immlib 라이브러리에서 다른 기능을 찾고있었습니다. 나는 디버거에서 파이썬 쉘을 시작하고 다음 명령을 실행 :디버거의 기본 주소와 실제 주소의 차이

>>>imm.assemble("jmp esp") 
'\xff\xe4' 

>>>imm.search("\xff\xe4") 
[2090082029, 4411432, 2011716026, 2011814593, 2011483641, 2011550166, 2012419704, 1714392763, 1714402743, 2011113280, 2011241515, 2011395627, 2011399149, 2010689290, 2010819775, 2010819791, 2010819803, 2010845836, 2010849532, 2010849836, 2010851408, 2010855771, 2010855971, 2010856648, 2010856656, 2010856660, 2010857271, 2010857704, 2010857708, 2010857712, 2010857855, 2010857908, 2010857916, 2010858051, 2010859271, 2010860975, 2010863952, 2010864044, 2010864056, 2010864200, 2010864484, 2010864488, 2010864492, 2010866771, 2010866843, 2010867036, 2010882823, 2010883011, 2010890923, 2010893560, 2010897288, 2010897596, 2010903483, 2010903683, 2010904360, 2010904368, 2010904372, 2010905416, 2010905420, 2010905424, 2010905620, 2010905628, 2010906983, 2010908687, 2010911155, 2010911372, 2010911496, 2010911624, 2010911628, 2010911632, 2010911668, 2010911760, 2010911948, 2010912060, 2010912064, 2010912192, 2010912343, 2010912471, 2010914759, 2010938463, 2010938479, 2010938491] 

>>>imm.findModule(2090082029) 

('ntdll.dll', 2089811968) 

그래서 첫 번째 명령은 "JMP ESP"명령을 조립합니다. 다음 명령은 메모리 공간에서 어셈블 된 명령어를 검색합니다. 그런 다음 마지막 명령 (imm.findModule)은 어셈블 된 명령어가 들어있는 모든 모듈을 찾습니다.

내 쿼리는 두 번째 및 세 번째 명령에서 반환 된 주소입니다.

두 번째 명령에서 반환 된 주소가 디버깅 된 프로세스의 메모리 공간에만 속하는지 또는 디버거가 어셈블 된 명령을 검색하기 위해 사용 가능한 전체 메모리 공간을 검색합니까?

잘못된 것이 아니라면 세 번째 명령 ('ntdll.dll', 2089811968)에 대해 반환 된 주소가 모듈 자체의 기본 주소입니까?

다음 질문은 모듈이 현재 프로그램의 메모리 공간에 있는지 확인하는 것입니다.

내 마지막 쿼리에서 다음을 요약합니다. 기본 주소와 실제 주소의 차이점은 무엇입니까?

+0

GetModuleHandle은 모듈이 메모리에로드되었는지 확인하는 API입니다. 파이썬이나 면역 디버거는 사용하지 않지만 검사 할 API를 호출 할 수 있어야합니다. 실제 주소로 디버깅하는 것과 관련해서는 아무 것도 없습니다 (실제 주소에 대해 말하지 않는 한?). 기본 주소는 모듈의 EP입니다. – Paul

답변

1

두 번째 명령에서 반환 된 주소는 디버깅 된 프로세스의 메모리 공간에만 속합니까? 그렇지 않으면 디버거가 어셈블 된 명령을 검색하기 위해 사용 가능한 전체 메모리 공간을 검색합니까?

전자는 특정 프로세스에서 실행되는 코드는 동일한 프로세스에서 메모리를 직접 "볼"수 있습니다.

잘못된 것이 아니라면 세 번째 명령 ('ntdll.dll', 2089811968)에 대해 반환 된 주소가 모듈 자체의 기본 주소입니까?

당신은 잘못하지 않습니다 :)

나의 다음 쿼리가되는 모듈은 현재 프로그램의 메모리 공간에있는 경우 I 식별 어떻게?

위에서 설명한 것처럼 항상 기본값입니다. 다른 프로세스의 메모리 공간에 실제로 액세스하려면 ReadProcessMemory/WriteProcessMemory를 사용해야합니다.

내 마지막 쿼리에서 다음을 요약합니다. 기본 주소와 실제 주소의 차이점은 무엇입니까?

기본 주소는 일반적으로 모듈의로드 주소를 참조합니다. 즉, 모듈의 PE 헤더가 메모리에있는 경우입니다. 나머지 모듈의 헤더, 코드 및 데이터 (메모리에 매핑 된 부분)는 모듈의 지정된 페이지 정렬에 따라 따라옵니다.

여기서 '실제 주소'가 의미하는 바가 약간 명확하지 않습니다. 메모리에있는 ntdll.dll의 헤더의 실제 주소는 기본 주소와 같습니다. 그 질문에 대답합니까?

+0

설명 주셔서 감사합니다. 이것은 실제로 내 문제를 해결합니다. 실제 주소로 나는 실제 주소를 언급하고 있었다. –