2012-08-24 3 views
0

배경 : 특정 클래스에 속하는 Obj-C 인스턴스 메소드를 뒤집을 것입니다. 여기브레인 스토밍 : 메모리 주소를 작은 정수와 비교하는 이유

aMethod 분해

[0x0]  mov edi, [ebp+arg_0]  ## put self into edi 
[0x2]  mov edx, [edi+20h]  ## put self._integer into edi 
[0x3]  cmp edx, 1 
[0x4]  jl  end_of_method  ## if (self._integer < 1) return; 
[0x5]  lea  eax, [edx-0Ch]  ## put &self._myStruct into eax 
[0x6]  cmp eax, 3 
[0x7]  ja  end_of_method  ## if (&self._myStruct > 3) return; 
// other stuff 

제 6 라인의 단편은 3와 메모리 어드레스 (&self._myStruct) 사이 comparaison 보여준다된다 : 여기 클래스

@interface myClass : NSObject 
    { 
      // aStructure contains a lot of function pointers 

     struct aStructure **_myStruct;  // ivar offset: 0x14 
     int        _integer;    // ivar offset: 0x20 
    } 

    - (void)aMethod; 

@end 

문제의 인터페이스이다.

질문 : 메모리 주소를 int로 비교하는 이유는 무엇입니까? 메모리 주소가 항상> 3이 될 것이므로 나에게 의미가 없으므로이 경우 항상 메서드가 종료됩니다.

답변

3

lea eax, [edx-0Ch]은 단순히 eax = edx - 12을 의미합니다. 명령을 "로드 유효 주소"라고 부르더라도 사용할 수있는 유일한 방법이 아닙니다. 컴파일러는 add/sub/mul 대신에 lea을 출력하는 경우가 많습니다.

_integer이 1에서 15 사이인지 확인합니다. _integer - 12eax에 저장합니다. 이는 나중에 메서드에서 사용되기 때문일 수 있습니다.

+0

일반적으로 산술 계산인지 아니면 실제 실제 주소로드인지 식별하는 방법이 있습니까? 다음 지시 사항을 확인하여 논리적인지 확인하십시오. – b1onic

+0

그래, 유일한 방법은 계산 결과가 나중에 주소로 사용되는지 확인하는 것입니다. –

+0

오, 나는 lea eax, [edx-0ch]가 lea eax, [edi + 20h-0Ch]를 의미하는 반면, lea eax, [value_of_self._integer-0Ch]'를 의미한다고 생각했다. 당신의 설명에 감사드립니다. – b1onic

2

self._integer은 라인 2. edx에로드 그것을 당신이 edx (self._integer)와 -0xC의 합에 eax를 할당 라인 (5)에 라인 5.

때까지 남아있다. 따라서, self._integer -0xC와 6 행의 3을 비교하게됩니다. 제시된 디스 어셈블리가 불완전하거나 부정확하지 않으면, 주소 비교가 없습니다.

원래 주소 산술 용이었던 lea 명령어는 다른 용도로도 사용할 수 있으며 여기서도 볼 수 있습니다.

관련 문제