2008-11-07 8 views
7

일부 코드로 포기 소프트웨어를 패치하려고합니다.Mach-O 바이너리 (OSX)에 LC_LOAD_DYLIB 명령을 삽입하는 방법

소프트웨어는 탄소 기반이므로 InputManager를 사용할 수 없습니다 (적어도 필자는 생각하지 않습니다). 내 생각은 mach-o 헤더에 dylib 참조를 추가하고 초기화 루틴이 호출 될 때 새 스레드를 시작하는 것이 었습니다.

적절한로드 명령 (LC_ LOAD_DYLIB)을 추가하기 위해 hexeditor를 사용하여 mach-o 헤더를 살펴 보았습니다.

otool은 내가 기대하는 것을보고하므로 파일의 형식이 올바르게되어 있다고 확신합니다.

 
Load command 63 
      cmd LC_LOAD_DYLIB 
     cmdsize 60 
     name @executable_path/libAltInput.dylib (offset 24) 
    time stamp 1183743291 Fri Jul 6 19:34:51 2007 
     current version 0.0.0 
compatibility version 0.0.0 

그러나, 바이너리를 실행하면 ... 나에게 다음과 같은 오류

 
dyld: bad external relocation length 

나는 이것이 의미하는 추측 할 수 모두 내가 LC_ SYMTAB 또는 LC_ DYNSYMTAB 부분을 수정해야한다는 것입니다 제공

누구든지 아이디어가 있습니까?

답변

4

나는 당신이 성취하고자하는 것이 무엇인지 확실하지 않지만 이것을하기위한 가장 쉬운 방법은 시작한 후에 mach task에 스레드를 삽입하는 것입니다. 이 작업을 수행하는 데 필요한 정보 (예 : 실행 코드)는 http://rentzsch.com/mach_inject/에서 확인할 수 있습니다. 당신이 알고 있어야

몇 가지주의 사항 :

  1. task_for_pid 마하() 작업에 마하 포트를 얻기 위해 필요한 전화는 이제 privleged 및 통화 할 수있는 권한이 필요합니다. 그 이유는 꽤 자명하지만 주입 된 코드로 무언가를 출시 할 계획이라면이 사실을 알고 있어야합니다.
  2. 코드는 원래 응용 프로그램과 동일한 프로세스 공간에서 실행되지만 별도의 스레드에서 실행됩니다. 따라서 스레드 인식이 아닌 경우 주입 된 코드 외부에서 데이터를 사용하고 조작하는 데 매우주의해야합니다. 분명히 모든 멀티 스레드 문제는 원래 코드가 추가 사실을 알지 못하기 때문에 여기서 증폭됩니다.
+0

우수. 이것은 좋은 팁입니다. 답변을 받으려면 앱을 배포하지 않아야합니다. 나는 대체 HID를 사용할 수 있도록 개인적인 용도로 패치하고있다. (나는 HID에 대한 앱 배포자와 드라이버 제조업체 모두에게 희망을 포기했다.) –

+0

네, 방금 다른 질문을 읽었습니다 ... mach_inject가 아마도 가장 좋고, 가장 쉬운 내기 일 것입니다. –

2

바이너리를 패치하지 않는 가장 쉬운 방법은 단순히 DYLD_INSERT_LIBRARIES 환경 변수를 사용하고 응용 프로그램을 실행하는 것입니다. 마하-O 파일 형식으로 많은 분야가 그래서 다른로드 명령을 추가하는 것은 모든 무효화 할 파일의 시작 부분에서의 오프셋 (offset)로 지정된 주소를 포함하기 때문에 동적 링커가 오류를보고 이유를 믿고있어

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib 

입니다 주소. 예를 들어 Mac OS X ABI Mach-O File Format Referencesymoffstroff 항목을 참조하십시오.