'분류 전체보기'에 해당되는 글 52건

  1. 열투 킹 오브 파이터 시리즈 (Nettou The King Of Fighters) 11
  2. 구슬치기 (Oh! Hajiki) 5
  3. fopen_s 파일읽기와 저장
  4. 부모 클래스의 기본생성자가 없을때 메모리 누수 현상 2
  5. 샌드박스(Sandbox) 개념 5
  6. MFC 디렉토리 생성과 삭제
  7. 리버스 엔지니어링 툴 정리 1
  8. 괜찮은 IT 뉴스 사이트 - IT World Korea
  9. 명경기 2010 GSL 스타크래프트2 임요환 데뷔전 1
  10. 알렉스키드 (Alex Kidd in Miracle World) 17


미니 게임보이용(GB)으로 제작된 열투 킹 오브 파이터 시리즈입니다.

컬러 버전으로 시리즈 95부터 98까지 즐기실 수 있습니다.


정겨운 도트 그래픽과 함께 케릭터 고유 기술이 게임속 그대로 녹아 있어서 게임의 재미를 살려줍니다.


특히 킹오브 95, 96 버전에서는 히든 케릭터가 존재합니다.

TAKARA 화면에서 "←" 버튼을 연타하면 "띠링" 소리와 함께 히든 케릭터를 선택할 수 있습니다.

히든 케릭터를 모두 오픈 하려면 "띠링" 소리가 두번 날때까지  "←" 버튼을 연타합니다.


게임 다운로드


게임 조작법

ENTER 키: 게임 시작

Z 키: 발차기 (누른 강도에 따라 약한, 강한 발차기)

X 키: 주먹 (누른 강도에 따라 약한, 강한 주먹)


게임 실행

다운로드 받은 열투킹오브.zip 파일을 받으시고 압축을 풀면 다음과 같이 파일들이 존재합니다.

VisualBoyAdvance.exe 파일은 에뮬레이터를 실행하는 파일이고

KOF95~98.SMS 파일은 게임롬파일 입니다.


VisualBoyAdvance.exe 파일을 실행시켜 에뮬레이터를 실행합니다.

에뮬레이터 화면에서 파일 → 롬파일 실행을 클릭합니다.


Select ROM 화면에서 원하는 킹오브 시리즈 KOF95~98.SMS 파일을 선택하고 열기버튼을 누르면 게임이 실행됩니다.

즐거운 게임 되세요~!


'게임이야기 > 고전게임' 카테고리의 다른 글

구슬치기 (Oh! Hajiki)  (5) 2012.06.16
알렉스키드 (Alex Kidd in Miracle World)  (17) 2012.05.19
오리지날 고전게임  (0) 2012.05.19


구슬치기 (Oh! Hajiki) 게임입니다.

스피디한 게임으로 구슬 컨트롤하는 재미가 쏠쏠합니다.


게임을 시작하자마자 무섭게 다른 구슬들이 달려옵니다. 

이리저리 잘 피해 상대방 구슬을 게임 판 밖으로 떨어트려야 합니다.


계속 피해만 다니다가는 HURRY UP! 문구와 함게 게임 판이 점점 줄어듭니다.

그전에 빠르게 다른 구슬들을 처리해야 겠죠 ^^


스테이지가 올라가면 올라갈수록 상대방 구슬 종류가 다양해 집니다. 

특히 저기 검정색과 이후 회색구슬이 나오게 되는데요... 일명 쇠구슬로 파워가 어마어마 하기때문에

밀쳐내다가 역관광 당하기 일쑤입니다.


위험한 상황에 도달했을 때는 Break 아이템을 사용하여 위기를 극복합니다.


게임 다운로드


게임 조작법

방향키(또는 마우스) : 구슬 이동

Alt(또는 마우스클릭) : Break 아이템 사용


게임 실행

구슬치기.zip 파일 압축을 풀고 HAJ.EXE 파일을 실행합니다.

즐거운 게임 되세요~!



fopen_s 함수를 이용하여 파일을 읽는 코드와 저장하는 코드입니다.


  
//
// fopen_s 파일읽기
//
errno_t err;
FILE *fp;
if( (err = fopen_s(&fp, "file_path", "rt")) != 0 )
{
	AfxMessageBox(_T("File open error!"));
	return false;
}

fscanf_s(fp,"format", ...); // 사용법은 c의 scanf함수와 동일
fclose(fp)

//
// fopen_s 파일저장
//
errno_t err;
FILE *fp;
if( (err = fopen_s(&fp, "file_path", "wt")) != 0 )
{
	AfxMessageBox(_T("File open error!"));
	return ;
}

fprintf_s(fp,"format", ...); // 사용법은 c의 printf함수와 동일
fclose(fp)


특히 fscanf_s 함수를 사용하여 문자열을 읽어올때 c의 scanf함수 사용법과 동일하지 않습니다.

이와 관련하여 다음 링크를 참조하세요.

fscanf_s 주의사항: http://mooyou.tistory.com/6



C++로 개발되어진 모듈을 수정하던중 생각지도 않는 문제가 발생했습니다.


문제가 되는 기본 전제는 이러합니다. 부모의 기본생성자가 없다라는 점과 

자식 클래스에서는 이 부모 클래스를 상속받아 생성자를 오버라이딩해서 사용한다라는 점입니다.


여기서 부모 클래스 생성자에서는 메모리 할당을 하고 오버라이딩된 자식 클래스 생성자에서

이를 다시 메모리 할당하고자 할때 메모리 누수가 발생하였습니다. 지금 생각해도 참으로 복잡한 문제이죠...

에러가 난 코드를 최대한 간소화 시켜보았습니다.


//
// 메모리 누수 확인 코드
//
#ifdef _DEBUG
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

//
// Class A
//
class A {
public:
	char* szA;

public :
	A::A(int a)
	{
		szA = new char[a];

		OutputDebugString(_T("A생성자 호출\n"));
	}

	A::~A()
	{
		delete [] szA;

		OutputDebugString(_T("A소멸자 호출\n"));
	}
};

//
// Class B
//
class B : public A {

public:
	B::B(int b)
		// 1.
		// 부모가 기본생성자를 갖고있지 않으므로 자식은 생성자를 만들기 위해서
		// 부모의 사용가능한 생성자를 직접 지정해주어야 한다.
		: A(b)		
	{
		// 2.
		// 부모에서 생성된 객체를 메모리 할당
		szA = new char[b];

		OutputDebugString(_T("B생성자 호출\n"));
	}

	B::~B()
	{
		// 3.
		// 할당한 메모리를 제거하려 했으나 에러 발생
		// 여기서 메모리 누수 발생
		// delete [] szA;

		OutputDebugString(_T("B소멸자 호출\n"));
	}
};

//
// Main Function
//
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _DEBUG
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

	A a(3);
	B b(3);	// 메모리 누수 발생

	return 0;
}


이를 해결하고자 다음과 같이 Class B를 수정하였습니다.

  
//
// Class B
//
class B : public A {

public:
	B::B(int b)
		// 1.
		// 부모가 기본생성자를 갖고있지 않으므로 자식은 생성자를 만들기 위해서
		// 부모의 사용가능한 생성자를 직접 지정해주어야 한다.
		: A(b)		
	{
		// 4.
		// 지정해준 [: A(b)] 부모 생성자에서 할당했던 객체를 미리 해제하고
		// 해당 생성자에서 할당된 객체는 이후 A소멸자가 호출될때 제거하게 해준다.
		delete [] szA;

		// 2.
		// 부모에서 생성된 객체를 메모리 할당
		szA = new char[b];

		OutputDebugString(_T("B생성자 호출\n"));
	}

	B::~B()
	{
		// 3.
		// 할당한 메모리를 제거하려 했으나 에러 발생
		// 여기서 메모리 누수 발생
		// delete [] szA;

		OutputDebugString(_T("B소멸자 호출\n"));
	}
};


'개발이야기 > C, C++' 카테고리의 다른 글

C언어 pthread 사용 방법  (0) 2014.03.05
포인터 배열 테스트 코드  (0) 2012.08.07
C코드 메모리릭 잡기  (0) 2012.07.18
마방진 원리 및 문제  (4) 2012.05.19
Mangled Name  (0) 2012.05.13


보안과 관련하여 스터디를 하던중 샌드박스라는 말을 처음 접하게 되었습니다.

샌드박스에 데이터를 저장한데는데 좀처럼 와닿지 않더군요. 

그래서 정리해본 샌드박스(Sandbox) 입니다.


샌드박스는 미국의 가정집 뒤뜰에서 어린이가 다치는 것을 방지하기 위해 만든 모래통(Sandbox)에서 유래하였습니다.


실제 샌드박스는 이렇게 생겼습니다.

나무 틀을 박스처럼 만들어 모래를 집어 넣고 아이들이 그 안에서 안전하게 놀수 있게끔 만들어준 것이죠.

마치 작은 놀이터 같습니다. 한국에서는 놀이터가 따로 존재하기에 샌드박스를 좀처럼 보기 힘듭니다.

그래서 처음보고 이런게 있었다니!! 매우 기발하다라고 생각했습니다.


이제 본론으로 넘어와서 이러한 샌드박스가 어떻게 프로그래밍 기술에 도입이 되었을까요 ?

또한 이것이 보안과 어떠한 연관이 있을까요 ?


이 질문에 대한 답은 Sandboxie(http://www.sandboxie.com/)에서 찾을 수 있었습니다.

먼저 Sandboxie 사이트에서 나타나는 이미지를 보겠습니다.


이 이미지는 샌드박스의 개념을 잘 설명해 주고 있습니다.

빨간색 화살표가 움직이면서 하드디스크안에 리소스들을 채우게(저장) 됩니다.

이를테면 인터넷 익스플로러의 경우 웹페이지 접속에 의해 해당 페이지를 받아오는 과정이라 할 수 있습니다.


일반적으로 리소스를 채우게 되는 과정에서 하드디스크에 직접적인 접근이 가능해 

Hard disk (no sandbox) 그림과 같이 될수있는데 여기서 바로 보안 이슈가 발생합니다. 

악의적으로 OS 일부분을 홰손시킬 수도 있고, 다른 어플리케이션의 정보를 홰손시킬수 있는 문제가 발생합니다.


따라서, 이러한 문제를 해결하는 방안으로 샌드박스가 등장합니다.

Hard disk (with sandbox) 그림과 같이 하드디스크에 특정 영역을 샌드박스로 지정하고 

이 영역에 대해서만 리소스를 사용하고 접근하도록 합니다. 

즉, 샌드박스는 OS와 같은 중요한 영역에는 영향을 주지 않도록 각자의 박스(영역)에서만 리소스를 사용하도록 한 것입니다.


또한 반대의 개념으로도 사용가능해, 샌드박스 안에 있는 리소스에 외부 접근을 거부하여 보호할 수도 있습니다.

마치 아이들을 주변의 위험으로부터 보호하듯이 말이죠.



MFC코드 기반 디렉토리 생성과 삭제 코드 입니다.

디렉토리 삭제 참조: http://sanaigon.tistory.com/120

  
//
// 디렉토리 생성
// 디렉토리 생성 성공: TRUE, 실패: FALSE 반환
// 함수 사용예: CreateDir(_T("C:\\dir_name\\"));
//
BOOL CreateDir(CString dir)
{
	CFileFind file;
	CString strFile = _T("*.*");
	BOOL bResult = file.FindFile(dir + strFile);

	if(!bResult)
	{
		bResult = CreateDirectory(dir, NULL);
	}

	return bResult;
}

//
// 디렉토리 삭제
// 디렉토리내에 존재하는 하위 폴더 및 모든 파일 삭제
// 함수 사용예: DeleteDir(_T("C:\\dir_name\\*.*"));
//
BOOL DeleteDir(CString dir)
{
	if(dir == _T(""))
	{
		return FALSE;
	}

	BOOL bRval = FALSE;
	int nRval = 0;
	CString szNextDirPath = _T("");
	CString szRoot = _T("");
	CFileFind find;

	// Directory가 존재 하는지 확인 검사
	bRval = find.FindFile(dir);

	if(bRval == FALSE)
	{
		return bRval;
	}

	while(bRval)
	{
		bRval = find.FindNextFile();

		// . or .. 인 경우 무시한다.
		if(find.IsDots() == TRUE)
		{
			continue;
		}

		// Directory 일 경우
		if(find.IsDirectory())
		{
			szNextDirPath.Format(_T("%s\\*.*"), find.GetFilePath());

			// Recursion function 호출
			DeleteDir(szNextDirPath);
		}

		// file일 경우
		else
		{
			//파일 삭제
			::DeleteFile(find.GetFilePath());
		}
	}

	szRoot = find.GetRoot();
	find.Close();

	Sleep(1);
	bRval = RemoveDirectory(szRoot);

	return bRval;
}



리버스 엔지니어링(Reverse Engineering)은 완성된 제품을 분석하여 제품의 기본적인 설계 개념과 적용 기술을 파악하고 재현하는 것입니다. 설계 개념→개발 작업→제품화의 통상적인 추진 과정을 거꾸로 수행하는 학문입니다. 보통 소프트웨어 제품은 판매 시 소스는 제공하지 않으나 각종 도구를 활용하여 컴파일된 실행 파일과 동작 상태를 정밀 분석하면 그 프로그램의 내부 동작과 설계 개념을 어느 정도 추적할 수 있습니다.

이러한 정보를 이용하면 크랙, 즉 실행 파일을 수정하거나 프로그램의 동작을 변경할 수 있고, 또 유사한 동작의 복제 프로그램이나 보다 기능이 향상된 프로그램도 개발할 수 있습니다. 소프트웨어에 대한 역공학 자체는 위법 행위가 아니지만, 대부분의 제품이 이의 금지를 명문화하고 있어 이러한 수법으로 개발한 제품은 지적 재산권을 침해할 위험성이 있습니다. (네이버 지식사전)

개인적으로 조사한 PC환경에서 리버스 엔지니어링을 돕는 툴은 다음과 같습니다.

No Attack Tools Attack Type Description Reference
1 ShowString Binary Analysis 프로그램 내부 스트링 보여줌 http://jok3.tistory.com/
2 Resource Hacker Plus Binary Analysis 소프트웨어 리소스 편집 http://jkblog.tistory.com/
3 ResHacker Binary Analysis 소프트웨어 리소스 편집 http://honollulu.tistory.com/18
4 softICE Debugger    
5 TRW2000 Debugger    
6 Ollydbg Debugger, Disassembler 가장 범용으로 사용되는 툴   
7 IDA Pro Debugger, Disassembler    
8 VBDE Decompiler 비주얼베이직으로 만들어진 프로그램 분석 http://jkblog.tistory.com/
9 sothink SWF Decompiler Decompiler 플래시 디컴파일러  
10 Reflector Decompiler 닷넷 프로그램 디컴파일러  
11 DeDe Decompiler 델파이 디컴파일러  
12 JAD Decompiler 자바 디컴파일러  
13 W32dsm9b Disassembler   http://jkblog.tistory.com/
14 UltraEdit Hex Editor    
15 WinHex Hex Editor    
16 Filemon Monitoring    
17 Regmon Monitoring    
18 TcpView Monitoring    
19 Procexp Monitoring    
20 Process Hacker Monitoring   http://processhacker.sourceforge.net/
21 티서치 Patching 메모리 패치  
22 치트엔진 Patching 메모리 패치  
23 GMER Rootkit Detection    
24 IceSword Rootkit Detection    
25 Exeinfo PE Unpacker   http://jok3.tistory.com/
26 ImportREC Unpacker   http://jkblog.tistory.com/
27 Themida Unpacker Unpacker   http://jkblog.tistory.com/
28 UPX Unpacker    
29 Universal Extractor Unpacker    
30 VMUnpacker Unpacker    
31 PEiD Unpacker, Binary Analysis   http://jok3.tistory.com/


Attack Type에 대한 설명입니다.

No Attack Type Description
1 Binary Analysis 프로그램 바이너리를 분석한다.
2 Debugger 디버거(debugger)는 디버그를 돕는 도구이다. 디버거는 주로 원하는 코드에 중단점을 지정하여 프로그램 실행을 정지하고, 메모리에 저장된 값을 살펴보며, 실행을 재개하거나, 코드를 단계적으로 실행하는 등의 동작을 한다. 고급 디버거들은 메모리 충돌 감지, 메모리 누수 감지, 다중 스레드 관리 등의 기능도 지원한다.
3 Disassembler 어셈블리어를 기계어로 번역하는 것이 "어셈블러"(assembler)이며, 거꾸로 기계어를 어셈블리어로 바꾸는 것은 "디스어셈블러"(disassembler)이다.
4 Decompiler 실행코드에서 소스코드를 역으로 추출한다.
5 Hex Editor 헥사에디터는 기존의 일반 컴퓨터의 워드프로세서 및 편집기 소프트웨어에서 읽을 수 없는 이진 파일을 읽을 수 있는 프로그램을 통틀어서 말한다.
6 Monitoring 프로그램 상태를 감시한다.
7 Patching 프로그램 메모리 영역에 데이터를 덫붙(Patching)인다.
8 Rootkit Detection 해커들이 시스템을 해킹할 때 시스템 이용자가 해킹당하고 있음을 알지 못하도록 하기 위해 사용하는 도구(프로그램 등)를 말한다. 루트킷을 설치하는 목적은 해커들이 나중에 시스템에 접근할 때 들키지 않으려는 것이다. 즉, 해커들은 이 도구를 사용해서 컴퓨터의 제어권을 가로채고 자신들이 하는 일을 감출 수 있다.
9 Unpacker 일반적인 SW들은 리버스 엔지니어링을 막기 위해서 암호화를 하거나 압축을 하여 소스코드를 볼수 없도록 하고 있습니다. 이러한 과정을 패킹이라고 한다. 소스코드를 보기 위해서는 이렇게 패킹된 코드를 풀어야 하는데 이러한 과정을 언패킹이라고 한다.



IT World Korea: http://www.itworld.co.kr/


이곳저곳에서 IT관련 자료를 찾던중 괜찮은 뉴스 사이트를 발견해 글을 작성합니다.

최신 IT 뉴스들이 발빠르게 업데이트 되며, 특히 좋은점은 외국의 IT 정보들도 빠르게 번역하여 올리는듯 합니다.

또한 관련 기사와 관련 라이브러리들을 받을 수 있어 유용합니다. 완소 사이트 ^^



이번에 소개드릴 명경기는 조금은 지났지만 임요환 선수의 스타2 데뷔전입니다.


경기보기 : http://ch.gomtv.com/427/28099/388308


스타2가 발매되고 사람들의 관심은 번쩍하였지만, e스포츠로의 발전은 전작과 비교해보면 부진합니다.

이대로 스타2가 죽는 것은 아니냐라는 소문부터 이미 실패다라는 말이 많이 나왔었으니까요...

이때, 임요환 선수의 스타2 전향 소식은 다시 한번 제2의 스타2 e스포츠의 부흥을 기대하게 했습니다.


바로 이런 기대속에 GSL 64강에서 임요환 선수가 황두희 선수와 데뷔전이 치뤄집니다.

엄청난 스포트라이트를 받은 이 게임은 곰티비 서버를 다운시켜버렸으며, 현재 방문자수가 250만을 넘어섰습니다.

또한 임요환 선수 특유의 마이크로 컨트롤이 빛나는 게임이여서 한순간에 사람들을 매료시킵니다.


스타2 임요환 선수의 명경기... 감상해보세요~~ ^^


'게임이야기 > e스포츠' 카테고리의 다른 글

명경기 2012 GSL Season2 송현덕P vs 박현우P  (0) 2012.05.14


첫번째로 소개드릴 게임은 알라딘보이의 대표게임 알렉스키드입니다.

처음 포스트 작성을 어떤 게임으로 선택할지 많이 고민을했는데요...

제 게임 인생? 역사상 의미있는 게임으로 당시(7살 정도) 클리어하기위해 하루하루 꼬박

조그마한 손으로 꾹꾹누르며 즐겨했던 기억이 새록새록 납니다.


알라딘보이 기억하시나요 ^^? 

아마 80~90년대에 태어나신 분들은 공감하시는 분들이 계실겁니다~



현재의 컴퓨터게임과 다르게 이전에는 그림과 같이 팩을 꼽고 하는 게임기들이 주를 이루었습니다.

알라딘보이에서는 팩을 꼽지 않으면 자동으로 알렉스키드가 내장되어 플레이 할 수 있었습니다.

현재는 PC에서도 즐길수 있도록 에뮬레이터와 게임롬파일이 제공됩니다.


게임 첫 화면입니다. 정겨운 음악과 함께 게임 장면들이 눈에 띕니다.


우리의 주인공 알렉스는 항시 주먹밥을 챙겨먹고 이동하죠~


첫번째 스테이지의 보스격인 개구리!

개구리가 쏘는 물방울을 잘 피해 없에야 합니다.


잘못피함 이렇게 됩니다... 스샷찍다 횡사 ㅠ_ㅠ


알렉스키드의 묘미는 탈것인데요... 오토바이, 헬기, 보트등 다양한 탈거리를 제공합니다.

단연 최고는 오토바이!! 모든걸 뚫고 가죠ㅋ


헬기도 타고~ 

공중에 뜨기위해 점프버트을 계속 눌러줍니다.


중간중간 보스와 가위바위보도 합니다. 이런 다양한 요소들이 게임을 더욱 재미있게 만들어줍니다.

이제 게임 소개는 여기서 마치고 게임 다운로드와 게임 설정, 조작법에 대해서 알아보겠습니다.


게임 다운로드


게임 조작법

z : 점프, 물속에서 누르고있으면 빨라짐

x : 공격, 첫화면에서 게임시작

c : 맵, 아이템 보기


게임 설정

다운로드 받은 알렉스키드.zip 파일을 받으시고 압축을 풀면 다음과 같이 두 개의 파일이 있습니다.

dega_v1.12.exe 파일은 에뮬레이터를 실행하는 파일이고

알렉스키드.SMS 파일은 게임롬파일 입니다.


dega_v1.12.exe 파일을 실행시켜 에뮬레이터를 실행합니다.

에뮬레이터 화면에서 File → Load Rom을 클릭합니다.

(만약 메뉴가 안보일 시 esc키를 누르면 나타납니다.)


Load Rom 화면에서 알렉스키드.SMS 파일을 선택하고 열기버튼을 누르면 게임이 실행됩니다.

만약, 게임음악는 나오는데 화면이 검은색으로 나타나면 다음과 같이 설정합니다.


Option → Overlay → None을 클릭하면 게임 화면이 나타납니다.

즐거운 게임 되세요~!