2010-12-02 2 views
1

데이터를 추출하기 위해 기존 응용 프로그램의 "분로 (shunt)"를 작성하려고 노력 중이므로 수행하려고하는 일부 분석에 데이터를 통합 할 수 있지만 막 다른 골목에 섰습니다. 나는 내가 읽고 자하는 지침을 격리 시켰지만, 정확히 이것을 수행하는 방법을 잘 모르겠습니다. 다음과 같은 결과가 동일한 변수 3 개의 메모리 스캔프로세스에 연결하고 특정 지침을 읽으려면 어떻게해야합니까?

00412153 - mov [eax+04],edx 
00412156 - fld dword ptr [ecx+08] 
00412159 - fstp dword ptr [eax+08] 
0041215c - ret 
0041215d - int 3 

결과 결과 :

EAX=1798B4E0 
ECX=0018D5C0 
EDX=00000016 

EAX=18D96298 
ECX=0018D5C0 
EDX=00000016 

EAX=18D3DCA8 
ECX=0018D5C0 
EDX=00000016 

는 (특히 00412159의 값) 내가 격리려고 명령어 세트 인

실행중인 프로그램에 디버거를 연결하면 원하는 값은 EAX이지만 대상 프로세스가 다시 시작될 때마다 EAX 값이 변경됩니다.

분명히 내가 쓴 것은 DMA (동적 메모리 액세스)라고도하는 힙 기반 메모리 할당이며 이로 인해 런타임에 포인터 매핑이 생성됩니다. 주제에 대한 간단한 연구는 내가 알아야 할 두 가지 구성 요소가 정적 기본 포인터와 런타임 포인터에 도달하는 데 사용 된 오프셋이라는 것을 밝힙니다.

저는 ASM과 총 4 시간의 experiance를 보냈습니다. 내 문제 일 수도 있고, 현재 내 리그에서 벗어난 문제를 다루는 것일 수도 있습니다. 00412159에서 지침의 가치를 읽는 가장 좋은 방법에 대한 아이디어 또는 기본 포인터와 오프셋을 찾는 방법에 대한 제안?

+1

"특정 명령을 읽는 것"이 ​​의미하는 바를 명확하게 설명해 주시겠습니까? "메모리 스캔"이란 무엇입니까? 당신이 그것을 사용하는 방식은 오히려'00412159'에있는 명령에 의해 액세스 된 데이터를 검사하고 싶다고 생각하게 만듭니다. 그리고 브레이크 포인트에 도달 할 때마다이 데이터에 액세스하기 위해 사용 된 레지스터가 변경된다는 것에 놀랐습니까? –

답변

0

늦게 답변드립니다.

기본적으로 응용 프로그램은 시작할 때 일부 메모리를 동적으로 할당합니다. (고급 프로그래밍에서 malloc 또는 이와 비슷한 것으로 생각하십시오)

이 할당 코드를 찾으면 할당 된 메모리의 시작 주소와 크기를 알 수 있습니다. 중요한 변수는 알고 있어야합니다.

그런 다음 디버거를 사용하여 수행해야 할 작업은 00412159에 중단 점을 넣은 다음 코드에서 직접 이동하여 EAX가 해당 동적 주소로 초기화 된 위치를 찾아내는 것입니다.

그 외에도 DMA를 물리 치는 것은 각 프로그램이 다르기 때문에 언제나 경험과 디버깅 기술의 문제였습니다. 여기에 조립 목록을 게시하면 올바른 방향으로 도울 수 있습니다.