문제

코드로 포기를 패치하려고합니다.

소프트웨어는 탄소 기반이므로 입력 관리자를 사용할 수 없습니다 (적어도 가능하다고 생각하지 않습니다). 내 아이디어는 Mach-O 헤더에 대한 Dylib 참조를 추가하고 초기화 루틴이 호출 될 때 새 스레드를 시작하는 것이 었습니다.

나는 적절한 부하 명령 (LC_ load_dylib)을 추가하기 위해 육각형을 사용하여 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 섹션을 수정해야한다는 것입니다 ...

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

도움이 되었습니까?

해결책

나는 당신이 무엇을 달성하려고하는지 완전히 확신하지 못하지만, 가장 쉬운 방법은 아마도 마하 작업이 시작된 후에 스레드를 주입하는 것입니다. 이 작업에 대한 훌륭한 정보 소스 (이를 실행하는 코드를 실행하는 것)는 여기에서 찾을 수 있습니다. http://rentzsch.com/mach_inject/.

당신이 알아야 할 일부 경고는 다음과 같습니다.

  1. Mach task_for_pid () 호출 마하 포트를 작업에 가져 오는 데 필요한 호출은 이제 권한이 있으며 호출 권한이 필요합니다. 그 이유는 매우 자명하지만 주입 된 코드로 무언가를 공개 할 계획이라면이를 알고 있어야합니다.
  2. 코드는 원래 응용 프로그램과 동일한 프로세스 공간에서만 실행되지만 별도의 스레드에서 실행됩니다. 따라서 응용 프로그램에 완전히 액세스 할 수는 있지만 스레드 인식이 아닌 경우 주입 된 코드 외부에서 데이터를 사용하고 조작하는 데 매우 신중합니다. 원래 코드가 추가 사항을 알지 못했기 때문에 모든 멀티 스레드 문제가 여기에서 증폭됩니다.

다른 팁

바이너리 패치를 포함하지 않는 가장 쉬운 솔루션은 단순히 dyld_insert_libraries 환경 변수를 사용한 다음 응용 프로그램을 실행하는 것입니다.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

동적 링커가 오류를보고 한 이유는 Mach-O 파일 형식의 많은 필드에 파일의 시작부터 오프셋으로 지정된 주소를 포함하므로 다른로드 명령을 추가하면 모든 주소가 무효화되기 때문입니다. 예를 들어, 참조 symoff 그리고 stroff 입력 Mac OS X ABI Mach-O 파일 형식 참조.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top