모기 땜에 잠 설쳐서 지뢰찾기 시작.
모기도 많고 지뢰찾기도 안되고 해서 지뢰찾기 Reverse Engineering
지뢰찾기 만든 coder가 어떤 생각으로 이걸 짰는지 분석부터 시작.
목표: 지뢰 찾기 분석
결과: 2차원 배열로 만들어져 있으며 일반적이다.
Crack: 분석 완료 직후, Inline Patch로 배열 부분을 손보고 지뢰 찾기 시작 후 고급 기록 1초 갱신 완료.
아래 소스는 지뢰찾기 분석한 것을 coder가 제작한 게임 소스 그대로 C언어로 완벽하게 구현한 것이다. (아마 M$에 있는 소스와 완벽히 똑같을 것이다.)
--------------------------------지뢰 생성 함수 시작--------------------------------
int func(int limit)
{
int num = (int)rand();
return num%limit;
}
// 지뢰 생성 함수
// srand(GetTickCount()); 를 이 함수 밖에서 수행한다.
main_func()
{
...
int base = 0x1E; // 가로길이 (30) <- 원래 main_func()의 매개변수로 받아온다.
int height = 0x10; // 세로길이 (16)
int count = 0x0A; // 지뢰 갯수(10)
int map[height][base] = {0x0f, }; // 눈여겨 볼점은 x좌표는 뒤에 y좌표는 앞에 썼다는 점.. 지뢰 없는 곳은 0x0f로 기록 있는 곳은 0x80
int ret_base, ret_height;
do {
ret_base = func(base)++;
ret_height = func(height)++;
if(map[ret_height][ret_base] == 0x80)
continue;
map[ret_height][ret_base] = 0x80;
count--;
} while(count);
...
}
// map 배열은 DS:1005340에서 시작
--------------------------------지뢰 생성 함수 끝--------------------------------