2012-04-18 7 views
2

나는 당신을 위해 세 가지 질문 dyld 관련된 모든 :)dyld의 API - 이상한 출력

내가 기초로 this dyld man page을 사용하고 있습니다. 다음 코드를 컴파일하고 제 jailbroken 장치에서 바이너리를 성공적으로 실행했습니다.

#include <stdio.h> 
#include <mach-o/dyld.h> 

int main(int argc, const char* argv[]) { 
    uint32_t image_count, i; 
    image_count = _dyld_image_count(); 
    for (i = 0; i < image_count; i++) { 
     printf("%s\n", _dyld_get_image_name(i)); 
    } 
    return 0; 
} 

이러한 기능을 통해 프로그램의 주소 공간에로드 된 모든 공유 라이브러리를 찾을 수 있다고 생각했습니다. 내 맥에서 출력은 매우 간단합니다 : 그것은 메모리에 현재로드 된 모든 라이브러리에 대한 경로를 보여줍니다. 내 아이폰에서 출력 거의 동일합니다 - 나는 또한 filepaths -하지만 지정된 위치에 파일이 없습니다. (반면에 내 맥에, 나는 파일을 찾을 수 있습니다!)

이 출력에서 ​​샘플 라인 : LS에 따르면, IFILE 및

/usr/lib/system/libdyld.dylib 다른 모든 도구들,이 디렉토리 (/ usr/lib/system /)는 비어 있습니다. 왜? 그 파일들은 어디에 있습니까?

제가 알고 싶습니다. 메모리에 라이브러리를 배치 할 수 있습니까? 어떤 오프셋부터 라이브러리가 메모리에 매핑되는 오프셋까지? 나는 처음을 찾는 법을 알고 있다고 생각하지만 나는 도서관의 끝을 찾는 방법을 모른다. 시작을 찾으려면 _dyld_get_image_header가 반환 한 주소를 사용하십시오. 맞습니까?

마지막 질문 : DYLD_INSERT_LIBRARIES를 사용하여 동적 라이브러리 라이브러리를로드하려는 경우를 생각합니다. 그러나, 모든 바이너리 내가 lib 충돌을 삽입 한 후 실행하려고하면 버스 오류가 발생합니다! 뭔가를 잊었거나 충돌을 일으키는 동적 라이브러리입니까? 이 모든 하나의 라이브러리가 하나의 큰 하나에 가입되어 있었다 큰 파일입니다 /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6 (_armv7) :

+0

jailbroken 장치에서 작업하고 있다고 추가해야합니다. jailbroken 장치로 작업하지 않는 경우, 이는 응용 프로그램이 샌드 박싱되고 작은 샌드 박스 외부에 액세스 할 수 없도록 제한하여 예기치 않은 동작이 발생하는 이유입니다. – Till

+0

라이브러리 크기가 헤더에 저장되어 있지 않습니까? Else : 실제로 존재하지 않기 때문에 지정된 파일이 존재하지 않습니다! 커널 캐시에 저장되지만 경로 이름은 dylib 파일에 하드 코드되어 있기 때문에 dyld가 실제 위치가 아니라고보고합니다. –

답변

2

도서관이 위치하고 있습니다.

심지어 비 탈옥 기기, 예를 하나의 메모리에서 dylib의 위치를 ​​결정할 수 탈옥 장치

에 후킹 http://iphonedevwiki.net/index.php/MobileSubstrate 참조. 라이브러리의 LC_SEGMENT (_ TEXT) -Section Header ( _text)를 구문 분석하면 라이브러리의 기본 주소와 TEXT __text 세그먼트의 크기를 가져올 수 있습니다. 그런 다음 vmslide를 쿼리하십시오. 이것을 TEXT __text의 기본 주소에 추가하십시오.

mach-o 파일 형식에 대한 자세한 설명은 https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html입니다. "segment_command"구조에 특별한주의를 기울이십시오.