2017-11-09 5 views
1

나는 .obj을 가지고 있으며 원래의 소스 파일을 가지고 있지 않습니다.수동으로 수정 된 디스 어셈블리 어셈블리의 주소를 자동으로 수정하는 도구

내가 사용하는 스택 레지스터에 푸시/팝하도록주의하면서 특정 내용의 지침에 자신의 어셈블리를 삽입하여 결과 어셈블리 파일을 수정합니다. 원본 콘텐츠를 스레 싱하지 않습니다.

왜? 아마도 특정 어셈블리 명령어가 실행될 때마다 (즉, 디버거/JTAG없이) 핀을 토글하고 싶을 것입니다.

그런 다음 조립을 다시 .obj으로하고 싶지만 자체 어셈블리를 삽입 했으므로 분기의 상대 주소가 올바르지 않습니다.

질문

자동 수정 상대적 주소 또는 내가 내 어셈블리를 삽입 할 때 수동으로해야 할 것이다 ARM 도구가 있습니까?

이것은 ARM Cortex M4 용이지만 중요하지 않다고 생각합니다.

+1

레이블을 사용하여 레이블이 0x1000을 사용하는 경우에도 레이블을 사용하여 어셈블러에서 해결하도록합니다. r1, r1, r2를 추가하고 lab0x1000 : r1, r1, r2를 추가하고 lab0x1000을 분기를 사용하는 사용자로 변경합니다. –

+0

@old_timer는'.obj'가 디버그 모드로 컴파일되지 않더라도 작동합니다. – Adrian

+0

자신 만의 디스어셈블러를 쓰면 (이 바이너리에서 thumb2가 사용 되었다면 더 고통 스러울 것입니다.) 라벨로 해체 할 수 있습니다. 또는 binutils로 가서 binutils를 수정하여 PC 상대 주소를 출력 할 때 대신 레이블을 출력 할 수 있습니다. –

답변

1

분기 타겟에 대한 레이블을 삽입하는 디스어셈블러를 사용하십시오. x86의 경우 Agner Fog의 objconv 디스어셈블러가이 작업을 수행합니다 (sample output).

ARM과 비슷한 것을 찾으십시오. 따라서 주소를 다시 계산하여 다시 어셈블하고 연결할 수있는 asm 출력을 얻을 수 있습니다. (존재한다면 IDK가 있지만, 기존의 디스어셈블러 중 하나에 해킹 할 수 있습니다.)

하지만 새로운 코드를 삽입 할 때 영향을 줄 수있는 분기 명령어가 아닙니다. 정적 주소가있는 모든 코드는 데이터 레이아웃 변경에 따라 영향을받습니다. ARM에서는 상수 리터럴 풀에서 PC 관련로드가 상수에로드되는 경우가 있으므로 레이블도 사용해야합니다.

+0

'static addresses as immediates' : 어떤 종류의 지시가 될까요? – Adrian

+0

@Adrian :'ldi', 아마도 해체 할 때'mov reg, # 0x1234'가 될 것입니다. 하지만 ARM에서는 인접한 리터럴 풀에서 상수를로드하는 것이 일반적입니다 (예 : 정적 주소를 가져 오기 위해 PC 상대로드 사용) –

+0

[내가하는 바를 알고 있습니다] (http://infocenter.arm.com/help/index.jsp) ? topic =/com.arm.doc.dui0473f/Bgbccbdi.html); 이것은 복잡해지고 있습니다.이것은''instrument '에 필요한 함수가 매우 큰 32 비트 int (시드 키 인증을위한 *** 비밀 *** 마술 번호)를 포함하기 때문에 또한 매우 적합합니다. – Adrian

관련 문제