모기 땜에 잠 설쳐서 지뢰찾기 시작.
모기도 많고 지뢰찾기도 안되고 해서 지뢰찾기 Reverse Engineering
지뢰찾기 만든 coder가 어떤 생각으로 이걸 짰는지 분석부터 시작.
모기도 많고 지뢰찾기도 안되고 해서 지뢰찾기 Reverse Engineering
지뢰찾기 만든 coder가 어떤 생각으로 이걸 짰는지 분석부터 시작.
목표: 지뢰 찾기 분석
결과: 2차원 배열로 만들어져 있으며 일반적이다.
Crack: 분석 완료 직후, Inline Patch로 배열 부분을 손보고 지뢰 찾기 시작 후 고급 기록 1초 갱신 완료.
결과: 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에서 시작 --------------------------------지뢰 생성 함수 끝--------------------------------
재밌네..~ 전에 동우님(http://ssrnet.snu.ac.kr/~leedw)처럼 디스어셈블 시도해서 분석한 것임~? --1002
네~ 맞아요~! 이거 쓰고 모기를 16마리 잡았네요 -0- --이영호
네~ 맞아요~! 이거 쓰고 모기를 16마리 잡았네요 -0- --이영호
Reverse 하는 김에 모기 퇴치 프로그램도 같이 짜야 할듯; --1002