문제

GNU 도구 (GCC, Binutils 등)를 사용하여 조립 명령의 모든 발생을 NO-OP로 수정할 수 있습니까? 구체적으로 -pg 옵션이있는 GCC는 다음 어셈블리 (ARM)를 생성합니다.

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

이 마지막 명령의 주소를 기록한 다음 다음 코드에서와 같이 NOP로 변경하고 싶습니다.

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Linux 커널은 런타임에 이와 유사한 작업을 수행 할 수 있지만 빌드 타임 솔루션을 찾고 있습니다.

도움이 되었습니까?

해결책

이것은 EG X86보다 RISC-ish 고정 길이 지침 형식으로 더 쉬울 것입니다.

Libelf를 사용하는 것은 비교적 간단해야합니다 (좋은 자습서는 여기 : http://people.freebsd.org/~jkoshy/download/libelf/article.html) 또는 libbfd (http://sourceware.org/binutils/docs-2.19/bfd/index.html) 객체 파일을 열려면 .text 섹션 내에서 지침을 수정하고 제공된 API를 사용하여 다시 작성하십시오. 노력의 가치가 있는지 여부는 비 기술적 고려 사항에 달려있을 것입니다 (하지만 조금 궁금합니다 ...).

이것이 교차 개발 환경에서 작동 해야하는 경우 libelf 또는 libbfd를 사용하는 주름이 몇 개있을 수 있음을 언급 할 가치가 있습니다.

다른 팁

코드를 컴파일 할 수 있습니다 gcc -S 객체 파일 또는 실행 파일로 완전히 컴파일하는 대신 어셈블러 목록을 출력합니다. 그런 다음 원하는 지침을 No-OPS (예 : 사용 sed), 그리고 거기에서 계속 편집.

원래 소스 코드가없는 객체 파일 또는 라이브러리에 대해이 작업을 수행하려면 대신 다음과 같은 도구를 사용해야합니다. objdump(1) 그것들을 분해하고 교체하려는 지침의 주소를 얻으려면. 그런 다음 객체 파일 헤더를 구문 분석하여 해당 명령의 파일 내 오프셋을 찾은 다음 객체 파일의 직접 NO-OPS로 컴퓨터 지침을 교체하십시오. 이것은 조금 까다 롭지 만 가능합니다.

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