2012년 5월 19일 토요일

리버싱 기본

사실 리버싱은 재미는 있지만 나이 들어서 할 건 안된다.

한번 성공으로 많은 것들을 거머쥐면 좋겠지만...

그건 사주 받거나 청탁, 혹은 협박등의 단어들과 매치되겠지.

뭔가 생산성있는 것을 기대하기는 힘들기 때문이다.

그래도 재미는 있는 분야니까 많은 분들이 해 봤으면 한다.

창조적이진 않지만 개발할 때 여러가지를 생각하게 해주는 소스를 제공한다.

--------------------------------------------

준비물 : Disassembler
Debugger
좋은 문서 편집기/작성기
Hex editor


1. Disassembler
assembler 는 어셈블리로 만든 소스파일(source file)을 기계어로 번역(assemble)해주는 것이다. TASM(Turbo ASeMbler) 같은것이 있다. 어셈블리어는 프로그래밍 언어중의 하나이다.

ex)
.mode small
.code
mov ah, 2h
mov dl, 2ah
int 21h
int 20h
end

이런 소스 파일을 어셈블러를 이용해서 실제로 실행 가능한 프로그램을 만든다.

Disassembler는 이 반대의 역할을 한다. 즉, 실행 가능한 파일로 부터 그것의 소스 파일을 얻어 낸다.

disassembler에도 여러가지가 있다. WCB, Sourcer, W32dasm 등이 있다.

한마디로, Disassembler로 우리가 크랙하고자 하는 프로그램을 '역번역(Dis-Assemble)'해서 그 소스 파일을 얻어 낸다. 그리고 크랙을 하기 위해 필요한 부부늘 살펴 보아서 그 코드를 우리가 원하는 대로 바꾸는게 크랙이다. 그럼 코드를 어떻게 바꿀까? 이 역할을 하는 거시 바로 Hex Editor이다.

2. Debugger
쉐어웨어들은 나름대로 하나 둘씩, 혹은 그 이상의 버그(Bugs For Bucks)를 갖고 있다. 그 버그를 고치는걸 크랙이라고 부른다. 어떤 것들은 글자(사용자 이름)와 숫자(등록 번호)를 제대로 짝지어 주지 않으면 제 기능을 다 하지 못하는 버그를 갖고 있고, 또 어떤 것들은 마치 우유나 통조림 처럼, 유효기간('Best Befor' Bug)이 지나면 쓸모 없어지는 것들도 있다.

위에서 말한 것처럼 Disassembler로 소스 파일을 얻고, 그걸 분석해서 크랙을 할 수도 있겠지만, Debugger를 이용하는 방법도 있다. 가령 위에서 본 코드중에서

mov ah, 2h -1
mov dl, 2ah -2
int 21h -3
int 20h -4

편의상 행번호를 붙였다.
보통 프로그램을 실행하면 이런 행들에 대응하는 코드가 주욱 실행된다. 가령 위의 프로그램을 실행시켰다면 1행부터 4행까지 순식간에 실행된다. 우리가 느낄수도 없을 만큼의 짧은 시간동안...

하지만 Debugger를 이용하면 우리는 한 행, 한 행씩 실행 할 수 있다. 그러니까, 우선 mov ah, 2h 라는 1행을 실행하고, 그에 따른 여러가지 컴퓨터 내부의 상태를 살펴본 다음, 2행을 실행하도록 할 수 있다는 말이다. 그렇게 해서 우리는 버그를 어떻게 고칠 수 있을지 알게된다.

소스 파일을 이용하는 방법과 비슷하지만, 이 방법은 직접 프로그램을 실행시키면서 한다는 데 그 다른 점이 있다.

디버거의 경우도 종류가 많다. 위에서 말한 W32Dasm같은 경우는 디버거로도 사용할수 있다.(물론 디버거로는 형편 없는 기능이다) 그리고 누구나 다 갖고 있을 dos의 debug.com(debug.exe)도 역시 디버거 이다.(아마도 스스로 그렇게 주장하긴 좀 민망할테지만...) 디버거 중 가장 강력하고 많은 사람들에게 사랑받고 있는 것은 softice이다. numegasoft에서 제작한 디버거인데 정말 훌륭하다. 인터넷에도 이미 크랙되어진 softice를 쉽게 구할 수 있을 것이다.


※ soft ice tip ---------------------------------------------------------------------------
softice를 실행시키는 도중에, 어떤 명령어를 내리면(자세히 말하자면, 중단점-breakpoint-을 설정할 때), symbol not loaded..어쩌구 하는 에러가 나오는 경우가 있다. 그에 대한 설명은 softice를 다운 받은 곳이나, 아니면 softice의 자체 매뉴얼(아주 간단한 것만 설명되어 있는 작은 매뉴얼)에도 이미 써 있는 내용인데, 간단히 말하자면,

; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory
EXP=c:\windows\system\kernel32.dll
EXP=c:\windows\system\user32.dll
EXP=c:\windows\system\gdi32.dll
;EXP=c:\windows\system\comdlg32.dll
;EXP=c:\windows\system\shell32.dll
;EXP=c:\windows\system\advapi32.dll
;EXP=c:\windows\system\shell232.dll
;EXP=c:\windows\system\comctl32.dll

winice.dat를 살펴보면 위와 같은 내용이 있다. 응용 프로그램이 사용하는 여러 가지 함수들에 대해 중단점(breakpoint)을 설정하기 위해서는, kernel32.dll과 user32.dll, gdi32.dll들을 sice가 시작할 때 함께 열어 줘야 한다. 위에서 처럼 kernel32, user32, gdi32 앞에 있는 세미 콜론(;)을 지워 주는 것이다. 그렇게 해야 sice가 시작할 때 이런 dll들을 함께 열 수 있다.
(이런 dll이 windows\system디렉토리 내에 있지 않다면, 컴퓨터에 적당하게 path를 고쳐 줘야 한다.)

아직 이런 말들이 이해가 되지 않을 수도 있있는데, GetDlgItemTextA라는 함수는 user32.dll이라는 파일에 속해 있는 함수이다. 따라서 우리가 sice에서 GetDlgItemTextA라는 함수에 대해 중단점(breakpoint)을 설정하려고 한다면 user32를 이용해야 하는 것이다. 이렇게 예를 한 번 들어 보자. C 프로그래밍에서 pow()라는 함수를 사용하려고 한다면, math.h를 열어 줘야 하는 것과 비슷한 이유라고 생각하면 되겠다.
(참고삼아 이야기하면, gdi는 폰트나 비트맵같은 그림에 관계 있는 객체(pens, brushes, bitmaps, fonts, and Device Contexts)를 다루고, user는 창이나 메뉴, 아이콘, 시간, 메세지, 클립보드, 네트워크 따위를 다루고, kernel은 메모리나, dll, 프로그램 열기 등을 담당한다고 한다.)

한가지더, softice는 윈도우와 함께 시작한다. 무슨말이냐 하면, 윈도우를 시작하고 난 후에 softice를 다른 응용프로그램 처럼 실행 할 수 없다는 것이다. 그러니까 윈도우와 softice를 함께 시작해야 한다. 그런데 softice를 함께 사용할 필요가 없을 때도 당연히 있을 테니, 멀티 부팅을 사용하는것이 편리하다.
----------------------------------------------------------------------------------------

3. 좋은 문서 편집기/작성기
이 '좋은' 문서 편집기는 disassembler를 이용한 방법에서 필요하다. 소스 파일을 열어 보아야 하니까 ^^;; 그런데 보통 소스 파일이 Mega Byte 단위의 크기를 갖는다. 보통 10mb 안팎이다. 그러니 이런 소스 파일을 다루기 위해선 정말 '좋은'문서 편집기가 필요하다. Micro$oft사의 M$Word따위로는 엄두도 낼수 없다. 우리 '한글'로도 어려울 것이다. 시중에 나와 있는 '좋은'문서 편집기 중에서 자기한테 익숙한것을 사용하면 된다.

4. Hex Editor
이 hex editor가 왜 필요한지는 앞에서 말했다. 원하는 대로 코드를 바꿔줄 때 필요하다. hex editor는 정말 많이 있다. PSEDIT.EXE라고 하는것도 좋다고 한다.(안써봐서 모름 ^^;;) 역시 이것도 자기한테 익숙한것을 사용하면 된다.

hex editor로 코드를 바꾼다는게 무슨뜻일까? 아까 위에서 봤던 그 어셈블리어 소스 파일을 기억할것이다. 그중에서 mov ah, 2h라는게 있었다. 이건 어셈블리어에서 하나의 '명령'이다. 2h라는 값을 ah레지스터에 옮겨라 라고 하는 뜻의 명령어 이다. 그 뜻은 잘 몰라도 지금은 상관 없다.이 어셈블리어 '명령'은 그에 대응하는 기계어 코드로 바뀐다. 그래야 컴퓨터라는 놈이 그걸보고 알수 있는 것이다.

그러면, 왜 하필 16진수를 사용하는 것일까? 컴퓨터는 2진수로 '생각'한다. 2진수는 0과 1, 이렇게 두가지의 숫자로만 수를 나타낸다. 이것은 컴퓨터로 봐서는 전압이 높은가(1), 낮은가(0)로 이해 할 수 있는 것이다. 즉 우리는 0과 1의 조합에 어떤 의미를 부여할 수 있고 그것을 컴퓨터가 이해할 수 있게 하므로써 컴퓨터를 동작하게 하는 것이다. 그런데 2진수와 16진수와는 어떤 관계가 있다는 것을 알것이다. 가령 2진수 10001011은 16진수로 바꾸면 8B가 된다.
즉,

1000 1011 <---- 2진수
| |
8 B <---- 16진수

인 관계에서 볼 수 있듯이, 2진수를 네 자리씩 묶어서 각 묶음을 16진수로 고치면 2진수와 16진수와의 변환이 아주 쉽다는 것이다. 즉 실은 컴퓨터라는 놈은 1011010000000010 이라는걸 이해하고 있다는 것이다. 우리는 그것을 좀 보기 좋게 16진수로 B402라고 나타내는 것이다. hex editor는 이런 것들의 값을 바꿀때 쓰이는 것이다.



[자료출처] Kurt 플러스의 강좌

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...