Reversing&Write up/Study

[HandRay] while문, for문 패턴, WinMain API?

Jubil 2018. 1. 15. 16:26
반응형

while:

#include <stdio.h>


int main(){


int i = 0;

while(i < 10){

printf(“Hello\n”);

i++;

}


return 0;


}


<어셈블리>

  1. 원하는 곳 초기화

  2. 비교문과 jmp

  3. 종속 명령과 증감식

  4. jmp


mov 명령으로 int i = 0; 실행. (어셈블리 1번)


cmp로 비교하고 JGE로 i < 10이 거짓일 때, while을 빠져나감. (어셈블리 2번)


참일 때, printf(“Hello\n”);를 실행하고 i값을 증가시킴. (어셈블리 3번)



종속 명령이 다 끝나고 나면 cmp부분으로 jmp함. (어셈블리 4번)



for:


#include <stdio.h>


int main(){

int i;


for(i = 0; i < 10; i++){

printf(“Hello\n”);

}

return 0;

}



<어셈블리>

  1. 초기화

  2. jmp

  3. 증감식

  4. 비교문과 jmp

  5. 종속 명령

  6. jmp


mov 명령으로 int i = 0; 실행. (어셈블리 1번)


비교문과 jmp(어셈블리 4번)로 jmp함. (어셈블리 2번)


cmp로 비교하고 JGE로 i < 10이 거짓일 때, for문을 빠져나감. (어셈블리 4번)


참일 때, printf(“Hello\n”);를 실행함. (어셈블리 5번)


종속 명령이 끝나면 증감식(어셈블리 3번)으로 jmp함. (어셈블리 6번)




WinMain API Program


콘솔 환경의 프로그램이 아닌 경우 일반적인 main의 실행 패턴을 확인할 수 없음.


WinMain이라는 api 함수를 사용하기 때문.



-WinMain함수 파라미터-


HINSTANCE hInstance : OS가 각 프로세스별로 식별할 수 있는 고유 값, 인스턴스 핸들 값이 저장됨.


HINSTANCE hPrevInstance : 이전 프로세스의 인스턴스 핸들 값. (우리 입장에서는 별로 중요하지 않음)


LPSTR lpCmdLine : 아주 중요한 매개변수. 프로그램을 실행시키면서 넘겨준 인자 값이 저장되는 매개변수. 문자 형태로 저장되어 숫자로 연산할 때는 0x30을 빼줌.


int nCmdShow : 메인 윈도우를 어떻게 출력할 지 결정하는 인자.


-WinMain함수 찾는 법-

PUSH가 4번 들어온 다음 CALL을 함.

중간에 GetModuleHandleA라는 함수가 호출되는데, 이는 인스턴스 핸들 값을 불러오는 함수임.


매개변수로 넘겨준 3번째 인자는 EBP+10의 형태로 나타남.



반응형