GNU 도구 (gcc, binutils 등)를 사용하여 어셈블리 명령의 모든 항목을 아무 작업으로도 수정할 수 있습니까?명령을 사용하지 않으려 고 시도
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>
내가이 마지막 명령어의 주소를 기록, 다음 코드
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)
에 같은 NOP로 변경하려면 : 특히, -pg 옵션 GCC는 다음 조립 (ARM)를 생성
리눅스 커널은 런타임시 이와 비슷한 작업을 수행 할 수 있지만 빌드 타임 솔루션을 찾고 있습니다.
포인트가 유효한 동안 x86의 'nop'은 1 바이트 명령어이므로 제거 할 가변 길이 명령어를 통해 필요한만큼 많은 것을 쓸 수 있습니다. –
가변 길이 명령어의 경우 문제가되는 부분은 명령어 패턴을 검색하는 것입니다. 주어진 바이트 오프셋이 명령어를 디코딩하지 않고 명령어의 시작인지 여부를 알 수 없기 때문에 명령어 패턴을 no-op로 변환해야합니다. 그 오프셋 전에 지침. 바이너리의 리버스 엔지니어링을 때로는 (또는 적어도 방해하는 데 사용되는) 명령어의 중간으로 분기하는 것과 같은 똑똑한 코드를 작성한 어셈블러 트릭을 고려해 보면 더욱 심각합니다. –
참; 나는 그 방향에서 그것에 대해 생각하지 않았습니다. 좋은 지적. –