2010-05-23 7 views

답변

0

API 후킹으로 알려진 방법이 있습니다. John Robbins의 유명한 BugslayerUtil.DLL (그의 저서 "디버깅 응용 프로그램"참조)은 원래 자체 프로세스 내에서 API 후킹으로 사용되었습니다. 나는 모든 메모리 할당이 LocalAlloc, GlobalAlloc, VirtualAlloc 등과 같이 잘 알려진 소수의 함수에 할당 될 수 있음을 의미합니다. 프로세스 주소 공간 내부에서이 함수의 시작 주소를 덮어 쓸 수 있습니다. 이 작업은 프로세스 시작시 어딘가에서 수행하거나 DLL 주입을 사용하여 수행 할 수 있습니다 (프로파일 링 모드에서 Dependency Walker처럼). 따라서 모든 메모리 할당 시도를 기록 (추적)하고, 원래 함수로 호출을 전달하고, 반환 값 log (trace)를 한 번 더보고 결과를 되돌릴 수 있습니다. 모든 호출 시도 안에는 호출 스택에서이 함수를 호출 한 모든 함수를 볼 수 있습니다. 할당 된 메모리와 크기의 주소와 함께 호출 스택의 포함 내용은 찾고있는 전체 정보를 제공합니다. 모든 것을 다이나믹하게 볼 수 있습니다.

모든 물건을 직접 구현해서는 안됩니다. 인터넷에서 "API hooking"또는 "DLL injection"을 검색하면 충분한 예제를 찾을 수 있습니다. 호출 스택을 검사하려면 imagehlp.dll/dbghelp.dll (예 : http://www.codeproject.com/KB/threads/StackWalker.aspx 참조)의 문서화 된 StackWalk64 함수 (http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx 참조)를 사용할 수 있습니다.

그래서 내 문제는 해결 될 것으로 보인다.

+0

고마워요! 이미 DLL 주입을 구현했으며 API 후킹은 훌륭한 솔루션처럼 보입니다. 나를 괴롭히는 것은 성능 오버 헤드입니다. 600MB 이상의 메모리를 할당하기 위해 주입하는 애플리케이션이지만 어쨌든 시도해 볼 것입니다. 인사말 우크라이나에서 :) – Micktu

+0

당신을 환영합니다! 나는 특히 I와 같은 배경을 가진 누군가를 도우며 기쁘게 생각합니다. 오버 헤드 때문에 그냥 시도해야합니다. 힙에 대한 메모리 할당은 매우 까다로운 작업이 아니므로 모든 함수 호출이 아닌 로그 파일에 a를 쓰면 몇 가지 조건 (더 잘 알아야 함)으로 호출을 필터링 한 다음 응용 프로그램의 전체 성능 별로 변하지 않을거야. 로그를 작성하기 위해 메모리 맵핑 된 파일을 사용하면 (문자열을 맵핑 된 파일 메모리로 복사하는 것만으로) 파일에 기록하는 작업이 매우 빨라집니다. 최고의 안부와 많은 성공 독일에서 당신을 기원합니다. – Oleg

1

페이지 유형에 따라 다릅니다. dll의 코드 페이지 등의 주소는로드 될 때 알려지며 모든 디버거에서 "로드 된 모듈"창 또는 이와 동등한 것을 보면서 볼 수 있습니다.

일반적인 읽기/쓰기 메모리 페이지에 대해 이야기하고 있다면 나는 그것이 당신이 생각하는 것처럼, 나는 그것이 "속한"dll이 무엇인지 알아낼 방법을 모른다. 여기서 소유권의 엄격한 개념.

+0

고마워요! 예, 저는 일반적인 읽기/쓰기를 말하고 있습니다. 물론 DLL의 기본 주소를 아는 데는 아무런 문제가 없습니다. 지금까지 성공하지 못했던 라이브러리 메모리로부터 프로세스를 기억하는 방법을 찾고 싶습니다. – Micktu

관련 문제