안녕하세요. EroGame 이며 前피시 입니다.
강좌를 어떻게 올릴까하고 고민하고 고민한 끝에 결국에는 이리저리 망설이지 말고 생각나는대로 올리기로 했습니다.
이 내용은 어디까지나 제가 찾는 방법을 기준으로 작성하기 때문에
다른 분과는 약간(?) 다를 수도 같을 수도 있습니다.
이점을 유의해주시고 읽어주세요.
앞으로 쓸 강좌는
영상으로 나올때도 있을것이고
글로만 작성할때도 있을지도 모르고
이미지와 글로 작성할 수도 있습니다.
전부 영상으로 하기에는 너무 몸이 버티질 못하기 때문에 양해를 구합니다. ^-^
!주의!
피시는 코드를 파는데 무조건 중시하는 것이 있습니다.
첫째. 코드로 내놓는건 띄어쓰기를 제거하지 않아야 하며, 글잘림이 없어야 한다.
둘째. 디나이워드의 무시설정도(PASS)를 사용하거나 Cmd필터를 사용하는 등 원문이 첫째에 반하는 형태로 나오거나 저런 필터를 사용하지 않고서는 게임이 튕기는 코드는 버려야 한다.
셋째. 모든글을 최대한 번역하는 코드를 내놓고 추후에 다른 미번역 글이 발견되면 코드를 업데이트 한다.
먼저 저도 인간이기 때문에 코드 찾기를 귀찮아 합니다.
그래서 다소 요령도 피우고 야메도 쓰고 하지요.
근데 강좌 쓰기도 여간 힘든게 아니군요.
시간 소비가 장난이 아닙니다. ㅠ
시작합니다.
저번 강좌에서는 간단히 아랄 디버거로 찾을 수 있는 게임에 대해서 알아보았습니다.
요번에는 디버거를 사용해 볼건데요.
디...디버거!! 라며 프로그램을 접하기 두려워도 괜찮아요.
아~주 간단하게 초보자도 따라 할 수 있도록 적어버릴테니까요!
설명 도중 도중마다 사용법이나 단축키를 간간히 적을테니,
무서워하지 마시고 따라와주세요. =ㅁ= b
단, 모르는게 있거나 이해 안갈경우 게시글의 최신화를 위해서 파팟! 댓글로 질문해주세요. ^-^
저번 강좌에서 1~5번까지 스킵하겠습니다.
6-1. 게임을 진행하여 한줄이 나오도록 해봅니다.
보시게 되면 Score에 레지와 스택이 보이고 ()로 Hit 수가 써져있는데요.
이 Hit 는 글자가 출력된 최대 길이 누적량을 보여줍니다.
이미지의 가운데 위쪽을 보시면 [ESP+0x4](1Hit) 이런식으로 1Hit를 기록하고 있네요?
그 살짝 오른쪽을 보면 대사와 무관한, 아니 무관하지는 않네요.
빨간 박스로 처리한 "…" 이라는 문자가 보이시죠?
이곳에서 대사가 나오기 전에 대사의 모든 글자가 한글자씩 보였다가 사라지고
마지막 글자인 "…"이 마지막으로 표시되고 멈춰서 저것만 보이는 상태입니다.
왼쪽에 덤프텍스트의 빨간 박스로 친 "と","ね","…" 세글자가 보이실겁니다.
오른쪽 아래에 게임에서 빨간 박스로 친 글자가 나온것이지요.
(덤프텍스트 좀 위로 올려보니 나머지 글들도 다 나왔었습니다.)
이런 식의 게임은 아랄디버거로는 한계가 있습니다.
(물론, 후커나 ith는 가능하겠지요)
자, 이걸 디버거로 열어서 찾아보겠습니다.
===========================참고===========================
* 아랄디버거에서 나온 주소를 힌트로 찾는건 다른 강좌에서 하도록 하겠습니다.
시간도 많이 걸릴 뿐더러 기반 지식이 부족하다면 이런 접근법은 미루는걸 추천하는 바입니다.
==========================================================
7-1. 디버거로 열어보자.
사용할 디버거는 OllyDBG입니다.
일단 실행해보면 뭔가 우루루 보이는군요.
초기 실행이시라면 간단한 셋팅을 해주셔야합니다.
(다소 디버거의 모양이나 색깔, 배치등 가지고 계신것 다를 수 있습니다. 제가 좋아하는 방식으로 조금 커스텀 했기 때문입니다)
7-1-1. 디버거 초기 셋팅 (한번만 하시면 됩니다)
상단 메뉴를 보시면 Options -> Appearance 를 클릭하면 아래와 같은 창이 뜨는데
Directories 탭 메뉴에서 UDD 디렉토리와 Plugin 디렉토리를 지정해주세요.
UDD는 디버거로 열어볼 실행파일의 복사본과 비슷한 느낌으로 만들어지는데 해당 실행파일을 가지고
여러가지 설정한 것들이나 수정, 직접 기록한 것들을 유지하고 확인하여 볼 수가 있습니다.
Plugin은 OllyDBG 용으로 개발된 부가 기능입니다.
실제로 처음 접하신 분들은 아직 사용할 필요가 없는 부분이므로 살짝쿵 무시해주세요.
(해당 디렉토리는 보통 디버거가 위치한 폴더나 그 곳의 하위 폴더로 존재하는 Plugin 폴더로 지정해주시면 됩니다.)
7-1-2. 디버거 초기 셋팅2
폰트 탭으로 가서 폰트 설정을 해주세요.
저의 경우는 여러 이유에 의해서 이렇게 지정하고 사용합니다.
이유 다적으면 강좌의 내용이 산이 아닌 우주로 날라가버리므로 무시하고 넘어갈게요?
Font 5 -> 일본어 폰트
Font 6 -> 한글 폰트
7-1-3. 디버거 초기 셋팅3
디버거 상단 메뉴에서 Options -> Add to Explorer 을 클릭합니다.
창이 하나 뜬다면 해당 빨간 버튼을 눌러주세요.
마우스 오른쪽 버튼에 디버거로 여는 메뉴가 추가됩니다.
7-2. 평범하게 게임을 열면.
마우스 오른쪽 버튼으로 7-1-3. 에서 설명한 마우스 오른쪽 버튼 방법으로 열어도 되고
바로가기를 디버거에 드래그 앤 드롭으로 놓으셔도 열리고
디버거에서 직접 File -> Open 으로 찾아서 열어도 됩니다.
이렇게 열어보았을때는 실행된 상태가 아닙니다.
가만히 놔두면 UDD가 생성되면서 해당 게임을 살짝 분석하기 시작하고 실행대기 상태에 놓이게 됩니다.
F9 키나 상단에 ▶ 버튼을 누르게 되면 게임이 디버거가 맞물린 상태에서 실행되게 됩니다.
===========================참고===========================
* 이렇게 실행되지 않을 경우에는 실행파일에 디버거로 인한 실행을 막았을 경우가 있습니다.
그럴 때는 7-3 방법으로 해주세요.
==========================================================
7-3. 어태치로 게임을 열면.
게임을 먼져 실행해 놓습니다.
디버거를 열어 File -> Attach 를 클릭하면 조만한 창이 하나 뜨게 되는데
현재 실행된 프로세스 목록이 보이게 됩니다.
(만약 원하는 프로세스가 보이지 않을경우 이창을 닫았다가 다시 Attach 를 눌러주세요. 새로고침 기능이 기본적으로 없습니다.)
이 목록에서 디버거로 볼 게임 실행파일의 프로세스를 찾아 클릭후 Attach 버튼을 눌러줍니다.
디버거가 무사히 들어가게 되면 게임은 멈춘 상태를 유지합니다.
(별다른 플러그인이 없으시다면 기본적인 반응입니다. 기타 특정 플러그인은 바로 실행상태로 넘어가기도 합니다.)
마찬가지로 F9 키나 ▶ 버튼을 눌러서 게임이 돌아가도록 해주세요.
===========================참고===========================
* 위 방법으로도 디버거거 먹히지 않은채 혹은 게임이 다운되서 멈춰있거나 꺼져버린 경우에는
마찬가지로 디버거로 겁탈하는 행위 자체를 막았기 때문입니다.
해당 게임에 대해서 코드 파는 방법은 차후 강좌에서 설명하겠습니다. (데모로 찾는 야메도 가능합니다)
이런 게임은 현 강좌에서는 아무것도 할 수가 없으므로 잠시 포기해주시고 다른걸 잡아주세요.
==========================================================
7-4. 대사로 나오는 원문을 받아오자.
여기까지 오셨다면 게임이 무난히 실행된채 디버거가 열려있는 상태에 오셨겠군요.
아랄 디버거와는 다르게 이것은 글자가 넘어오는 장소를 자신이 직접 찾아야 합니다.
http://polaris.aralgood.com/index.php?document_srl=964565 ( FrigateBird 도 본인입니다. FrigateBird = 피시 )
원문을 따는 방법에는 위 영상처럼 히라가나나 가타가나를 직접 적어서 EditPlus를 이용하는 방법이 있습니다.
(혹은 아랄 디버거에서 한글자씩 넘어오기라도 하므로, 덤프텍스트로 열어서 Hex 값을 미리 적어놓고 와도 됩니다)
실상 저 영상에서는 보여주기 식으로 제작했기 때문에 다소 노가다성이 짙어 보이는데요.
코드 찾는 귀찮음이 강한 피시는 매번 저렇게 찾지 않습니다.
먼저, 디버거에서 Alt + E 단축키를 눌러서 모듈창을 띄웁니다.
그곳에서 현재 겁탈중인 실행파일의 모든 참조 dll 및 본체 목록이 보입니다.
왼쪽부터 차례대로 Base Size Entry Name ..... 등이 보일텐데요.
===========================참고===========================
여기서 겁탈한 exe 파일의 Base 는 보통(일반적으로) 0x400000 위치를 가리키게 됩니다.
만약 이 위치가 0x400000 가 아닌 다른 값이라면 가변 주소이기 때문에
찾은 주소의 offset 값을 아랄에 입력해야합니다.
(ex. Base : 0x10E00000, 찾은 코드 위치 : 0x10E25050, 상대주소(offset 값) : 0x10E25050 - 0x10E00000 = 0x25050 )
(아랄 후킹할때는 모듈 선택을 exe 파일로 선택(dll 일경우는 해당 dll 선택) 코드주소는 0x25050 을 입력하시면 됩니다)
==========================================================
실행파일을 찾아 선택후 Enter 누르면 CPU 창이 해당 모듈을 가리키게 됩니다.
이곳에서 7-3. 인 어태치 방법으로 접근하셨다면 Ctrl + A 키를 한번 눌러주세요.
미묘한 차이를 찾으셨나요? Ctrl + A 단축키가
디버거에게 한번 다시 분석하라고 지시합니다. (점프문이나 스위치문, 함수 등을 보기 쉽게 표기합니다)
이창에 대고 Ctrl + N 키를 눌러 해당 실행파일의 라벨이 붙은 함수 목록을 불러오세요.
(cpu 창에서 오른쪽 버튼 -> Search for -> Name (label) in current module 를 눌러도 됩니다)
그 창에서 바로 textout 라고 입력하시면 해당 함수를 찾습니다.
키보드 입력과 동시에 찾는다고 생각하시면 되겠네요.
===========================참고===========================
해당 함수가 없는 게임의 경우 2중 콜문이라든가 다른 형태로 출력을 하는 게임입니다.
ex. BitBlt, PatBlt, MaskBlt, ExtTextOutA, DrawText, DrawTextExA 등..
지금 강좌에서는 TextOutA 함수로가 존재할때 입니다.
숨겨놓았을 때에는 TextOut 함수로 직접가서 브레이크 포인트를 걸어도 되지만 이번 강좌에서는 설명하지 않겠습니다.
==========================================================
TextOut 함수가 보이면 엔터를 눌러주세요.
다른 조만한 레퍼런스 창에서 이 함수를 직접 부르는 곳들을 리스트로 보여주는데요.
해당 게임에서는 하나밖에 안보이니까 여기다 브레이크 포인트를 겁니다.
(브레이크 포인트 = F2 키를 눌러주세요)
그러면 왼쪽 주소가 빨갛게 물들여집니다.
브레이크 포인트로 지정됬다는 뜻이지요.
7-4-1. 게임을 진행하면 해당 브레이크에 걸립니다.
브레이크 위치로 와서 걸리게 되면 주소가 초록색으로 물들고 오른쪽 아래에 보면
현재 스택(ESP)에 쌓인 값들을 볼 수가 있습니다.
일어 한글자를 보내려고 하네요.
제대로 보이지 않을경우 7-1-2. 에서 설정한 셋팅을 사용해주세요.
Font 5 (일어폰트) 에 지정한 폰트로 선택하면 제대로 표기됩니다.
(일부 한자는 표기되지 않는데 j10n 이라는 플러그인을 사용하면 볼 수 있습니다. Wales 님이 올려놓은신게 있네요. http://polaris.aralgood.com/index.php?document_srl=1914895 )
해당 일어한글자가 보이는 스택을 선택하여 오른쪽 버튼 -> Follow in Dump 를 클릭하면
왼쪽 덤프창에 해당 주소가 가리키는 곳이 보이게 됩니다.
え 0x82 0xA6 이군요.
F9 연타하면 이 TextOut 에 보내는 한글자가 게임에 출력되면서 다음 글자를 받아옵니다.
Hex 값을 F9 연타하면서 메모장에 적어보지요.
82a6 8141 82a6 82c1 82c6 82cb 8163 8163
위 영상보다 빠르게 Hex 값을 구했습니다.(뭔가 별거 아닌데..감격)
7-5. 원문 hex 값으로 메모리를 검색하자.
디버거에서 Alt + M 을 눌러 메모리 맵 창을 엽니다.
여기서 왼쪽 Address(주소) 순으로 정렬이 되어있는데
검색은 위에서 아래로 진행합니다.
마우스로 위쪽 주소를 선택해놓고 검색해야 합니다.
아무대나 클릭해놓고 검색하면 그 클릭한 부분부터 아래로만 검색합니다.
이점 유의해주세요.
바이너리 검색 단축키를 눌러줍시다. Ctrl + B
마찬가지로 조만한 창이 뜨네요.
위에서부터 아스키, 유니코드, Hex 검색입니다.
Hex로 따왔으니 Hex 값에 붙여넣으면 되겠군요.
(붙여넣기 단축키는 Shift + Insert 키입니다. ctrl+v아니에요.)
입력했으면 검색!
주루루루루루룩.
왕창 걸리네요.
(다음 검색은 Ctrl + L 입니다. 메모리 맵을 선택한 상태에서 해주세요.)
주의! 메모리 맵에서 찾은 것은 한 메모리 주소내에 첫번째로 찾은 값만 있다면 덤프로 띄워줍니다.
해당 띄워진 덤프창에서 Ctrl + L 키를 한번씩 더 눌러봐서
보여진 덤프내에 같은 대사가 여러번 복사되었는지도 확인해주세요.
(이 짓거리는 영상으로 보여드리겠습니다.)
7-6. 몇개 찾은 덤프창은 그대로 놔둔채 게임을 진행해봅니다.
다른 대사를 게임내에서 띄운후
덤프창을 전부 한번씩 클릭해봅니다.
(띄워놓은 덤프창은 메모리가 자동으로 업데이트가 되지 않습니다. 클릭시 업뎃이 되므로 찾아놓은 덤프창을 한번씩 클릭해주세요)
2개는 반응이 왔고 나머지 2개는 전대사 그대로네요.
오른쪽 아래것을 보시면 새로운 대사가 있기는 합니다. 좀 떨어진 위치긴 하지만요.
아무래도 이곳은 잠시 대사를 복사했다 오는곳이군요. 너무 가변적인 위치라 버리는게 좋을것 같네요.
위 2개만 살리고 보겠습니다.
7-7. 메모리 브레이크를 걸자.
브레이크 포인트가 해당 명령어를 지나갈때 프로그램을 멈추는것이라는건
대충 따라해보셨다면 짐작하셨으리라 생각됩니다.
메모리에 브레이크를 거는것도 가능합니다.
물론 직접으로 해당 메모리를 참조 하는 곳만 멈추지만요. ^^
메모리 브레이크는 브레이크 포인트와 다르게 딱 한지점이나 한 메모리 내만 가능합니다.
2개소 이상의 메모리 브레이크는 걸 수 없어요. ^-^
찾은 덤프중에 오른쪽게 가장 깨끗해 보이므로(0x00 으로 쓱싹한 곳이기에)
오른쪽에 메모리 브레이크를 걸겠습니다.
대사 부분을 드래그 해서 선택 후 오른쪽 버튼 -> Breakpoint -> Memory, on access 클릭
이렇게 해당 메모리에 브레이크를 걸었습니다.
게임이 이 지역을 참조하는 명령어를 지나는 장소를 알 수 있게 되었습니다.
게임을 진행해볼까요?
7-8. 대사를 메모리에 받아오는 형태 파악하기
이부분이 제일 관건입니다.
많은 사람들이 여기서 모른체 F9를 누르기만 하는 사태가 생기더군요.
물론, FrigateBird 의 영상 강좌에서는 F9 연타 파팟 하는것 처럼 보이던데..
그건 이미 제가 눈에 익어서 걸린 곳들을 대충 보면, "아 이건 이짓하네" 하고 알기 때문에
연타했습니다....(설명하려면 길어요. 너무)
===========================참고===========================
일단 일반적인 형태를 설명합니다.
보통 해당 메모리에 값을 초기화 하는걸 우선적으로 합니다.
(안하는것도 아~주 극소수로 있지만)
초기화 형태는 여러가지입니다. 글을 전부 지우거나?, 앞글자만 0x00 으로 만든다거나?, 4바이트만 0x00으로 민다던가?
등등등....
재수 없는 경우가 한가지 존재합니다.
찾으신 메모리가 대사 뿐만이 아닌 다른 잡~(명령어들) 문자도 같이 사용하는 메모리라면
다음 대사가 올때까지 넘겨야 하니 정신과 시간의 소모가 많아지게 되지요.
처음 접하실때는 순수 대사만 오는 메모리를 찾는걸 추천합니다.
위 게임을 예시로 들면,
예를 들어 2개의 메모리 덤프를 찾아놓았는데 한쪽은 순수 대사만, 한쪽은 명령어와 대사... 이렇게 오는걸
브레이크 걸어서 확인해보았다면 어느쪽을 파고 들어야 할까요? 당연히 전자 겠지요?
하여튼 그렇게 메모리의 초기화가 되면 다른 장소에서 대사를 브레이크 건 메모리에 붙여넣는 작업을 행합니다.
물론 이 붙여넣는 복사 함수에 아랄을 후킹해도 안됩니다.
복사 함수가 대사만 복사하려고 존재할리가 없지요.
프로그램의 효율을 높이기 위해 범용적으로 복사가 가능하도록 공용함수를 자동적으로 생성 및 컴파일 되는건 기본 상식!
따라서 순수대사의 복사가 끝나자 마자! 그 복사함수를 나오면, 어디서 복사함수를 호출했는지 알 수 있지요.
==========================================================
일단 하나 걸렸습니다.
첫번째로 걸린 이곳은 무엇을 하는 곳인지 살펴보도록 할까요?
CMP BYTE PTR DS:[ESI],0 에서 걸렸고 ESI 를 덤프로 보니
아까 메모리 브레이크 걸었던 부분의 대사가 보이네요.
실제 ESI 는 그 주소를 가리키고 있네요.
이 함수가 뭐하는 곳인지는 모르겠지만
시작 부분은 첫번째 화살표고 나가는 부분은 두번째 화살표군요.
시작부분을 클릭해보겠습니다.
이런.........엄청나게 많은 곳에서 콜하고 있군요.
이 함수는 대사만 오는게 아닌 무언가 다른 공용으로 사용하는 함수 인것 같습니다.
이렇게 인자가 많은 곳에서 오는 장소에 아랄을 후킹하면
아랄이 많은 양의 정보를 처리하지 못한채 뻗어버리니 이곳은 후킹걸 필요가 없군요.
단순히 뭐하는 곳인지만 파악하고 넘어갈겁니다.
이 함수의 큰 형태만 살짝 봐둬서 나중에 다시와도 무시할 수 있도록 뇌세포 1마리 정도 사용해서 기억해주세요.
===========================참고===========================
콜이나 점프를 통애 이곳으로 얼마나 오는지 보는 방법
아래 조만한 창에 오른쪽 버튼 -> Show all jumps and local calls 를 클릭하면 볼 수 있습니다.
다른 방법으로는 Ctrl + K 단축키를 누르면 콜 트리를 볼 수 있습니다.
(오른쪽 위그림, 단점 점프문으로 오는건 안보인다)
더 다른 방법 Ctrl + R 단축키를 누르면 Show all jumps and local calls 에서 본 내역을 레퍼런스 창으로 볼 수 있다.
(왼쪽 아래 큰 창 그림, 제가 자주 쓰는 단축키군요)
==========================================================
F8 키를 이용해 한줄씩 진행해보겠습니다.
0043EBC9 CMP BYTE PTR DS:[ESI],0 <-- ESI 가 가리키는 첫번째 BYTE 가 0 인지 확인한다.
0043EBCC JE SHORT TSSystem.0043EBFA (대사가 들어있어서 0 이 아니므로 점프하지 않네요)
0043EBCE MOV EAX,ESI EAX 에다 ESI 주소를 그대로 복사
0043EBD0 LEA EDX,DWORD PTR DS:[EAX+1] 대사의 다음 바이트 위치(EAX+1)를 EDX에 복사
0043EBD3 /MOV CL,BYTE PTR DS:[EAX] 여기서부터~
0043EBD5 |INC EAX
0043EBD6 |TEST CL,CL
0043EBD8 \JNZ SHORT TSSystem.0043EBD3 ~여기까지는
0043EBDA SUB EAX,EDX 현재 지정한 메모리에 대사 총 길이를 구함
0043EBDC INC EAX
0043EBDD PUSH EAX ; /size 대사 길이를 스택에 넣고
0043EBDE CALL <JMP.&MSVCR90.malloc> ; \malloc 해당 길이 만큼 사용 할 수 있는 장소를 생성
0043EBE3 ADD ESP,4
0043EBE6 MOV DWORD PTR DS:[EDI],EAX
0043EBE8 MOV ECX,ESI
0043EBEA MOV EDX,EAX
0043EBEC LEA ESP,DWORD PTR SS:[ESP]
0043EBF0 /MOV AL,BYTE PTR DS:[ECX] 여기서부터~
0043EBF2 |MOV BYTE PTR DS:[EDX],AL
0043EBF4 |INC ECX
0043EBF5 |INC EDX
0043EBF6 |TEST AL,AL
0043EBF8 \JNZ SHORT TSSystem.0043EBF0 ~여기까지는
0043EBFA MOV EAX,1 새로 생성한 곳에 대사를 옮겨넣음
0043EBFF RETN
결론. 이전 대사를 다른 메모리에 길이만큼 생성하여 옮겨넣은(백업)후 나갑니다.
별 쓰잘대 없는 곳이었군요. 백로그를 위해 남겨 놓는 걸까요?
뭐, 이전 대사 였으므로 무시하고 F9 로 이곳을 나가봅시다.
Tip. 나가고 싶은데 브레이크 자꾸 걸려서 짜증나신다구요?
해당 함수에서 나갈 수 있는 모든 RETN 이나 순회루틴(위에서 말한 "여기서부터~~여기까지" 부분) 이후의 지점에서
브레이크 거신뒤 메모리 브레이크를 잠시 풀었다가 F9로 순회루틴 이후 지점이나 RETN 까지 왔다면
다시 대사에 메모리 브레이크를 걸고
방금 걸었던 RETN이나 순회루틴 이후에 걸은 브레이크 포인트를 푼뒤
F9로 다시 진행하면 다른 곳의 걸리는 곳으로 빠르게 갈 수 있습니다.
(이짓거리도 차후 영상으로 보여드리겠습니다)
다음 장소로 갔더니,
아직도 다음대사를 받질 않는군요.
(일일히 설명하면서 달리니까.. 더 힘빠지네요.)
이번에도 전과 비슷하게 free 라는 C 레퍼런스 함수로 대사 지역 메모리를 풀어놓네요.
설명하기 귀찮으니 이미지 없이 패스합니다.
주의! 브레이크가 걸려대는 지점들중 본체 실행파일의 참조가 아닌 타 dll 이나 윈도우 dll 의 지역을 참조한다면 다 쌩까주세요.
ex.)
이런 부분 후킹해야 득도 없습니다.
(비유하면 위에서 말한 공용함수랑 같은 격이니 ㅇㅇ)
어찌 저찌 이런 저런 얘기 하다가 그럴듯 한 함수에 왔습니다.
원문을 가지고 드디어 브레이크 건 곳에 붙여넣는군요.
복사 함수라 하지만 부르는 곳이 한곳이네요.
(그렇다고 해서 방심해선 안됩니다. 저 부르는 곳으로 가서 본 상위 함수는 무대기로 부를 수 있으니까요.)
REP 명령어로 붙여넣는군요.
그림에서 보는 ESI (왼쪽 덤프창)에서 EDI (오른쪽 덤프창) 로 대사를 옮깁니다
일단 장소는 나쁘지 않으므로 0x4217f0 에 브레이크 포인트를 건뒤
대사를 다 붙여넣고 다른 곳에 가보도록 합시다.
"어? 그냥 0x4217f0 위치 찾았으니까 바로 테스트 안해봐요?"
라고 물어보시는 분이 계실듯한데
"........만약 안되면? 다시 하라고? 훗... 돌았나,
귀찮음이 강하면 한번에 싹 찾는거닷!" 라면서 싸움은 계속됩니다.
"대사를 한번 복사해오면 출력전에 어딘가 주루룩 또 거치겠지
잘하면 다른 문자도 거치는 황금같은 장소가 있을 수도 있다고"
이건 놔둔채 이걸 힌트로 다른 곳도 쑤시면서, 더욱 안전한 장소를 찾아보는것도 나쁘지 않은 버릇이에요.
보험? 같은 느낌으로 들었다고 생각해주세요.
여튼 원문대사 복사 끝났다면 다음 갑시다 다음.
아.. 혹시 이게 백로그로 가는 것이면 황당하므로 살짝쿵 글을 변조시킨채 가도록 하겠습니다.
덤프에 대고 Ctrl + E 키를 누르면 바이너리를 편집할 수 있습니다.
복사한 원문은 왼쪽아래 처럼, 붙여넣기 한 메모리 지점은 오른쪽 아래 처럼 해보았습니다.
01하고 02좀 넣어봤어요.
이걸로 게임에서 어떻게 출력된지 보면
어느 부분으로 쫒아가거나 어느 주소는 버려야 한다거나, 차후 감이 잡히겠지요?
요러한 센스도 조큼 발휘하면 코드 찾는 속도 업!
여튼 시끄럽고 F9 진행...
했으나 여기 또걸려서 개행문자와 종결문자도 넣고 간다. ( 0x0A 0x00 )
조...좋은데? 이장소..
여튼 닥치고 다시 진행...
오오...
뭔가 판타스틱~ 한 장소에 걸려주는군요.
콜 문도 그리 많지 않고 적절히 있는데다가
점프 순회도 아니고 스위치문도 없고 복사 함수도 아닌것이.. (뭔가 젖절하다!?)
첫 들어온 부분 Ctrl + R 눌러서 부른 곳 전부 레퍼런스 창으로 보인뒤
오른쪽 버튼 -> Set breakpoin on every command 눌러서 싹다 브포를 겁니다.
왠지 필이 왔으므로 메모리 브레이크는 풀어버리고.
F9 로 속행!
대사 OK!
백로그 O........
아..브레이크 걸렸네. (분위기 깨는데 뭐 있군.)
02로 나온걸 보면 아까 위치에서 01로 수정한 메모리 지역은 복사하기 위해 넘어온 후 아무런 짓도 안했다는게 증명되었군요
디버거에서 상단에 B 버튼 비슷한걸 눌러보면 지금까지 걸은 브레이크 포인트를 육안으로 모아서 확인이 가능합니다.
현재 걸린 위치는 0x42f4ca .. 백로그 보려고 할때 걸린거 보면
여긴 백로그를 출력하기 위한 곳임이 전 틀림없다고 확신합니다. (뭔 자신감이여...)
일단 들어가 보지요. F7 로 Call 문으로 진입합니다.
00420690 PUSH EBP <-- 진입한 함수 처음 위치
00420691 MOV EBP,ESP
00420693 AND ESP,FFFFFFF8
00420696 PUSH -1
00420698 PUSH TSSystem.004ADEB7
0042069D MOV EAX,DWORD PTR FS:[0]
004206A3 PUSH EAX
004206A4 SUB ESP,19C
004206AA MOV EAX,DWORD PTR DS:[4E5008]
004206AF XOR EAX,ESP
004206B1 MOV DWORD PTR SS:[ESP+194],EAX
004206B8 PUSH ESI
004206B9 PUSH EDI
004206BA MOV EAX,DWORD PTR DS:[4E5008]
004206BF XOR EAX,ESP
004206C1 PUSH EAX
004206C2 LEA EAX,DWORD PTR SS:[ESP+1A8]
004206C9 MOV DWORD PTR FS:[0],EAX
004206CF LEA EAX,DWORD PTR DS:[EBX+54]
004206D2 LEA ESI,DWORD PTR DS:[EAX+1]
004206D5 XOR EDX,EDX
004206D7 MOV CL,BYTE PTR DS:[EAX] <-- 아까 대사가 걸린곳 (여기서 위로올라가며 육안으로 볼거임)
004206D9 INC EAX
004206DA TEST CL,CL
004206DC JNZ SHORT TSSystem.004206D7
.....................
자 별거 없습니다.
저 EAX 를 어떻게 받아왔는지 0x4206D7 위치부터 육안으로 거슬러 올라갑시다.
조금 올라가니 004206CF LEA EAX,DWORD PTR DS:[EBX+54] 가 보이네요.
EBX+0x54 위치를 EAX보고 가리키라고 하는군요.
그럼 EBX는 어떻게 불러오나 또 올라가면서 봅시다..
.....
...
.
응? 없네? 끝?
그렇다면...
아래 덤프창을 클릭하고 Ctrl + G 키를 눌러 EBX+0x54 를 처봅시다.
오오.. 예상이 맞군요.
흐흐히히 (정신줄 놓았구만 이 양반)
그럼 겸사 겸사 comment 기능도 써가면서 놀아볼까요?
(이짓은 안해도 됩니다만. 여러분이 알면 유용하게 쓰일지도 모르기 때문에?)
단축키는 ; 를 눌러도 되고 오른쪽 버튼에 Comment 를 클릭해도 됩니다.
아까 들어온 0x42f4ca 에 백로그를 할때 걸렸으니까... 저렇게 써보고.
브레이크 목록 창에서 해당 지점을 선택하여 스페이스 바를 누르면
Disabled 로 변합니다. 그러면 CPU 창에 음영이 사라지지요?
브레이크가 풀리긴 했지만 브레이크 포인트 목록에는 지점이 살아있기 때문에
간단하게 스페이스바로 브레이크를 풀었다 걸었다 할 수 있습니다.
코멘트도 나오니 좋지요?
일단 백로그는 제외하고 대사를 진행할때 어디 걸리나 보고
대사를 전과 마찬가지로 아무렇게나 수정해서 진행후 백로그를 봤더니 백로그도 겸사겸사 수정되네요.
그래서 백로그 위치는 파기! 0x42f4ca 는 버려도 되네요.
대사출력만 번역되도 백로그까지 영향가는데 굳이 백로그를 따로 코드 딸 필요는 없으니까요.
7-9. 아랄 적용 해보겠습니다.
위치는 421857 에 인자는 EBX+0x54
(왜 [EBX+0x54] 가 아니냐구요? 위에서 설명한 004206CF LEA EAX,DWORD PTR DS:[EBX+54] 에서 LEA가 아니고 MOV 였다면 [EBX+0x54] 겠지만 LEA는 위치를 가리키라고 하는 명령어라서 포인터가 아니기에 EBX+0x54 입니다.)
포인터가 이니기에 메모리 덮어쓰기, 버퍼크기 무시!
대사 .... OK!
백로그 ... OK!
8. 영상으로 해보자.
---영상은 아직 준비중입니다---
==============================================================================
뭔가 양이 엄청 많군요.
스크롤 압박에 대해서는 사과드리옵니다.
일단 디버거로 찾는 간단하고도 무식한 방법을 선사하면서
약간의 설명도 넣었지만 많~~~~~~~~~이 부족하군요.
그냥 생각나는데로 타이핑하면서 써버렸기 때문에
뭘 썻는지 도통 기억이 안납니다만....
뭔가 미약하거나 궁금점(이 강좌내에서)이 계신다면 질문해주세요.
앞선 내용의 궁금점은 차후 그런 내용이 나오는 강좌에서 질문 해주시면 좋겠습니다.
(이하, 이보다 전 내용의 궁금점은 전 강좌의 댓글에서 부디..)
이글 읽고서 FrigateBird ( = 피시 ) 영상강좌 1번 보면 그나마 전보다야 낳게 접할지도...
..........그.. 솔직 이번화부터 못따라 올것만 같은 사람들이 눈에 선해!?
ㅠㅠ 만약 이번 강좌를 마스터한 당신!
모든 에로게임의 추가적으로 30% 게임의 코드를 팔 능력을 얻었습니다!
본 강좌는 무단으로 다른 곳에 기재하는걸 금합니다.
아니, 허락 맞고도 금합니다. 데헷~♥