WOWPaper- linz_starcraft maphack.hwp

Similar documents
K&R2 Reference Manual 번역본

C프로-3장c03逞풚

예제와 함께 배워보는 OllyDbg사용법

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

1장 윈도우 프로그래밍 들어가기

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++ Programming

BMP 파일 처리

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

In this tutorial i'll try to cover all of the known methods(or at least, those that I know =p) of injecting dll's into a proce

Microsoft PowerPoint - [2009] 02.pptx

chap 5: Trees

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - C++ 5 .pptx

03장.스택.key

PowerPoint 프레젠테이션

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

C++-¿Ïº®Çؼ³10Àå

특허청구의 범위 청구항 1 앵커(20)를 이용한 옹벽 시공에 사용되는 옹벽패널에 있어서, 단위패널형태의 판 형태로 구성되며, 내부 중앙부가 후방 하부를 향해 기울어지도록 돌출 형성되어, 전면이 오 목하게 들어가고 후면이 돌출된 결속부(11)를 형성하되, 이 결속부(11

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

1장. 유닉스 시스템 프로그래밍 개요

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

5.스택(강의자료).key

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

untitled

C++ Programming

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

chap10.PDF

본 강의에 들어가기 전

Microsoft PowerPoint - chap06-5 [호환 모드]

본 발명은 중공코어 프리캐스트 슬래브 및 그 시공방법에 관한 것으로, 자세하게는 중공코어로 형성된 프리캐스트 슬래브 에 온돌을 일체로 구성한 슬래브 구조 및 그 시공방법에 관한 것이다. 이를 위한 온돌 일체형 중공코어 프리캐스트 슬래브는, 공장에서 제작되는 중공코어 프

Chapter_02-3_NativeApp

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

UI TASK & KEY EVENT

슬라이드 1

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

Infinity(∞) Strategy

MFC 프로그래밍

02 C h a p t e r Java

KAA2005.9/10 Ãâ·Â

Chapter #01 Subject

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

Chapter 4. LISTS

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

슬라이드 1

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

Index

금오공대 컴퓨터공학전공 강의자료

02장.배열과 클래스

Frama-C/JESSIS 사용법 소개

목차 1. 키패드 (KeyPAD) 2. KeyPAD 를이용한비밀번호입력기

untitled

Microsoft PowerPoint - chap01-C언어개요.pptx

PowerPoint Template

04장 메시지 처리 유형

ABC 11장

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - 04windows.ppt

설계란 무엇인가?

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Content 1. DLL? 그게뭐야?

슬라이드 1

/chroot/lib/ /chroot/etc/

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

untitled

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

untitled

PowerPoint 프레젠테이션

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

vi 사용법

ePapyrus PDF Document

유니티 변수-함수.key

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

6주차.key

PowerPoint 프레젠테이션

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

좀비프로세스 2

슬라이드 1

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - Chapter 1-rev

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Transcription:

스타크래프트맵핵제작하기 DLL Injection 을이용한! 린츠 q_c@naver.com

Content 1. 목적 1 2. 맵핵이란무엇이며준비해야할것들 2 3. 프로그램으로만들자! 11 4. 실험및결과 19 참고문헌 22

1. 목적 DLL Injection을공부하면서지뢰찾기맵핵을제작해볼기회가생겼는데, 그와비슷한방법으로스타크래프트맵핵도가능할것같아도전해보았고, 엄청난삽질을경험한끝에그렇게단순한방법으로는블리자드라는큰벽을넘을수없다는것을깨달았으나포기하지않고계속해서삽질에매진한끝에한지인의도움으로스타크래프트맵핵을, 부족하지만구현하는데성공하였다. 그리고 3일도안되서다잊어먹는망할기억력을떠올리며혹시나잊어버리더라도나중에이문서보고참고할수있도록대략적인방법을서술하게되었음. 이문서는개인의공부를위한목적으로작성되었으며, 이를악용할시에모든책임은당사자에게있다. 아무튼이문서를작성할당시에는스타크래프트 1.16버전이었고, 시간이지난현재배틀넷에서는전혀사용이불가능하기때문에, 날림으로작성된부족한문서를공개해본다. - 1 -

2. 맵핵이란무엇이며준비해야할것들 맵핵이라는것을모르는사람이라면아마스타크한번안해보신꼬꼬마이시거나너무정직하게게임에임하여부정한방법따위나와전혀관계없다라는생각을가지신분일것이다. 따라서맵핵에대해서간략히설명한다. 맵핵이란말그대로맵을전부다보여주는프로그램을말한다. 이를테면김린츄씨와바램뵹이신나게스타크래프트를하고있는데, 정직한바램뵹이김린츄씨몰래리버를셔틀에태워서빙글빙글돌아기지뒤에서슬쩍내려놓으려고할때김린츄씨가맵핵이라면이미밝혀진맵에바램뵹의셔틀이몰래몰래접근하는것을파악하고굼벵이리버씨가내리자마자다크로슬컹슬컹썰어주시는시츄에이션이나오게만드는것이가능하다. 퍽이나이상한예를들어서미안하게생각하나본인은이문서를공개할생각이없으므로웃으면서넘어가주길바란다. ( 바램바지못미 > ㅁ <) 그림 1 스타크래프트맵핵 자, 이제맵핵이무엇이라는것도알았고, 본격적으로맵핵을만들기위해준비해야할것들을알아보자. 우선분석을해야한다. 스타크래프트라는게임이어떻게돌아가고있는지파악하기위해리버스엔지니어링을해야할필요가있다. 이때필요한것이올리디버거이며, 아이다이다. 물론스타크래프트전체를분석한다는것은아니고맵을그리는부분만을중점적으로보면된다. 사실리버싱을하면서코드를수정해야한다. 가장중요한작업은여기서다하는편이고, 나중에어떤코드를어떻게수정해야되는지알아내게되면 DLL Injection을이용해프로그램을만들것이다. 물론다른여러방법이있을수있겠지만적어도김린츄씨는이런방법을사용했다. 잊어버릴뻔했는데가장중요한스타크래프트를빼먹지말자. 간단한요약! 올리디버거, 아이다Pro(hex-ray), 스타크래프트 1.16-2 -

3. 맵핵을위한리버싱 이제리버싱을시작해보자. 필자는하나하나코드를읽어가며정확하게분석해가며이루틴은여기사용하고저루틴은저기사용하는구나! 라고말할수있는능력이되지않기때문에, 약간추상적으로말하자면하나의실마리를찾고이것을이용해다음실마리를찾아의심가는코드를수정해보고안되면이건아닌갑다.. 하는비상한방법을사용했다. 물론시간은엄청걸리고무한삽질로인해땅을많이파야하는힘든작업이다. 다음은위에서언급한방법을바탕으로스타크래프트맵핵을제작하는과정 ( 리버싱 ) 을다룰것이다. 나는그따위귀찮은작업안해도일일이분석하면서다잘할수있어! 라면그냥이문서끄고앗싸리맵핵열심히만들면된다. 스타크래프트버전에따라주소들이달라질수있으니주의하기바람. 가장먼저볼것은 sub_4800f0() 라는함수이다. 이함수는스타크래프트의지형을그려주는역할을하는데, 이함수내부의 LABEL_20이라는루틴에서보듯이 v3변수에 v2의값을가지고다음루틴으로점프하게되면모든지형이그려지는것을확인할수있다 ( 미니맵은따로임 ). 다만미네랄이나적의건물들은아직보여지지않는것을볼수있다. 하지만이실마리를바탕으로하나하나해결할수있다. 아래코드를보고그실마리를찾아보자. 그림 2 sub_4800f0 LABEL_20 루틴으로무조건점프하게만들었을때모든지형을볼수있다. 그렇다면 - 3 -

LABEL_20으로가기위한조건이맵을밝히는열쇠가될수있지않을까라는생각을했다면 Great! 바로그거다. 우리가찾아야할것은위조건문에서보듯이 dword_6d0ef4의값과 dword_6d0efc가 1임을비교하는루틴이다. 유닛을그리는루틴이나, 미네랄을그리는루틴에서도위와마찬가지로두변수의값을확인함으로서숨겨진지형지물을그릴지말지결정할테니말이다. 우선무조건 LABEL_20으로점프하도록코드를수정하도록하자. 그림 3 수정전코드 그림 4 지형모두보이도록패치 480180에있는점프문은 dword_6d0ef4의조건을따르고있고, 아래 48018A는 dword_6d0efc 의조건을따르고있다. 수정이완료되었으면이실마리를가지고다음을찾아가자. 올리디버거의경우 Search for의 Constant를사용하도록하자. CTRL+L을눌러적당히의심가는부분까지가도록하자. sub_4981c0함수에도착해보면 dword_6d0ef4의값과 dword_6d0efc의값을비교하는루틴이보인다. 이부분이바로본화면의유닛및건물등을그려주는루틴이다. 조건이맞을경우 sub_42d4c0() 함수를실행하도록하고있다. 코드를적당히수정함으로서무조건 sub_42d4b0() 함수가실행될수있도록하자. 이부분을엉뚱하게수정하면모든유닛이보이지않도록할수도있다. 린츄씨의경우드론으로마린을상대하다가갑자기유닛이전부다사라지더니마린총소리가들리더만불쌍한드론만저세상으로갔다는의미없는이야기. - 4 -

그림 5 sub_4981c0 그림 6 수정전코드 4981E5 와 498203 에있는점프문들을 NOP 처리한다 그림 7 유닛및건물보이도록패치 - 5 -

여기까지했다면비록미니맵은보이지않더라도적기지의유닛및건물들을볼수있다. 재미있는건직접탐색하기이전까지는저그의바닥에깔려있는클립이보이지않는다. 그림 8 적저그의기지 이번에찾은 sub_46f840() 함수는원래는보이지않아야할적유닛들을선택할수있도록만들수있다. 지금까지의과정만으로는적기지가보여도위그림의해처리처럼선택이되지않는다. 그림 9 sub_46f840() - 6 -

하지만이번함수는특이하게도 6D0EF4의값이무조건참인것처럼점프문을수정하면오히려시야가밝혀져있는우리기지의유닛들을클릭할수없는사태가발생한다. 그렇기때문에반대로 else에있는조건들에대해서삽질을해야한다. 땅이어느정도파졌다면 dword_57f090의조건에대한점프구문을수정해야된다는것을깨달을것이다. 그림 10 수정전코드 46F8CA 에있는점프구문을모두 NOP 처리하도록하자. 그림 11 시야외선택가능 ( 수정후 ) 이제미니맵부분을수정하도록하자. 위와비슷한방법으로계속진행하면된다. 문서쓰다가퇴근시간이다되어서이제부터는그냥날림으로쓸테니이해하기바란다. 아래 sub_4a3a20() 함수를보면 dword_6d0ef4와 dword_6d0efc의조건이걸려있는것을볼수있다. 물론무조건실행되도록점프문을수정하자. 참고로이부분은미니맵의지형을그리는함수이다. - 7 -

그림 12 sub_4a3a20 4A4A88 의점프문을 NOP 처리한후에 4A3A93 의점프문을무조건점프하도록수정한다. 그림 13 수정전코드 그림 14 지형미니맵수정후 미니맵을확인해보면지형은전부보이지만유닛이나미네랄등은하나도보이지않음을확인할수있다. 유닛과미네랄함수는서로분리되어있지만구조가매우비슷하다. dword_6d0efc를찾아다니다보면 sub_4a4540() 함수에도착할것이다. 여기가바로미니맵에미네랄을표시해주는루틴이다. (PS. 비슷한루틴이여럿있는데두번째이다.) - 8 -

위코드를보면약간복잡하긴하지만 dword_6d0efc가 1이라면 break하고있다. 저루틴은반복문으로이루어져있는데, break하지않으면 sub_4a3ec0() 함수를실행시키지않고 return 하며 break하면 sub_4a3ec0함수를실행시키게된다. sub_4a3ec0함수는미네랄을미니맵에그린다. 따라서무조건 break해서빠져나가도록점프문을수정한다. 그림 16 수정전코드 4A4621 의점프문을 NOP 처리하자. 그림 17 미니맵미네랄수정후 - 9 -

sub_4a46a0() 함수가미니맵에유닛을그려주는함수이다. 미네랄때와마찬가지로수정해주면된다. 코드가유사하기때문에자세한설명은생략한다. 그림 18 미니맵유닛및건물수정후 맵핵을위한코드는모두수정했다. 스타크래프트상에서보면재대로동작하고있음을확인할수있다. 그림 19 스타크래프트맵핵 ( 리버싱中 ) - 10 -

3. 프로그램으로만들자! 리버싱을완료했으니 DLL Injection을이용해서프로그램으로만들어보자. 우선수정해야할코드와그역할을표로정리해보면다음과같다. 지형그리기 480180 90 90 48018A EB 유닛및건물그리기 4981E5 90 90 498203 90 90 적유닛클릭가능 46F8CA 90 90 90 90 90 90 미니맵지형 4A3A88 90 90 4A3A93 EB 미니맵미네랄 4A4621 90 90 미니맵유닛및건물 4A4779 90 90 표 1 수정목록테이블 DLL Injection에는여러가지방법이있지만여기서사용할방법은 CreateRemoteThread를이용해 LoadLibrary함수로 DLL을동적으로맵핑시키는것을사용할것이다. 또한 DLL 내부에서서브클레싱을사용하여특정키가눌러졌을때맵핵을작동시키게만들것이다. DLL Injection의자세한방법은생략하기로하고소스코드만첨부한다. 삽입될 DLL에서코드들을직접수정하도록하고, Home키가눌러질때맵핵이활성화되었다가한번더누르게되면비활성화되도록제작하였다. // mapdll.cpp : DLL 응용프로그램에대한진입점을정의합니다. // #include "stdafx.h" // windows.h - 11 -

#ifdef _MANAGED #pragma managed(push, off) #endif #define PATCHCOUNT 9 struct replace long addr; int size; char data[10]; char backup[10]; patch_data[patchcount]; WNDPROC oldwndproc; bool map_enable; void dataset() int index=0; // 지형 patch_data[index].addr=0x480180; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; patch_data[index].addr=0x48018a; patch_data[index].size=1; strcpy_s(patch_data[index].data," xeb"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; // 유닛및건물 - 12 -

patch_data[index].addr=0x4981e5; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; patch_data[index].addr=0x498203; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; // 적유닛클릭 patch_data[index].addr=0x46f8ca; patch_data[index].size=6; strcpy_s(patch_data[index].data," x90 x90 x90 x90 x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; // 미니맵지형 patch_data[index].addr=0x4a3a88; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; patch_data[index].addr=0x4a3a93; patch_data[index].size=1; strcpy_s(patch_data[index].data," xeb"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; // 미니맵미네랄 - 13 -

patch_data[index].addr=0x4a4621; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; // 미니맵유닛및지형 patch_data[index].addr=0x4a4779; patch_data[index].size=2; strcpy_s(patch_data[index].data," x90 x90"); strncpy_s(patch_data[index].backup, (char *)patch_data[index].addr, patch_data[index].size); index++; void patch() DWORD temp; for(int i=0; i<patchcount; i++) VirtualProtect((LPVOID)patch_data[i].addr, patch_data[i].size, PAGE_EXECUTE_READWRITE, &temp); for(int j=0; j<patch_data[i].size; j++) *(char *)(patch_data[i].addr+j) = patch_data[i].data[j]; VirtualProtect((LPVOID)patch_data[i].addr, PAGE_EXECUTE_READ, &temp); map_enable=true; patch_data[i].size, void patch_restore() DWORD temp; for(int i=0; i<patchcount; i++) - 14 -

VirtualProtect((LPVOID)patch_data[i].addr, patch_data[i].size, PAGE_EXECUTE_READWRITE, &temp); for(int j=0; j<patch_data[i].size; j++) *(char *)(patch_data[i].addr+j) = patch_data[i].backup[j]; VirtualProtect((LPVOID)patch_data[i].addr, PAGE_EXECUTE_READ, &temp); map_enable=false; patch_data[i].size, LRESULT CALLBACK WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) if (nmsg==wm_keydown) if (wparam==vk_home && map_enable==false) patch(); else if (wparam==vk_home && map_enable==true) patch_restore(); return CallWindowProc(oldWndProc, hwnd, nmsg, wparam, lparam); BOOL APIENTRY DllMain( HMODULE hmodule, DWORD ul_reason_for_call, LPVOID lpreserved ) - 15 -

HWND hwnd; if (ul_reason_for_call==dll_process_attach) map_enable=false; dataset(); hwnd=findwindow(0, "Brood War"); if(hwnd==0) MessageBox(0, "can't find Brood War!", "Error!", 0); else oldwndproc=(wndproc)setwindowlong(hwnd, GWL_WNDPROC, (LONG)WndProc); return TRUE; #ifdef _MANAGED #pragma managed(pop) #endif 표 2 DLL 소스코드 아래는 DLL을직접주입시키기위한코드이며, 프로그램이실행된후 4초가경과했을때활성화되어있는프로세스에대해 DLL 주입을시도한다. 따라서본프로그램을실행시킨후 4초가경과하기이전에스타크래프트를활성화시키면 DLL이주입되고스타크래프트내에서 home키를이용해맵핵을활성화시킬수있다. 물론이프로그램은꼭스타크래프트만이아닌모든프로세스에서사용이가능하며, 주입시키기위한 DLL의경로만재대로지정해주었다면활성화된프로세스에 DLL Injection시키는유용한프로그램이다. 물론린츄씨는간단히테스트를위해아래프로그램을사용했으며실제로맵핵이라는틀을갖추기위해서는직접스타크래프트에대한 Injection툴을제작하길권장한다. 언제나귀차니즘은무섭다아 ~ - 16 -

#include <iostream> #include <windows.h> using namespace std; int main() HWND h; HANDLE handle, threadhandle; HMODULE khandle; PTHREAD_START_ROUTINE getproc; void *mem; char *dllpath; //DLL 경로 dllpath="c: test.dll"; DWORD pid, len; //4초후활성화된윈도우에 DLL 주입 Sleep(4000); h=getforegroundwindow(); if (h == 0) printf("error!"); exit(0); GetWindowThreadProcessId(h, &pid); handle=openprocess(process_all_access, 0, pid); //LoadLibrary함수의주소 khandle=getmodulehandle("kernel32.dll"); getproc=(pthread_start_routine)getprocaddress(khandle, - 17 -

"LoadLibraryA"); // 타켓프로세스공간에 DLL 경로복사 mem=virtualallocex(handle, 0, strlen(dllpath)+1, MEM_RESERVE MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(handle, mem, dllpath, strlen(dllpath)+1, &len); //Thread 생성 threadhandle=createremotethread(handle, 0, 0, getproc, mem, 0, 0); CloseHandle(threadhandle); CloseHandle(handle); printf("complete!"); 표 3 DLL Injector 소스코드 - 18 -

4. 실험및결과 우선스타크래프트를실행시킨후 DLL Injector를실행시키고바로스타크래프트를활성화시킨다. 그후컴퓨터몇대를집어넣고게임을플레이해보자. HOME키를눌러보면잘작동한다는것을확인할수있다. 그림 20 강건너불구경 크립이보이지않는저그기지에서히드라와질럿이싸움을벌이고있다. 물론린츄씨는강건너불구경이다. - 19 -

그림 21 적기지염탐 - 20 -

추가. 버전별수정코드 패치로인한먼산모드. 일단 1.161 버전에대한추가! 지형그리기 47FCE0 90 90 47FCEA EB 유닛및건물그리기 4982F5 90 90 498313 90 90 적유닛클릭가능 46F42A 90 90 90 90 90 90 미니맵지형 4A3B98 90 90 4A3BA3 EB 미니맵미네랄 4A4731 90 90 미니맵유닛및건물 4A4889 90 90 표 4 1.161수정목록테이블 - 21 -

참고문헌 [1] Robert Kuster, Three Ways to Inject Your Code into Another Process [2] Darawk, DLL Injection Tutorial - 22 -