NOWMEMDF.SYS 무력화를 통한 패치
문제점
다음 파일로 넘어가면 다시 퀵으로 전환 버튼을 눌러줘야한다 -_-;
연구목적으로 리버싱한것입니다
패치나 패치방법등은 공유하지않습니다!
자습 12시간 뻉뺑이라서 너무 지루해서 그림을 그리게 됬다.
여러그림이 있지만 맘에 드는 그림 2점만 올려본다
아마도 블럭쌓기가 실증이 난걸까..?
아니면 놀아줄 사람이 없었던걸까
아니면 원하는 대로 블럭이 쌓이지 않았던걸까
음..
그런걸 생각해보면서 그렸다 -_-;
박사 : "훗.. 후하하하하!! 하지만 어쩌지 이미 늦어버렸는걸 이미 주사위는 굴러졌어"
주인공 : "크윽!! 한발 늦었군"
[......]
유치하다 -_-;;;;;;;;
psp를 사놨지만 별로 재미있는게임도 없고
있어도 일본어라서 psp를 봉인해둔지 몇달이 지났을까
(디맥 1,2 몬헌 GTA 이런거 뺴고 별로 재미가없다 솔직히 psp 투자한비에 재미가별로없는것같기둥)
여튼 학교에서 어떤 애가 psp하고있는데 디맥을 하고있는것이다.
디맥 1,2랑 쫌 다른버젼이네 하면서 봤더니
신버젼이 나왔다는거다
정리하자면 디맥 1-> 디맥 2-> 클래지콰이 에디션 -> 블랙스퀘어
그래서 당장 공유싸이트에 들어가서 무료 포인트로 다운받았다(요즘은 뭐 클럽박스밖에 되는게없으니깐 조낸 불편하다 ㅜㅜ 아 구차행 ㅜㅜ)
그중에 좋아하는 노래가 Flea다
게다가 시험기간에는 아예 나오질 못한다
그래서 거의 옛날 내모습이 사라지고있는데
시험이 끝나고 1/1일 특별 기념휴일이 주어졌다
(그래봤자 다른애들노는거애 반도 못한다)
기숙사에 있는 애들이 나보고 쏘우에 나오는 할아범 닮았다고한다
"야 쏘우가 글케 재밌냐?"
"음 쫌 잔인하긴 한데 재밌음 ㅇㅇ 꼭 보셈"
그래서 일단 클럽박스 핵 재정비도 할겸 핵도 만들고(근데 요즘은 뭐든지 프로그램이 다 복잡해)
근데 요즘 클럽박스 망쪼가 드는지
다 블라인드고 뭐 캐쉬를 쓰라니 헛소리를 작작하는것이다
에혀
큐파일이나 써볼까
그런데 또 큐파일 패치만드느라 결국 1일은 패치만드느라고 소비했다
오호 ..하면서
1편, 2편, 3편, 5편을 봤다(4편은 왠지 보기가 귀찮았다)
1편 2편 3편 까지는 맘에 들었는데
B급영화라는 느낌이 드는걸까
근데 말이지
하나도 안닮았다 나랑!
옛날과 같이 꿈꿀 시간도 적고
했던일들은 너무 크게 잡아서 하지도 못하고
그래서 그냥 소소하게 천천히 올려볼 계획이다
옛글은 나중을 추억하기위해 남겨뒀지만
영 아닌걸
이래도 또 몇일만에 관두는건지아닌지 모르겄다
지뢰찾기 맵핵 소스
준비물 :
1. 프로그래밍(Programing) 툴
Ex)VB, C++, .Net
당신이 여기 써있는 API를 이해한다면 어떤것이라도 상관없다.
2. 메모리(Memory) 검색 툴
Ex)티서치(T-Search), 치트엔진(Cheate Engine), 아트머니등
준비물을 챙기지 않았다면,
여기서 다운 받으시면 됩니다.
열기
2 단계 - 설계하기
자, 드디어 분석이 끝났다.
프로그래밍 툴은 그나마 초보자들이 많이 접하고 있는
VB로 이야기를 진행하도록 하겠다.
저번에 마지막 시간에 얻은 자료를 기초로 하여
X * 2^5 + Y + 0x1005340 이 지뢰인지 아닌지를 검별할 수 있는
메모리 주소가 되겠다.
지뢰찾기 프로그램 표면에 바로 지뢰를 표시하는 건 좀 힘든 일이므로,
나는 내 프로그램에 지뢰를 표시하겠다.
일단 그러면 내 프로그램에 지뢰찾기
프로그램의 표면 사이즈만큼 바닥을 깔아야 한다.
그러기 위해서 지뢰찾기 프로그램에서 가로X세로 사이즈를 추출할 것이다.
여기서 메모리 검색 툴이 사용되는 것이다.
이 강좌에선 티서치를 사용하도록 하겠다.
[그림 2-1 지뢰찾기의 사이즈 지정]
지뢰찾기에선
게임 -> 사용자 지정 란을 통해서
가로와 세로를 마음대로 정할 수 있다.
여기선 높이가 세로로 나오고 너비가 가로이니 조심할 것 빼고는 없다.
티써치로 찾기 쉬운 값을 써넣어서
가로의 크기가 담긴 메모리 주소와 세로의 크기가 담긴
메모리 주소를 아는것이 핵심이다.
그래서 나는 다음과 같은 값을 얻을 수 있다.
가로 - 0x1005334
세로 - 0x1005338
3 단계 - 코딩하기
설계도 다했으니 이제 코딩을 본격적으로 하기에 앞서
알아낸 정보들을 나열 하겠다.
지뢰의 좌표
X * 2^5 + Y + 0x1005340
맵 사이즈의 좌표
가로 - 0x1005334
세로 - 0x1005338
그렇다면
이중 중첩 For 문을 써서
For i = 1 to X
For j = 1 to Y
지뢰 감별 루틴(i * 2^5 + j + 0x1005340)
Next j
Next i
이런식으로 하면 되겠다.
더이상은 소스를 보면 알만큼 알게될 것이다.
첨부한 소스를 참고하기 바란다.
하드웨어(HardWare)란 무엇인가?
하드웨어는 소프트웨어(SoftWare)과 대비되는 말이기도 하다.
직역하자면 하드웨어은 딱딱한 것이고,
소프트웨어는 부드러운 것이다.
컴퓨터에서 쓰이는 모든 프로그램들을 소프트웨어 라고 하는데.
하드웨어는 소프트웨어를 실행하기위한 컴퓨터 본체에 있는 부품들을 말한다.
하드웨어들은 크게 몇 분류로 나뉜다.
그리고 그 안에서도 또 세분화 된다.
여기 있는 것이 모두가 전체가 아니고 시대가 지나면 또 새로 추가 될 수도 있다.
1. 연산&제어 장치
- 메인보드 혹은 마더보드(MainBoard or MotherBoard)
열기
- 씨피유(CPU)
- 사운드 카드(Sound Card)
- 그래픽 카드(Graphic Card)
- 랜 카드(Lan Card)
2. 기억 장치
1) 주 기억 장치
- 롬(Rom)
- 램(Ram)
2) 보조 기억 장치
- 하드디스크(Hard Disk)
- 플로피 디스크(Floppy Disk)
- 플래쉬 메모리(Flash Memory)
- CD or DVD롬
2. 입력장치
- 키보드(KeyBoard)
- 마우스(Mouse)
- 타블렛(Tablet)
- 조이스틱(JoyStick)
3. 출력장치
- 모니터(Monitor)
- 스피커(Speaker)
- 프린터(Printer)
타겟(Target) 프로그램
준비물 :
1. 헥스(Hex) 편집 툴
Ex) 울트라 에디터(Ultra Editor)
2. 디버거(Debugger) 툴
Ex) 올리디버그(Olly debug)
소프트 아이스(Soft ice)
본 강좌에서는 울트라 에디터터와 올리디버그를 사용하겠습니다.
각자 상황에 맞게 알맞게 구워드십시요.
준비물을 챙기지 않았다면,
여기서 다운 받으시면 됩니다.
열기
1 단계 - 구상하기
[그림 1-1] 완성도
무언가를 구상하기전에
어떻게 할 것이고
최종 목표가 어떻게 되야할지를
생각해야 한다.
내가 만들 지뢰찾기의 맵핵은
다음과 같은 구상도가 될 것이다.
지뢰 찾기 맵핵을 만들기 전에, 맵핵이란 무엇인가?
지뢰 찾기에선 간단히 어느위치에 지뢰가 있는지를 클릭하기 전에 아는것이다.
지뢰 찾기의 구조는 우리는 이렇게 생각해볼 수 있다.
1. 가로와 세로의 사이즈를 선택한다.
2. 랜덤으로 수를 넣어 어느것이 폭탄이 될지를 정한다.
3. 클릭하면 좌표를 반환해 폭탄인지 아닌지를 체크한다.
4. 폭탄이면 -> 게임이 끝난다.
폭탄이 아니면 -> 계속 진행한다.
5. 다시 1로 돌아간다.
간단하게 하면 이런 과정이 되는것이다.
일단 가장 큰 흐름인 루프(Loop)를 찾아야한다.
그렇다면 루프는 무엇을 처리하나?
루프를 계속돌면서 프로그램은 여러가지 메세지(Message)를 처리한다.
그 메세지 중에서도, 지뢰가 아닌지 확인 하려면 우리는 제일 처음 클릭을 한다.
클릭했을 때 메세지를 처리하는 부분을 찾아야 하는것이다.
위 내용을 전혀 이해 못하겠다면,
아래의 열기를 누르길 바란다.
열기
프로그램들은 이 루프가 끝나면 처리가 안된 그 이외의 메세지를 처리해야하는데
그 API가 DefwindowProc 이다.
(물론 다른 처리방법과 접근 방법은 수백가지가 넘는다.
하지만 이 강좌에서는 이런식으로 접근하겠다.)
[그림 1-2] DefWindowProc
DefwindowProc을 기준으로 처리되고 남은 메세지를 처리한다.
그렇다면 위로 올라가면 어떤 메세지를 처리하는지 알 수 있다.
Windows에서 키보드나 마우스의 메세지들은 Up과 Down이 있다.
무슨 말인고 하면, 우리는 대충 키 "A"가 눌렸다고 생각하지만,
기계는 키 "A"가 눌려졌을때는 Key_Down의 메세지를 받고
키 "A"에서 손을 때면 Key_Up 메세지를 받는다.
마찬가지로 사용자들이 마우스를 클릭할때도 Down, Up이 있다.
마우스 왼쪽 버튼이 눌러지면서
폭탄이 터지든, 숫자가 뜨던 둘중에 결정되니 일단 마우스 왼쪽 버튼이
눌려진 메세지를 감지하는 부분을 찾으면 되는 것이다.
그래서 아래의 상수를 찾으면 된다.
WM_LBUTTONDOWN (201)
WM_LBUTTONUP (202)
이 쌍을 이룬다.
여기서 WM은 WindowMessage를 뜻하고
수정 합니다. 2007/03/19 08:14
L은 Left즉 오른쪽을 뜻하며, -> L은 Left즉 왼쪽을 뜻하며,
'오타..' 님 감사합니다
BUTTON은 버튼을 뜻한다.
눈치 빠른 독자들은 그럼 다음의 내용도 예측할 수 있으리라,
[마우스 왼쪽 버튼]
WM_LBUTTONDOWN (201)
WM_LBUTTONUP (202)
[마우스 오른쪽 버튼]
WM_RBUTTONDOWN (204)
WM_RBUTTONUP (205)
[마우스 가운데 버튼(휠)]
WM_MBUTTONDOWN (207)
WM_MBUTTONUP (208)
그렇지만 마우스가 Down된 상태에서 선택 범위를 벗어나면 클릭을 취소할 수 있다.
무슨말인고 하면, 지금 지뢰찾기를 치고 아무거나 클릭해보자.
단 손은 떼지말자. 그리고 옆칸으로 움직여보라!
분명이 난 클릭은 했지만 범위를 옆으로 움직였기떄문에
Up 메세지가 반환이 되지않고 프로그램은 취소된것으로 확인한다.
즉 우리가 왼쪽을 확실히 클릭했다.
라고하는 것은 WM_LBUTTONUP 인것이다.
[그림 1-2] 어디서 처리가 이루어지는지 추측하자!
우리는 어디서 해당위치가 지뢰인지 아닌지 판별하는지
더욱 더 범위를 좁히게 되었다.
구문을 따라가면 더 넓은 세계가 펼쳐진다.
여기서 우리는 범위를 좁히기 위해 몇가지 경우를 더 생각해야 한다.
즉 어떻게 지뢰를 감별하는지 일반적으로 생각해보자.
(이 추측을 한번에 잘해야 쉽게 빠르고 만들 수 있다.
나는 단지 한 방편만 제시해줄 뿐이다.)
그리고 우리는 또하나 생각해야 할 점이있다.
지뢰찾기는 처음에는 절대 지뢰로 사망하는 경우가 없다는 것이다.
나중에가서 맵핵을 다 작성하면 알겠지만,
처음에는 절대 죽을 수가 없다.
그러므로 다음과 같은 상황을 유추해볼 수 있다.
유저 : (8,9)에 있는 칸은 지뢰가 있습니까? 없습니까?
프로그램 :
1. 처음 클릭시 -> 지뢰가 있다 -> 지뢰가 있긴 하지만
처음 클릭이시네요.
다시 지뢰의 위치를 바꿔야겠습니다.
2.처음 클릭시 -> 지뢰가 없다 -> 계속 진행
3.두번째 이상 클릭시 -> 지뢰가 있다 -> 게임 끝
4.두번째 이상 클릭시 -> 지뢰가 없다 -> 계속 진행
다음과 같은 패턴이 존재한다는 것이다.
그렇다면 프로그램은 예시에서 보여준
(8, 9) 위치를 어느 순간에 기억할 것이고,
그다음에 처리를 할 것이다.
그렇다면 (8, 9)의 지역에 클릭을 하고 어떤 변화가 일어나는지 보겠다.
[그림 1-3] 맵핵은 만들기 힘들어~!
어마어마한 구문중, 어느 구문이 우리가 원하는지 찾아야 한다.
빡시지만 그림의 설명을 잘 보고 따라오자
[그림 1-4] 두개의 콜(Call)문
죽 따라가보면 나머지 2개의 콜문이 나온다.
이 두개중 하나에서 처리를 해본다는걸 의심할 수 있다.
그럼 차근 차근 처음 콜문 부터 조사해보자
[그림 1-5,6] 첫번째 콜(Call)문
첫번쨰 콜문을 들어가면 MOV EAX, DWORD PTR SS:[ESP+8]에서
DWORD PTR SS:[ESP+8]의 값이 X의 값임을 알 수 있다.
그리고 1003519에서는 DWORD PTR SS:[ESP+10]의 값이
Y의 값임을 알 수 있다.
그런데 100351D에서 EAX값(X좌표)의값을 ECX로 옮긴다.
그러므로 다음과 같은 정리가 가능하다
ECX레지스터에는 X좌표의 값이 들어가고
ESI레지스터에는 Y좌표의 값이 들어간다.
SHL ECX, 5라는 명령어가 등장하는데.
SHL이란 왼쪽으로 쉬프트(Shift Left)를 의미한다.
이에 반해 SHR은 오른쪽으로 쉬프트(Shift Right)를 의미한다.
쉬프트(Shift)연산을 모르시는 분은 클릭
열기
여튼 SHL ECX, 5라는 명령어는
ECX를 왼쪽으로 5칸 쉬프트(Shift) 한 결과 값을 ECX에 다시 담는다.
우리가 쓰는 수식으로 바꾸자면
ECX = ECX * 2^5 이 되겠다.
(여기서 '*'는 곱하기를 의미하고, '^'는 제곱을 의미한다.)
Ex)
2*5 = 10 - 2 곱하기 5는 10
2^3 = 8 - 2의 3승은 8
라는 수식으로 바꿀 수 있다.
LEA EDX, DWORD PTR DS:[ECX+ESI+1005340]
이란 명령어를 만나는데
ECX+ESI+1005340 의 결과 값을
EDX레지스터에 저장한다는 뜻이다.
단 여기서 ECX+ESI+1005340은
메모리에 있는 주소다.
TEST BYTE PTR DS:[EDX], 80
는 레지스터 EDX에 담겨있는 주소값에 있는 값과 0x80을 비교한다는 뜻이다.
그리고 100352D에서는 TEST 명령어의 결과값이 맞다면
점프를 하지 않고 틀리면 점프를 하게되있다.
100352D구문을 무조건 JMP(JUMP)하게 강제 수정하면 하면
지뢰가 한개도 나오지 않게된다.
즉 TEST BYTE PTR DS:[EDX], 80
에서 EDX의 값의 메모리 번지의 값이 80이면 지뢰라는 소리다.
EDX를 구하는 수식은 아까도 설명했지만
여기서 완전한 식으로 설명해드린다.
단, 여기서 ECX는 X좌표, ESI는 Y좌표 이다.
EDX = ECX * 2^5 + ESI + 1005340 이 지뢰인지 아닌지를 검별할 수 있는
메모리 주소가 되겠다.
드디어, 지뢰 찾기의 구조를 파악했다.
다음 강좌는 '지뢰찾기 맵핵 만들기! 2편 - 코딩편' 이 되겠다.

이올린에 북마크하기
invalid-file
이올린에 추천하기
BomB.exe
Prev

Rss Feed