2014-01-25 3 views
-3

내 자신을 맹렬하게하기 위해 나는 배우는 것을 배우려고 노력하고있다. IDA를 사용하여이 기능을 발견했습니다 :조립 방법을 이해하는 가장 좋은 방법은 무엇입니까?

Question - (void)setCorrectAnswerIndex:(int) 

; void __cdecl -[Question setCorrectAnswerIndex:](struct Question *self, SEL, int) 
__Question_setCorrectAnswerIndex__ 
MOV    R1, #(_OBJC_IVAR_$_Question.correctAnswerIndex - 0x5C750) ; int correctAnswerIndex; 
ADD    R1, PC ; int correctAnswerIndex; 
LDR    R1, [R1] ; int correctAnswerIndex; 
STR    R2, [R0,R1] 
BX    LR 
; End of function -[Question setCorrectAnswerIndex:] 

나는 그것이 어떻게 작동하고 어떻게 수정할 수 있는지 생각하기가 힘듭니다. 그래서 setCorrectAnswerIndex는 항상 정적 인 숫자 나 어떤 것으로 설정 될 것입니다.

답변

2

컴파일 된 고급 코드를 보는 것이 좋은 학습 방법이 아닌 이유를 알아 보겠습니다. 보기의 ARM 어셈블리의 관점에서 어떤 일인지 것은 이것이다 :

  • 이동 레지스터 R1에 일정한
  • 다른 부분에이 코드로부터의 오프셋 (offset) 상대의 주소를 생성하는 것과 현재 프로그램 카운터 추가 R1
  • 스토어 링크에 유지 된 어드레스로 분기하여
  • 복귀 호출자 R0 + R1로 이루어진 주소 R2에 유지 된 값에 해당 어드레스에 저장된 어떤 값 프로그램 이미지
  • 부하 레지스터

어떤 프로그램이든간에 그 의미는 무엇입니까? 나는을 모른다. 컴파일 된 언어가 무엇인지 모르겠으므로 매개 변수가 전달되는 방법을 알지 못합니다 *. 나는 (언어와 개별 프로그램 모두에 의존하는) 구조와 레이아웃을 알지 못하기 때문에 그 오프셋과 포인터가 가리키는 것을 모른다. 이 어셈블리 코드 이 무엇을 말하는지은 무엇이든을 말하기에 아무데도 가리지 않습니다. 을 달성합니다. 이 함수가 실제로 응답 색인과 관련이없고 실제로 오도 된 이름을 가진 경우?

간단히 말해서, learn assembly, learn assembly을 원한다면.

리버스 엔지니어링을 배우려면 learn assembly을 배우십시오. 그런 지식으로 무장 한은 리버스 엔지니어링을 배우는 매우 어려운 작업을 시작합니다.

이 팁은이 기능의 유일한 부작용은 R2를 어딘가에 저장하는 것입니다. 모든 것을 다 해치지 않고 위의 지침 중 하나를 패치 할 수 없으므로 작성하기 전에 R2에 다른 값을 지정하는 것은 다소 어렵습니다. 전화 사이트에 방이있을 수 있습니까? R0과 R1을 재사용하여 새로운 값을 쓰고 원래의 LR로 돌아가 더 많은 코드로 패치 할 여유가있는 곳으로 상대 지점으로 상대방 패치를 패치하는 것이 제 생각입니다.

* 예, 여기 조금 바보입니다. 아마도 Objective-C인데, 이는 일 것입니다. ARM EABI를 사용하고 있습니다.하지만 확인하지 않으려 고합니다. 게다가, XCode와 관련이있는 곳과 가까운 곳으로 가려는 생각이 나를 다시 떨게 만듭니다.

관련 문제