티스토리 툴바



2011/08/20 00:21

10원의 가치

그러하다..
Trackback 0 Comment 0
2011/06/08 00:49

윙 ㅜㅜ

햐 몇년만에 글쓰는거야 ㅜㅜ
Trackback 0 Comment 0
2007/09/24 18:59

16진수

사용자 삽입 이미지

옛날에 썼던강좌입니다.
지금도 써먹을 수있네요~
출처는 이곳~
출처를 꼭 밝혀주세요
Trackback 0 Comment 1
2007/07/15 22:21

지뢰찾기 맵핵 만들기! 2편 - 코딩편

지뢰찾기 맵핵 소스





준비물 :

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


이런식으로 하면 되겠다.
더이상은 소스를 보면 알만큼 알게될 것이다.
첨부한 소스를 참고하기 바란다.

Trackback 0 Comment 2
2007/03/25 21:20

하드웨어(HardWare)란?

하드웨어(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)
Trackback 0 Comment 1
2007/03/03 16:01

지뢰찾기 맵핵 만들기! 1편 - 구조파악

타겟(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편 - 코딩편' 이 되겠다.
Trackback 0 Comment 3
2007/03/02 22:11

기본 준비물

우리는 Revese Engineering을 하기위해
몇가지 준비물을 챙겨야 한다.
준비물은 툴(Tool)이라고 한다.
분석은 한 방향으로만 하는것이 아니라 다방면에 걸쳐서 이루어 진다.
그래서 여러가지 준비물이 필요하다.

1. 메모리 분석툴

T-Search : 가장 기초적인 툴이며, 이 툴을 다룰줄 알아야 뭘 하든 말든 한다.
오토핵 기능은 여러분이 꼭 익혀야할 기능중하나며, 치트엔진 이전에는
폭발적인 인기를 누렸다.
제작자 홈페이지는 안가봐도 된다.
왜냐하면 제작자는 T-Search 1.6 버젼까지만 내고
홈페이지가 사라져 버렸다.
제작자 홈페이지 : http://fly.to/mtc




Cheate-Engine : 고급자용 툴이다. 메모리 수정뿐만 아니라,
디버거 기능도 지원한다.(물론 미약하다. 하지만 무시 못한다.)
소스가 공개되있기 때문에 여러 변종이 존재하지만,
변종의 기능은 Cheate-Engine을 여러 보안 프로그램으로부터 숨겨주는 기능을 하며,
그러한 패치가 적용된 치트엔진을
UCE(Undetected Cheate Engine)이라고 한다.
물론 공식적인 버젼에서는 스텔스 기능(숨겨주는 기능)이 없다.
여기서는 일반적인 버젼만 올린다.
제작자 홈페이지에 포럼도 있으며, 여기에 많은 정보들이 올라와 있다.
물론 영문이다.
제작자 홈페이지 : http://www.cheatengine.org/




2. 패킷 분석툴

인터넷으로 올라가는 패킷을 가로챈다.
이것은 유저 수준의 패킷분석이라 미약하기도 하고,
보안프로그램에서 쉽게 막힌다.
백신 프로그램이 있으면 바이러스로 감지하나 바이러스가 아니다.

WPE : 정식명칭은 Winsock Packet Editor
뭐 적당히 쓸만한 툴이다.
한 프로그램에만 적용해 쓸 수 있다.
제작자 홈페이지 : http://wpepro.net/



WinsockExpert : 여러프로그램에 잘 감지되지않도록 설계되었지만...
요즘엔 감지 된다.
전문가(Expert)용이다.
역시 한 프로그램밖에 스니핑(Sniffing)한다.
중국인이 만든것같다.
제작자 홈페이지 : http://www.dxqsoft.com/



3. 패킹 스캐너툴
패킹이 무엇인줄 모른다면 밑에 '열기'를 눌러보자.

열기


어떠한 패킹이 되어있는지를 알려주는 툴을
패킹 스캐너툴이라고 한다.

PEiD : 쉽고 빠르고 간편하게 무슨 패커로 패킹되있는지 알려준다.
단, PE헤더에 대한 자세한 정보는 다른 툴을 사용하는것이 좋다.
제작자 홈페이지 : http://www.peid.tk/



4. 파일 수정 분석 툴

Ultra Editor : 울트라 에디터로
HEX편집기로도 그만이지만 PHP수정도 가능하고 기타 다른 파일 수정도 가능한데다.
하일라이트 기능이 있어서 좋다.
다만 HEX편집기로 할떄는 너무 군더더기가 많아서 힘들다고나 할까?

제작자 홈페이지: http://www.idmkorea.com
(한국 총판 홈페이지다. 영문 공식은 알아서 찾도록)


12.10b버젼이다. 시리얼 포함했으니 잘 쓰길 바란다.

HEX Compariosn : HEX 비교 분석툴
그럭저럭 쓸만하지만, 이름은 널리 안알려진듯?

제작자 홈페이지: http://www.exeicon.com


1.90버젼이다. 크랙 포함했으니 잘 쓰길 바란다.
Trackback 0 Comment 1
2007/03/02 21:51

패킹(Packing)에 대하여

프로그래머들은 자신들의 소스가 외부에 공개되는것을 바라지 않았습니다.
그래서 그들은 여러가지 방법을 쓰게 됩니다.

1. 디버거(Debugger)가 실행되면 프로그램에 알려주는 API를 사용하였습니다.
그러나 역 어셈블러툴로 파악이 가능하였으며
디버거로도 몇가지 간단한 조작을 하면 해제가 가능합니다.
(여기서 설명하는 API는 IsdebuggerPresent입니다)

2. 패킹(Packing)을 사용하게 됩니다.
패킹이라는것은 실행을 하면 암호화된것을 여러가지 방법으로 풀어서
메모리에 풀어져, 프로그램을 종료하면 할당된 메모리가 사라지기 떄문에
암호화 하는 방식으로 진행되었습니다.
그러나 곧 이런 패킹도 원리가 밝혀지면서
언팩킹(Unpacking)이 가능합니다.
몇몇 패커(Packer)들은 손쉽게 프로그램 클릭 몇번으로
언팩킹이 가능하지만, 아주 어려운 것들은
수동(Manual Unpack)으로 해야합니다.


패킹이나 디버거를 막는 API들은 한두 가지가 아닙니다.
대표적인 패커 몇개를 소개하겠습니다.

1. UPX
프리웨어며, 압축률이 매우 좋다. 그러나 코드 암호화는 기대하지않는것이
좋다.  제작자 홈페이지에서 패킹과 언패킹을 할 수 있는
패커&언패커를 제공한다.
99.5%가 쉽게 풀린다고 보면 된다.
소스도 공개되어있으니 들르는것도!
제작자 홈페이지 : http://upx.sourceforge.net/

2. Asprotect
상용이라서 돈을 주고 사야한다. 압축률은 오히려 용량이 늘어나는 정도로
매우 좋지 못하다. 그러나 코드 암호화는 매우 좋다.
강해서 수동이 아니면 거의 풀 수 없을 정도다.
언패커는 제공하지 않지만(상용 패커는 대부분 암호화가 목적이기에
당연히 언패커는 제공하지 않는다.) 비공식적인 언패커(해커들이 만들었습니다.)
가 있다. 하지만 그 언패커로 풀리는 경우는 아직 보지 못하였다.
그래서 수동으로 언팩하는게 이것으로 하면 대부분 풀린다.
돈주고 사야되는게 원칙이지만 찾아보면 많다~(물론 불법)
제작자 홈페이지 : http://www.aspack.com/

또한 이런 패킹을 하면 코드를 숨길 수 있기때문에
백신툴에도 감지가 되지 않을 수도 있다.

Trackback 0 Comment 1
2007/03/02 21:32

Reverse Engineering에 관하여

여러분은 EXE파일을 컴퓨터를 사용하다 보시면
많이 보시게 될것입니다.
아시다시피 컴퓨터는 사용자의 명령이 없으면 동작하지 않습니다.
그럼 명령어는 어디에 저장되있을까요?
답은 EXE파일 입니다. 그럼 거꾸로 생각하면 명령어가 담겨있는 EXE 파일을
해부하면 어느시점에 무엇이 실행되고 처리되는지를 알 수 있습니다.
아쉽지만 이 명령어는 인간이 쉽게 볼 수 없습니다.
왜냐하면, 프로그래머는 프로그램을 작성하기 위해
소스를 입력합니다. 그 소스는 인간이 쉽게 알아 볼 수 있지만,
기계에게는 단지 쓸모없는 문장의 연속입니다.
그래서 컴파일러가 컴퓨터에 맞게 바꿔줍니다.

추가 합니다 : 2007. 3. 2
컴파일러는 소스를 분석해 obj파일을 만들고 linker가 exe를 만들기 떄문이죠
- 제리클님이 지적하셨어요.
감사합니다.

그리고 그 후 EXE파일이 나오는데, 모두 컴퓨터만이 알아 볼 수 있죠.
그래서 어떤 사람들은 역컴파일러를 만들기도 합니다. 역 컴파일러는
이미 컴파일된 EXE를 인간이 볼 수 있는 소스의 형태로 돌려주는 것이죠.
하지만 대부분 완벽하지 않습니다. 왜냐하면 돌리는것이 너무나 힘들기 떄문이죠.
그래서 다시 방향을 바꾸어, 그렇다면 기계어 보다 한단계 위여서
바꾸기가 쉬운 어셈블러라는 언어를 사용하고 수정한다면 어떨까요?
네, 바로 그게 Reverse Engineering입니다.

Trackback 0 Comment 1