while:
#include <stdio.h>
int main(){
int i = 0;
while(i < 10){
printf(“Hello\n”);
i++;
}
return 0;
}
<어셈블리>
원하는 곳 초기화
비교문과 jmp
종속 명령과 증감식
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;
}
<어셈블리>
초기화
jmp
증감식
비교문과 jmp
종속 명령
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의 형태로 나타남.
'Reversing&Write up > Study' 카테고리의 다른 글
[HandRay] if문 패턴, switch-case문 패턴 (0) | 2018.01.14 |
---|---|
[HandRay] 함수 호출 패턴, 구조체 패턴, 코드 패치 (0) | 2018.01.13 |
[HandRay] Main 함수 parameter, pointer 패턴 (0) | 2018.01.12 |
[HandRay] OllyDbg 사용법과 Data Expression (0) | 2018.01.11 |
[HandRay] 핸드레이와 레지스터 (0) | 2018.01.09 |