2016-12-12 3 views
2

다른 프로세스의 메모리에서 일부 데이터를 읽으려고하는 응용 프로그램을 작성 중입니다. 이 다른 프로세스는 대상 데이터 (어셈블리)가 있어야하는 libmono.0.dylib을로드하고 있습니다.다른 프로세스의로드 된 dylib에서 데이터 필드 읽기

일부 mach-o 기반 코드를 사용하면 대상 프로세스의로드 된 dylib를 반복하고 위의 lib의 mach header header baseaddress를 얻을 수 있습니다. 이

MonoDomain* mono_get_root_domain (void) { return mono_root_domain; } 

과 같은 모노 소스 코드에서

_mono_get_root_domain symbol

: 여기에서 나는 나에게 관련 데이터 구조체를 반환하는 함수의 주소를 제공하는 기호 표를 얻을 수 있습니다 0x18a934의 주소가 반환 된 구조체를 보유한다는 가정이 맞습니까? 그렇다면이 주소는 dylib 헤더 (= header_addr + addr)에 상대적입니까 아니면 일부 슬라이드를 추가하거나 그대로 사용해야합니다. 이 주소를 따라 가면 다른 모든 주소에 동일한 보류가 적용됩니까?

답변

0

나는 다른 프로세스의 메모리

각 프로세스는 자신의 가상 메모리 공간을 가지고 있으며, 커널에 의해 보호에서 일부 데이터를 읽으려고 응용 프로그램을 쓰고 있어요. Whit the dylib가 공유 될 수 있습니다. 함수가 주소를 반환하면 함수를 호출 한 프로세스의 가상 메모리 맵 (VMMap)에 저장됩니다.

대상 프로세스의 메모리 주소를 자신의 프로세스 주소 공간에 매핑하려면 대상의 작업 포트가 필요합니다. 이전에 task_for_pid을 호출하여 프로세스의 작업을 PID에서 가져올 수 있었지만 OS X 10.10 (El Capitan) 및 시스템 무결성 보호 (SIP) 도입 이후 더 이상이 작업을 수행 할 수 없습니다.

데이터가로드 된 dylib 내에있는 경우 dlopen으로 자신의 프로세스에 dylib를로드하고 dlsym을 호출하여 함수의 주소를 가져옵니다.

+0

답변 해 주셔서 감사합니다. 나는 이미 그 부분을 가지고 있는데, 나는로드 된 헤더 주소와 심볼에 대한 포인터를 갖고있다. 위에서 볼 수 있듯이 디스 어셈블 된 코드의 "내부"포인터를 발견했습니다. 이제 어떻게 사용합니까? dylib_base_address + pointer를 읽으면 무작위로 얻을 수 있습니다. 어떤 VM 지역이 가리키고 있습니까? – GooKSL