리버스엔지니어링

조건 분기에 대하여

RSMaster 2019. 7. 9. 20:14



조건 분기를 하기 위해선 해당 조건이 있어야 합니다.

 이 조건을 만들어 주는 명령어부터 먼저 살펴봅시다.

 

 1. CMP

 

 cmp eax, ebx

  이처럼 cmp는 두 개의 오퍼랜드를 필요로 하며,

  eax에서 ebx를 빼는 기능을 하며 결과는 따로 저장되지 않습니다.

  cmp의 결과는 eax가 ebx보다 크다, 작다, 같다, 다르다 등의 형태로 플래그가 세팅됩니다.

 

 2. JZ(jump if zero) = JE(jump if equal),  JNZ(~not~) = JNE

 모든 조건 분기문은 다음처럼 해석이 됩니다.

 예를 들자면 jz의 경우, jump if zero의 약자로 만일 '0'이라면 점프하라는 뜻입니다.

 기억하시는데 한결 수월함을 느끼실 겁니다.

 이 명령문은 두 오퍼랜드가 같은지 다른지를 살펴보는 데 사용됩니다.

 

 예를 들어,

 mov eax, 3132333435

 mov ebx, 2132333435

 cmp eax, ebx

 jz goodway 

 jnz badway 


 

 이처럼 두 오퍼랜드에 올바른 시리얼과 우리가 넣은 시리얼을 집어넣어 비교하는 데 사용됩니다.

 만일 두 오퍼랜드의 값이 동일했다면 eax-ebx=0가 되어 zero 플래그가 세팅(1)되어 좋은 곳으로 점프하겠죠.  하지만 지금은 서로 다른 값이 있으므로 zero플래그가 세팅되지 못해서 not zero가 되므로 나쁜곳으로 점프하게 됩니다.

 

 3. JB(jump if below), JBE(jump if below or equal),

    JA(jump if above), JAE(jump if above or equal)

 이름이 뜻하는 것처럼 두 오퍼랜드의 대소에 의해 분기하는 명령들입니다.

 흔히 시리얼 자릿수나 등록이름 자릿수를 검사하는 데 사용합니다.

 예를 들어 주소 00403000번지에 'Mr.Jeong'가 들어있다고 합시다. 그러면

 push 00403000

 call lstrlen

 cmp eax, 6

 jb reInput

 jae keepGoing

 간단히 설명하자면 Mr.Jeong의 글자 수(8)가 call lstrlen함수를 실행하고 나면 eax에 저장됩니다.

 그리고 나서 cmp eax, 6을 해주면, 8-6>0 이므로 eax가 크게 되겠죠.

 따라서 따라서 주어진 jb reInput명령을 건너뛰게 됩니다.

 즉, 다시 말해 등록 이름을 6글자 밑으로 입력하면 다시 입력하라는 루틴이 될 것입니다.

 (여기에 관련된 플래그는 carry flag로 CF=1일 때 jb가 참이 됩니다)

 

 4. JL(jump if less)

 jb와 동일한 역할을 합니다. 다만 부호를 따집니다. 중요한 내용은 아니니 넘어가죠.

 

 5. JMP : Unconditional Jump

 무조건 분기하는 명령어입니다. 실제로 유용하며 많이 사용합니다.