DLL Injector


1.서론

2.실행화면

3.다운로드

1.서론…….

원래는 특정한 핸들에 SendMessage를 보내는 프로그램을 만들려고 했는데 ‘어쩌다’보니 Dll Injector를 만들고 말았다. 고3인 관계로 시간이 부족해 자세한 설명은 생략하고 소스를 첨부한다. 소스도 정리를 안해서 그렇게 이쁘다고 볼 순 없지만 그래도 도움이 될거라 생각한다. 소스파일을 받아서 빌드할 때 프로젝트의 속성을 멀티바이트집합 사용으로 바꿔주면 에러없이 잘 빌드될것이라 생각한다.

2.실행화면


<사진>
대상프로세스의 이름을 위에 적고 Find를 눌러 인젝트할 dll을 찾거나 경로를 써주고 Inject를 누르면 된다.


이 프로그램에는 몇가지 문제점들이 있는데(예외처리를 안함) 기억나는것만 나열하자면

1. 프로세스 이름만 존재한다면 Inject시키는 dll파일이 없어도 성공창이뜸.

2. eject기능 없음

문제점들은 시간이 나면 차차 수정하도록 하고 직접 수정해서 써도 된다.


3.다운로드

Dll Injector.cpp

Dll Injector.exe

혹시 바이러스로 오진이 나거나 의심이 가는 사람들은 위에 cpp파일만 받길 바란다.

'API 미니 프로젝트' 카테고리의 다른 글

Winapi) Dll Injector 소스  (1) 2014.01.12
콘솔창을 생성하는 AllocConsole() 함수  (0) 2013.04.07
by Conscientia 2014.01.12 15:58


실행화면

코드를 작성하다보면 어떠한 처리가 제대로 잘 이루어지고 있는지 확인하기 위해서 결과값을 출력해야하는 경우가 많다. 이런 경우 콘솔에서라면 printf()와 같은 함수를 이용하여 간단하게 출력할 수 있지만, 윈도우즈는 그런 간단한 한줄의 출력을 위해서 번거로운 과정들을 거쳐야 한다.

따라서 좀 더 개발의 편리함을 위해서 콘솔창을 띄우는 방법을 간단하게 소개하려 한다.

if (AllocConsole()) {

  freopen("CONIN$", "rb", stdin);

  freopen("CONOUT$", "wb", stdout);

  freopen("CONOUT$", "wb", stderr);


  // cout/cin/cerr을 사용하려면 아래의 주석을 지우면 된다.

  //std::ios::sync_with_stdio();

}


BOOL WINAPI AllocConsole(void); - 호출한 프로세스로부터 콘솔창 하나를 생성하는 함수

파라미터 : 없음

리턴 값 : 성공시 0이 아닌값, 실패시 0리턴.


참고로 AllocConsole을 여러번 호출한다고 여러개가 생성되지 않는다.

프로그램 종료전에 FreeConsole();로 해제해주자.


freopen()함수를 이용하면 기본적인 입출력을 가능하게 해주었다. printf등과 같은 입출력이 가능하며, 아래의 주석을 지우면 cout,cin같은 함수도 이용이 가능하다.

std를 붙이는게 귀찮다면 using namespace std;를 삽입해주도록 하자.


아래의 코드는 WM_CHAR 메시지를 받으면 해당 아스키코드에 해당하는 값을 콘솔창에 출력해주는 간단한 코드다.

모바일보기 불가능


'API 미니 프로젝트' 카테고리의 다른 글

Winapi) Dll Injector 소스  (1) 2014.01.12
콘솔창을 생성하는 AllocConsole() 함수  (0) 2013.04.07
by Conscientia 2013.04.07 16:34

오델로(리버시) 만들기(2) - 보드출력과 돌 뒤집기

 

*모바일은 소스코드가 보이지 않습니다*

 


목차

1.프로젝트에 들어가기에 앞서…….

2.오델로의 간단 플로우차트

3.개발계획

4.본격코딩

3.마치며…….


1.프로젝트에 들어가기에 앞서…….

전에도 말했듯이 처음부터 완벽한 사람은 아무도 없다. 또한 처음부터 완벽한 프로그램을 만들어내는 사람도 없다. 앞으로의 개발은 간단한 베이스부터 개발하여 조금씩 기능을 추가해서 완성해나가는 방식으로 만들어 나갈 것이다.



2.오델로의 간단 플로우차트

게임으로 이식하기 위해서는 오델로가 어떤 방식으로 흘러가야할지 알아야할 것 같아서 간단하게 플로우차트로 만들어보았다.

 

 

 

이해하기 어려운 플로우차트도 아니니 추가설명은 생략하도록 하겠다.


3.개발계획

조금만 더 열심히 머리를 싸맨다면 저 플로우차트에 있는 모든 내용을 한 번에 코딩할 수 도 있을 것이다. 그러나 처음부터 완벽하게 생각하고 만드는 것은 내 스타일도 아닐뿐더러 코딩실력도 그리 좋지 못한 나에게는 매우 어려운 일이다. 따라서 나는 맨 처음에도 언급했듯이 간단한 베이스부터 개발하여 조금씩 추가해 나갈 것이다. 따라서 이번 시간에는 ‘보드를 출력하고, 가능한 곳에 돌을 놓으면 뒤집히게’ 까지 구현하려한다.


구현하려 하는 것

1. 보드출력

2. 가능한 곳에 돌을 놓으면 뒤집힌다.


이 두 가지를 구현해보자.


4.본격 코딩

모든 API 프로그래밍의 시작은 ‘스켈레톤 코드’ 부터이다. 이 글을 보는 사람 중에 스켈레톤 코드를 모르는 사람은 없을 것이라 본다. 아래 첨부된 파일은 내가 쓰는 스켈레톤 코드이다. 그냥 입맛에 맞게 조금 수정했을 뿐이니 바뀐 부분은 대충 훑어보고 복사해서 쓰도록 하자. 아, 참고로 내가 쓰는 컴파일러는 VS2010이다.

 

 

 

스켈레톤코드.txt

내가 스켈레톤 코드를 올리는 이유는 소스코드를 다운받아 실행해 보기보다는 스켈레톤 코드에 직접 타이핑하는 것을 선호하는 사람이 있기 때문이다.


(초기 배치)


위 보드처럼 출력하기 위해서 필요한 이미지가 있는데 (보드의 외곽은 우선 배제하기로 했다)

1. 보드의 작은 정사각형 타일(이것을 8x8로 이어붙이면 오델로 보드가 완성된다.)

2. 검은 돌

3. 흰 돌


이렇게 세 가지 이미지가 필요하다. 이중에 첫 번째로 필요한 타일은 공식적으로라면 초록색 타일이어야 하지만 개인적으로 촌스럽다고 생각하는 바, 두 가지 색깔을 번갈아서 출력하도록 하겠다. 그리하여 필요한 비트맵리소스가 4개가 되었는데 바둑알은 까루님의 eps파일(http://cafe.naver.com/logosesang/384029)을 포토샵으로 편집하여 만들었다. 타일은 직접 그림판에서 64x64크기로 간단하게 만들었다.

 

리소스 다운 :  리소스.zip

 

 

먼저 이 네 가지 리소스를 프로젝트에 추가한다.

나는 리소스 편집기로 각각의 항목을 수정하여 저장하였다.

#define IDB_TILE1                     101

#define IDB_TILE2                     102

#define IDB_B_STONE                     103

#define IDB_W_STONE                     104

           

Winmain 함수에는 전혀 변화가 없으므로 이를 제외한 전체 소스이다. 필요한 부분에 주석을 달아 놓았으니 이해하는데 무리가 없을 것이다.

결과만 확인하고 싶다면 소스를 다운받아 실행만 하면 된다.

 

Othello.cpp

출력결과 :

 

5. 마치며…….

대충 궁색은 갖췄지만 부족한 점이 너무나도 많다. 둘 곳이 없어도 턴이 넘어가지 않으며, 누구 턴인지도 헷갈리고, 게임이 끝나지도 다시 시작할 수 도 없다. 아무 소리도 안나니 밋밋하다. 다음번에는 좀 더 기능을 갖춰보자.


P.S

이해가 잘 되지 않는다면 다시 한 번 코드를 천천히 따라가다 보면 이해할 수 있을 것입니다. 그래도 이해가 안 되면 댓글로 달아주세요. 최대한 노력하겠습니다.

그리고 부족하거나 더 추가되었으면 하는 점 또한 댓글로 달아주시면 감사하겠습니다.

 

P.S +

실수로 글을 삭제해버려서 다시 올렸습니다 ㅠㅠ 죄송합니다

 

by Conscientia 2013.01.15 17:02

 

오델로(리버시) 만들기(1) - 오델로에 대하여


목차

1.프로젝트에 들어가기에 앞서…….

2.오델로(원본출처 : 한국 오델로 협회)

가)오델로란?

나)오델로의 역사

다)게임방법

3.마무리



1.프로젝트에 들어가기에 앞서…….

나는 프로그래밍을 잘하는 편은 아니라고 생각한다. 코드도 예쁘지 못하고 별로일수도 있으나 처음부터 완벽한 사람은 아무도 없다. 그저 프로그래밍 실력이 0.1%라도 향상되는 것에 의의를 둔다.


2.오델로

 

가)오델로란?
오델로라는 게임은 대부분 어디에선가 들어보셨을 듯합니다.
서양에서 리버시라고도 불리기도 하는 오델로는 흑과 백, 이렇게 두 가지 색을 가지고 즐기는 보드 게임이며,

초록색
이면서 8x8 크기로 이루어진 오델로판에서 게임을 하게 됩니다. (밑의 사진 참조)

두 대국자에게는
한쪽 면은 검은색, 반대 면은 흰색인 돌(밑의 사진 참조) 64개가 주어지고
처음엔 각각 전체 돌 수의 반인 32개씩의 돌을 가지고 시작합니다.
하지만 게임 도중 패스 등의 발생으로 상대의 돌이 먼저 다 떨어지게 되면 자기가 가진 돌을 상대방에게 건네주게 됩니다.

오델로판의 총 칸이 64칸이기 때문에 게임을 끝나면 빈칸이 생길 때를 제외하고는 총 64개의 돌이 사용되게 됩니다.
또 돌 색깔은
윗면에 검은색이 보이면 검은색, 윗면에 흰색이 보이면 흰색으로 칩니다.


 

(오델로 판)

 

(오델로 돌)


게임 진행 방식


오델로에서 시간제한은
한 수 당 시간제한이 아닌 한 게임당 시간제한으로 주어집니다.
바둑에서의 시간제한처럼 각자 시간이 주어지고, 그 사람의 차례에 그 사람의 시간이 흘러가게 됩니다.
자신의 시간이 다 흘러가면 그 사람은 시간패하게 됩니다.

일반적으로 대회에서는 한 사람당 20분~30분정도의 시간이 주어집니다. 준결승이나 결승은 한 사람당 30분~40분 정도 주어집니다.
속기 대회에서는 일반적으로 한 사람당 5분의 시간제한이 주어집니다.

온라인 게임 사이트에서는 컴돌이(프로그램을 이용한 치팅)가 많이 유행하기 때문에 컴돌이를 방지하기 위해서 속기 게임을 많이 즐깁니다. 이런 경우엔 한 게임당 1분~2분의 초속기 게임을 하기도 합니다.


게임의 목적


게임이 끝났을 때
자기 색의 돌을 더 많이 가진 사람이 승자가 되고, 두 대국자가 모두 더 이상 둘 곳이 없을 때, 게임은 끝나게 됩니다.

오델로는 룰이 매우 심플하면서 깊이도 있다는 점이 큰 장점입니다.

배우기는 쉬우면서 깊이도 있는 게임
, 오델로를 한번 즐겨보세요 ^^


나) 오델로의 역사

 

1. 리버시(reversi)?

1800년대에 영국에서는
리버시(reversi)란 게임이 큰 인기를 끌었습니다. 이 리버시란 게임은 현재의 오델로와 거의 똑같은 룰을 가지고 있지만, 처음에 시작할 때 흑돌 2개와 백돌 2개가 x자로 교차되는 배치를 가진 오델로와는 달리, 초반 배치가 자유롭게 시작되는 게임 이였습니다.

이 리버시라는 게임 때문에 서양에서는 아직도 오델로를 리버시라고 표기하는 곳도 있습니다. 또한 오델로 게임의 기원이 1970년대에 오델로를 개발한 일본인지 아니면 1800년대에 리버시가 성행했던 영국인지에 대한 의견도 분분합니다. 오델로의 창시자인 하세가와 고로는 리버시라는 게임을 전혀 모르는 상태에서 오델로를 창시했다고 얘기하지만, 오델로는 리버시와 상당히 비슷한 게임이므로(판 색깔과 초기배치만 다른) 설사 리버시를 모른 상태로 제작했다고 해도 새로운 게임의 창안이라기보다는 기존 게임의 재발견 정도가 될것 같습니다. 따라서 게임의 기원자체는 일본이라기보다는 18세기의 영국의 리버시라고 보는 게 옳을 듯 하네요.

그러나 하세가와 고로가 오델로를 상표화 하고 활성화 시키지 않았다면, 기존의 리버시로는 지금의 오델로처럼 활성화 되지 못했을 것 또한 자명합니다. 따라서 지금의 오델로가 만들어짐에 있어서의 하세가와 고로의 공은 빼놓을 수 없는 일이고, 리버시를 오델로로 상표화 시키고 현대에 보급함에 있어 큰 공을 세운 사람이 하세가와 고로라고 생각하는 게 올바를 것 같습니다.

2. 해외에서의 오델로


오델로
(othello)는 일본에서 최초로 만들어졌습니다. 일본의 하세가와 고로는 8x8 크기의 판을 이용한 '오델로'라는 게임을 개발하여 1973년에 일본 오델로 연맹을 발족시켰으며, 그해에 제1회 전 일본 선수권 대회를 개최하였습니다.

일본에서 오델로가 선풍적인 인기를 끌자 이 인기는 점차 세계에 퍼져 나가게 되었습니다. 이런 상황에서 열린 이벤트가 1976년의 전 일본 5대 챔피언 후지타 후미오와 영국의 체스 그랜드 마스터(GM) 토니 마일즈(Tony miles)의 대결입니다. 토니 마일즈 측은 오델로에 적응하기 위한 기간으로 2개월을 요구하였고, 그 요구대로 2개월 후에 후지타 후미오와 토니 마일즈의 오델로 3번기가 벌어졌습니다. 결과는 후지타 후미오의 2:1 승리로 끝났고, 이 결과는 영국 BBC를 통해 세계로 방송되어 오델로를 세계에 알리는데 큰 역할을 했습니다.

이렇게 오델로가 전 세계적으로 널리 퍼져 나가자 뉴욕에는 세계 오델로 연맹이 설립 되었고, 초대 회장으로는 제임스·벡커가 취임했습니다. 그리고 이윽고 세계 오델로 연맹과 일본 오델로 연맹이 공동 개최하고 요미우리 신문이 후원을 하는 제1회 세계 오델로 챔피언십이 1977년 10월 일본에서 열리게 되었습니다. 첫 우승은 일본의 히로시 이노우에가 차지하였습니다. 세계대회의 개최국은 올림픽처럼 각국이 돌아가면서 개최하기로 하였습니다.

1회에 고작 5명이 참가했던 세계 오델로 챔피언십은 2003년에 이르러서는 20여 개국의 60명이 넘는 선수들이 참가하는 큰 규모의 대회로 성장해왔습니다. 한국 또한 대표 3명이 2003년 세계 대회에 참가해 팀 성적 7위라는 좋은 성적을 거두기도 했습니다.

3. 국내에서의 오델로

 

국내에 오델로가 알려지기 시작한건 1980년대입니다. 특히 90년도에 이르러 천리안, 하이텔 같은 통신 오델로를 통해 활발해지기 시작했고, 90년 말부터는 인터넷의 발달로 오델로를 포함하는 온라인 게임 사이트들이 생겨나면서 더 활성화 되게 됩니다. 온라인 게임 사이트를 통해 오델로를 즐기는 사람들이 증가함에 따라 온라인 동호회들이 생겨나기 시작하였고, 이를 통해 오델로를 두는 사람들끼리 친목을 다지게 됩니다.

온라인을 통해서만 게임을 하고 실제 오프라인에서는 대회가 없었던 90년대 말인 99년에 이르러 최초의 오프라인 대회인 MSO 대회가 개최됩니다. MSO 대회는 오델로뿐만이 아닌 바둑, 체스, 오목, 오델로, 브릿지등을 포함한 MSO Korea에서 주최하는 대회입니다. 이 MSO 대회를 통해 오델로는 국내에서 더욱 활성화를 띄게 됩니다.

오델로가 국내에 점차 널리 알려지면서 한국 오델로 협회 창단을 향한 발걸음도 시작되었습니다. 2002년 1월에 한국 오델로 협회가 창단되었고, 2004년 1월에는 협회 사이트가 만들어지면서 협회 주관의 오델로 대회를 준비 하게 됩니다. 결국 한국 오델로 협회 주관의 제1회 한국 오델로 최강전이 2004년 10월 24일에 개최되어 한국 오델로 역사를 새로 써나가게 됩니다. 앞으로도 국내에서 오델로가 더욱 널리 퍼지기를 기원합니다.


다) 게임방법

 

시작할 때의 돌 배치

 그림 1: 초기 배치

 

오델로의 처음 시작할 때 배치는 그림 1과 같습니다.

 (이 배치가 세계 공식 배치이고, 일부 흑과 백이 뒤바뀐 배치를 사용하는 곳도 있습니다.)

오델로는 항상 흑이 먼저 시작하고 그 후에는 서로 번갈아 가면서 두게 됩니다.

   

게임 하는 법

 

 

그림 2 : 흑이 f5에 두면..

 

그림 3 : e5를 뒤집는다.

 

그림 4 : 백 f4, f6, d6

 

그림 5 : 백이 d6에 뒀을 때


오델로는 자신의 돌들 사이에 상대방의 돌이 있으면 그 돌을 뒤집는 게임입니다.

따라서 상대방의 돌이 자신의 돌들 사이에 놓이게 하는 위치에만 수를 둘 수 있습니다.

그림 2에서 처럼 흑이 F5에 두면, 흑돌 사이에 놓이게 되는 E5가 뒤집히게 됩니다.(그림3)


흑이 첫수를 두면 다음은 백 차례입니다.

그림 4에 표시된 것처럼 이 상황에서 백이 둘 수 있는 수는 총 세 가지입니다.(F4, F6, D6)

백이 만약에 이중 D6에 둔다면 그림 5와 같이 D5에 있던 흑돌이 백돌로 뒤집히게 됩니다.


그림 6: 흑이 c6에 두면


 

그림 7: 결과는 위와 같다.


수를 뒀을 때 사이에 놓이는 돌들이 여러 방향에 있다면 그 모든 방향의 돌들을 다 뒤집습니다.

그림 6에서처럼 흑이 C6에 두면, 여러 방향의 백돌이 흑돌 사이에 있게 됩니다.

이런 경우에는 흑돌 사이에 놓인 백돌들을 모두 뒤집어줍니다.(그림7).


그림 8: 흑이 a5에 둔다.

 

그림 9: c4는 그대로 백.


오델로에서는 상대의 돌을 뒤집을 때 항상 방금 둔수와 관련된 돌들만 뒤집습니다.

그림 8을 보면, 흑이 A5에 뒀고, 따라서 흑돌 사이에 있는 백돌들이 흑돌로 뒤집히게 됩니다.(그림9)


이렇게 흑돌 사이에 있던 백돌들이 뒤집히면서, C5와 C3사이에 백돌이 놓이게 됐지만 이 백돌(C4)은 뒤집히지 않습니다. C5가 방금 둔수가 아니라, 방금 둔수에 의해 뒤집힌 돌이기 때문입니다.


게임의 종료

 

 그림 10 : 게임의 종료


만약 자신의 차례에 둘 곳이 하나도 없게 되면 차례를 상대에게 넘겨야 합니다. 이를 패스라 합니다. 하지만 둘 수 있는 곳이 하나라도 있으면 두기 싫어도 어쩔 수 없이 그곳에 둬야만 합니다.


 '오델로란?'에서도 얘기했듯이 오델로는 두 대국자가 모두 둘 곳이 없을 때 끝나게 됩니다.

게임이 끝나면 일반적으로 64개의 칸은 다 차게 되지만 빈칸이 생긴 채로 게임이 끝날 때도 있습니다. 예를 들어 게임 중간에 모든 돌이 다 한 색깔로 변한다던가(이런 경우를 퍼펙이라고 합니다). 좌측의 그림 10 같이 더 이상 둘 수 있는 곳이 없을 때에는 빈칸이 남은채로 게임이 끝나게 됩니다.


이렇게 빈칸이 생긴 채로 게임이 끝났을 경우 규칙에 의해 빈칸은 승자의 돌로 계산됩니다. 그림10에서 백돌은 29개, 흑돌은 34개로 흑돌이 승리하였으므로 빈칸은 흑돌로 계산되어 흑이 35-29로 승리한 게 됩니다.

2.오델로(원본출처 : 한국 오델로 협회)


3.마무리

 

이번 강의에서는 오델로에 대해서 알아보기만 하였다. 다음 강의에서는 게임으로 이식하기 위해서 준비해보자.

by Conscientia 2013.01.12 13:37
| 1 |