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

  1. Microsoft Visual C++ 2005 Service Pack 1 재배포 가능 패키지 설치 6
  2. Ubuntu 12.04에서 java 설치
  3. 배치파일(.bat)에서 드래그 앤 드롭 파일 인식
  4. 안철수의 생각
  5. 포인터 배열 테스트 코드
  6. ptrace 설명 및 사용법
  7. C코드 메모리릭 잡기
  8. 무료 소스코드 난독화 서비스 코드잼(Codejam)
  9. MFC 버튼 마우스 커서 변경
  10. 오피스에서 제공하는 무료이미지와 템플릿


Window7 환경에서 Visual C++ 2005 재배포 가능 패키지를 설치하려고 하였을때 다음과 같은 오류가 나타났다.

(Command line option syntax error. Type Command /? for Help.)


종래 해결 방법으로 설치 파일을 C:또는 D: 드라이브에 옮기고 나서 콘솔 창에서

"vcredist_x86.exe /t:c:temp" 와 같은 명령어를 사용하여 설치하려고 하였지만 이후에 창이 닫혀버리고

실제 설치되지 않는 문제가 발생하였다.


이곳 저곳으로 문제 해결점을 찾아보았지만, 딱히 해결 방법을 못찾아 다시 마소사이트에서 재배포 패키지를 검색해보니

Microsoft Visual C++ 2005 Service Pack 1 재배포 가능 패키지 MFC 보안 업데이트 버전이 있는것이 아닌가 !

(http://www.microsoft.com/ko-kr/download/details.aspx?id=26347)


MFC 보안 업데이트 버전으로 다운로드 받아 설치하였더니 경고창 없이 깨끗하게 설치되었고 적용도 잘 되었다 :)



Ubuntu 12.04 버전의 자바 설치는 구글에서 검색된 설치 방법으로는 권한? 문제로 설치가 잘 되지 않습니다.

찾아보니 다음과 같은 방법으로 해결을 할 수가 있습니다.

sudo apt-get purge openjdk*

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java7-installer


참조: http://ubuntu.or.kr/viewtopic.php?f=9&t=22516


'개발이야기 > Linux' 카테고리의 다른 글

우분투 아파치 서버로그 분석 (awstats)  (0) 2014.03.01
Ubuntu 이클립스 실행오류 해결  (4) 2012.09.26
ptrace 설명 및 사용법  (0) 2012.07.19


임의의 파일을 드래그 앤 드롭하여 배치파일에 올려놓을 경우, 

배치파일에서 드래그 앤 드롭된 파일을 인식하는 방법입니다.

Example:

만약 배치 파일을 다음과 같이 작성한다면,

echo file: %1
pause


배치파일에 임의의 파일을 드래그 앤 드롭하였을때 다음과 같은 결과를 얻을 수 있습니다.

file: filename.ext




안철수의 생각이 처음 책으로 나왔을 때 올 대선에 앞서 꼭 읽어 보아야 할 것 같아 신청하고 읽었습니다. 자신을 스스로 돌아보았을 때 살면서 정치에 전혀 관심이 없던 지라 사회가 어떻게 돌아가고 있는지, 세금이 어떻게 쓰이는지, 심지어 대통령에 대해서도 관심이 없었습니다. 누가 정치를 하든 “어떻게든 잘 돌아가겠지… 나랑은 상관없어…” 라는 생각이 막연했기 때문입니다.

정치에 관심이 들기 시작한 것은 최근인데요. 한국사능력검정 시험을 위해 공부한 국사를 시작으로 직장을 다니며 세금을 내고 또한 현 정부 상태에서 읽어나는 비판적이고 모순적인 모습들을 보면서 그냥 방관만 하고 있으면 안되겠다라는 생각이 들었습니다. 역사에 있어서도 현 정부에 있어서도 나라의 중심에 있는 그 한 사람의 역할이 얼마나 중요하고, 그 한 사람을 통해 얼마나 양극화된 사회가 나타날 수 있다는 것을 뼈저리게 느꼈기 때문입니다.

이에 신경 써서 대선이나 국회의원 선거를 하기로 하였으나 역시 쉽지가 않더군요. 막상 누군가 선택을 하려면 그 사람에 대한 정보가 너무 부족하여 정당이나 외부의 말을 듣고 선택하게 되는데 이게 좀 꺼림 직 하다고 생각합니다. 정당이 아닌 한 사람 한 사람의 사상과 철학을 이해하고 뽑고 싶으나 표면적인 정보로는 부족합니다. 여기서 “안철수의 생각”이라는 책은 올 대선에 앞서 안철수 한 사람의 생각을 읽기에 매우 도움이 되었습니다. (정치 참여하는 특히 대선에 나오는 분들은 공약이 아닌 책이나 다른 무언가로 생각을 정리한 것이 있다면 유용하다라고 생각이 듭니다.)

본론으로 넘어와 안철수의 생각에서는 복지, 정의, 평화 이 세가지 뼈대를 이루는 큰 나무를 기준으로 작은 소소한 잔 가지와 같은 생각의 이야기를 제정임 교수님과 인터뷰 식으로 나열하고 있습니다. 현 사회에 꼭 필요한 시스템이며 앞으로 대한민국이 나아가야 할 방향이라고 주장하고 있습니다. 개인적으로 한 사람이 이처럼 거대한 생각을 종합적으로 한다는 것이 놀라웠으며 정치 분야에 대해서도 경험이 없다 뿐이지 거의 전문가 수준이라 생각이 듭니다. 전체적으로 안철수씨의 생각에 동의합니다. 다만 생각을 정리한 책이어서 전문적인 상세한 내용들은 살펴볼 수 없어 아쉬웠습니다. 


안철수씨의 생각과 대한민국의 미래 방향에 대한 지침들을 생각할 수 있는 책으로 안 읽어보신 분들은 꼭 읽어보세요 ~^^


'독서' 카테고리의 다른 글

1인치의 혁신  (0) 2014.05.07
스텔라는 어떻게 농장을 구했을까  (0) 2014.03.02
오리진이 되라  (0) 2012.05.12
글로벌 소프트웨어를 꿈꾸다  (0) 2012.05.11


포인터 배열 관계에 있어서 햇갈리는 부분을 테스트 해보았다.

int* arr[3];


위와 같은 포인터 타입의 배열에서 의문을 품었다.

배열에서 새로운 객체(or 배열)의 생성이 자유로이 될까?

만약 배열이 생성가능하면 2차원 배열로써 활용가능할까?

에 해당하는 것이다.


  
int _tmain(int argc, _TCHAR* argv[])
{
	int a = 1;
	int b = 2;
	int c = 3;

	int* arr[3];

	arr[0] = new int[3];
	arr[1] = &b;
	arr[2] = &c;

	arr[0][0] = 4;
	arr[0][1] = 5;
	arr[0][2] = 6;

	printf("%d\n", arr[0][2]);
	printf("%d\n", *arr[1]);
	printf("%d\n", *arr[2]);

	return 0;
}

위의 코드는 정상 수행되는 코드로 결과 출력값은 다음과 같다.

※ 출력결과
6
2
3


즉, 배열에서 새로운 객체(or 배열)의 생성이 자유로이 되며,

포인터 배열에서 새로운 배열 할당시 2차원 배열로써 활용이 가능하다.

C와 C++ 알아나가면 알아나갈수록 유연하게 잘 설계되어 있는것 같다. ^^


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

C언어 pthread 사용 방법  (0) 2014.03.05
C코드 메모리릭 잡기  (0) 2012.07.18
부모 클래스의 기본생성자가 없을때 메모리 누수 현상  (2) 2012.06.12
마방진 원리 및 문제  (4) 2012.05.19
Mangled Name  (0) 2012.05.13


ptrace는 리눅스 기반 생성된 프로세스가 어떻게 움직이며, 어떤식으로 데이타를 읽고 쓰는지, 

어떤에러를 내는지 추적을 하기위해 마련된 시스템 콜입니다.


이것은 주로 디버그를 위해 사용되며, 따라서 디버거는 일종의 ptrace명령어 묶음 유틸리티라고 보면 됩니다.

프로그래머는 디버거를 통해 ptrace를 손쉽게 사용할수 있으며, 

자신이 만든 프로그램이 어떻게 수행되는지 총괄적으로 관제할수 있습니다.


다음은 ptrace 설명 및 사용법을 잘 설명해주고 있는 사이트들입니다.

 ptrace 설명 (영문)  http://www.linuxmanpages.com/man2/ptrace.2.php
 ptrace 설명 (국문)  http://linux4u.kr/manpage/ptrace.2.html
 ptrace 설명 및 예제 (국문)  http://goo.gl/Gk9vs
 ptrace 메모리 덤프 (국문) http://xpack.tistory.com/119



프로그램을 개발하다보면 사람인지라 버그나 메모리릭이 생기는 것은 당연합니다.


참조: 네이버웹툰, 스마트폰 게임 개발 이야기에서...


따라서 이를 빠르게 발견하고 해결하는 것이 중요합니다.

여기서는 C코드로 짠(콘솔 응용프로그램) 환경에서 메모리릭을 발견하고 잡는 방법을 알아보겠습니다.

다음과 같이 메인 프로젝트를 만들고 메모리릭을 감지하는 코드를 추가합니다. (강조된 부분)

  
// MemoryLeak.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"

#ifdef _DEBUG
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

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

	// 메모리릭 발생코드
	char * szName = new char[100];
	szName = "mooyou";
	printf("%s", szName);

	return 0;
}


위의 코드를 실행하면 출력창에 메모리릭이 발생되었다고 나타납니다.

출력 정보를 보면 memoryleak.cpp 파일의 18번째 라인에서 100 bytes 크기의 메모리릭이 발생되었습니다.

이 정보만으로도 충분히 메모리릭을 잡을수 있습니다.



여기서 더 나아가 메모리 블록 위치 정보를 통해서 직접적으로 메모리릭이 발생한 코드로 이동까지 해보겠습니다.

이를위해 다음과 같이 _CrtSetDbgFlag 바로아래 _CrtSetBreakAlloc( 97 ); 코드를 추가합니다.

이는 메모리릭 발생 위치에 BreakPoint를 설정합니다.

  
// MemoryLeak.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"

#ifdef _DEBUG
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

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

	// 메모리릭 발생코드
	char * szName = new char[100];
	szName = "mooyou";
	printf("%s", szName);

	return 0;
}


즉, 출력된 메모리 블록 위치 정보를 이용하여 BreakPoint를 설정하고, 실행시 설정된 곳으로 이동하겠다라는 것입니다 !

코드를 추가하고 실행하면 다음과 같은 메시지 박스가 나타납니다.

BreakPoint에 의해 중단점을 트리거 했다라는 내용이고 여기서는 중단을 누르면 됩니다.

하지만 누르고 나서 코드를 보면 메모리릭이 발생한 원하는 위치가 아닌 dbgheap.c 파일의 내용이 보이게 됩니다.

모르는 코드화면이 나왔다고 해서 전혀 걱정할 필요가 없습니다. 정상적인 화면이고... 제대로 잘 찾아온 것입니다. 

메모리릭이 발생한 곳으로 이동하려면 호출 스택에서 작업위치를 찾아가면 됩니다.

호출 스택은 보통 출력창과 같은 탭에 있고, 없다면 Ctrl + Alt + C를 눌러 호출 스택을 불러옵니다.

호출 스택은 현재 프로그램에서 실행된 명령을 순차적으로 나열한 것으로 맨 위에 찍힌 스택이 최근에 사용한 명령입니다.

현재 보이는 위치(노란색 화살표)가 msvcr100.dll로 dbgheap.c의 내용을 가르킵니다.

즉, 작업한 코드 영역이 아니죠. 따라서 작업한 영역인 MemoryLeak 스택을 더블클릭하여 이동합니다.

짜잔~ 왼쪽에 초록색 화살표가 보이시나요?

호출 스택을 이용하여 메모리릭이 발생한 위치로 이동하였습니다.



 
Introduction

CodeJam은 한국 저작권위원회에서 프로그램 저작권 관리와 코드 난독화 등을 제공하는 사이트이다.

사이트주소: http://www.codejam.or.kr/


프로그램 저작권 관리는 저작자를 식별할 수 있는 워터마크(watermark)정보를 자동으로 생성하여 이를 프로그램 소스코드에 삽입하고 향후 삽입된 저작자 정보를 자동으로 추출하여 검증해 주는 서비스이다. 본 서비스의 목적은 소프트웨어 소스코드의 유출 및 도용 시에도 삽입된 저작자 식별 정보를 검증하여 저작권 침해 사실을 용이하게 입증함으로써 저작권자 권리 구제의 실효성을 확보하여 소프트웨어 지적재산권 관련 분쟁의 위험을 최소화 하는 것이다.



프로그램 코드 난독화는 특정 난독화 알고리즘(Layout, Data, Control Obfuscation)을 적용하여 소스코드를 분석하기 어렵게 변환해주는 시스템이다. 본 시스템의 목적은 상세설계에 준하는 설계구조와 주석문, 프로그램 처리방식, 기능 배치, 구성 등의 설계아이디어 또는 해당하는 알고리즘이나 성능 및 최적화를 위한 구현 노하우 등이 내포되어 있는 SW 소스코드의 원천기술 유출을 방지하는 것이다.



Method

CodeJam의 저작권 워터마크, 난독화등의 코드 변환은 모두 사이트에서 이루어진다.


먼저 로그인을 하고,



서비스 이용으로 들어가 코드 변환을 한다.



ActiveX가 아닌 Java로 구현되어 있다.



자바 설치가 완료되면 다음과 같은 화면이 나타난다. 

변환하기 위한 소스 폴더 선택과 보호강도를 지정하고, 난독화 실행을 클릭하면 난독화가 수행된다.



난독화 결과 화면



Conclude

코드 난독화 결과물이 보호강도를 가장 높게 하더라도 전문적인 난독화 서비스보다는 높지 않다.

하지만 저작권 관리, 난독화등 코드변환을 사이트에서 쉽게 무료로 변환 가능하므로 유용하게 사용할 수 있을것으로 보인다.


난독화된 c코드

#include <stdio.h>

#define MABANG_SIZE 5 

int MABANG[MABANG_SIZE][MABANG_SIZE]; void init_MABANG(); void move_MABANG(int &row, int &col, int count); void process_MABANG(); void print_MABANG(); void main() { init_MABANG(); process_MABANG(); print_MABANG(); } void init_MABANG() { for(int Rc2hTbzn2xMmQYcV=0; Rc2hTbzn2xMmQYcV<MABANG_SIZE; Rc2hTbzn2xMmQYcV++) { if(0<MABANG_SIZE){ MABANG[Rc2hTbzn2xMmQYcV][0] = 0; }if(1<MABANG_SIZE){ MABANG[Rc2hTbzn2xMmQYcV][1] = 0; }for(int fNbUnAITfcUEkNDz=2; fNbUnAITfcUEkNDz<MABANG_SIZE; fNbUnAITfcUEkNDz++) { MABANG[Rc2hTbzn2xMmQYcV][fNbUnAITfcUEkNDz] = 0; } } } void move_MABANG(int &row, int &col, int count) { MABANG[row][col] = count; row -= 1; col += 1; if(row < 0 && col > MABANG_SIZE-1) { row += 2; col -= 1; } else if(row < 0) { row = MABANG_SIZE-1; } else if(col > MABANG_SIZE-1) { col = 0; } else if(MABANG[row][col] != 0) { row += 2; col -= 1; } else { } } void process_MABANG() { int CBbtF1gJvMzPdA7c = 0; int R7R5hHlcgu6tTD6p = MABANG_SIZE/2; for(int Vz1JrpWh_SwYjvMZ=1; Vz1JrpWh_SwYjvMZ<=MABANG_SIZE*MABANG_SIZE; Vz1JrpWh_SwYjvMZ++) { move_MABANG(CBbtF1gJvMzPdA7c, R7R5hHlcgu6tTD6p, Vz1JrpWh_SwYjvMZ); } } void print_MABANG() { for(int lHXsEid3LaTqU3oN=0; lHXsEid3LaTqU3oN<MABANG_SIZE; lHXsEid3LaTqU3oN++) { if(0<MABANG_SIZE){ printf("%4d", MABANG[lHXsEid3LaTqU3oN][0]); }if(1<MABANG_SIZE){ printf("%4d", MABANG[lHXsEid3LaTqU3oN][1]); }for(int dSdb3Zlsgje_bG59=2; dSdb3Zlsgje_bG59<MABANG_SIZE; dSdb3Zlsgje_bG59++) { printf("%4d", MABANG[lHXsEid3LaTqU3oN][dSdb3Zlsgje_bG59]); } printf("\n"); } 

}


'정보이야기 > 보안정보' 카테고리의 다른 글

샌드박스(Sandbox) 개념  (5) 2012.05.29
리버스 엔지니어링 툴 정리  (1) 2012.05.24



간단한 코드 추가로 위 그림과 같이 버튼의 커서를 변경시킬 수 있습니다.

변경하고자 하는 버튼의 컨트롤 변수를 만들고, OnInitDialog 함수에 다음과 같이 코드를 추가합니다.


  
BOOL CTestDlg::OnInitDialog()
{
	// 자동으로 생성되는 코드는 생략합니다.
	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	// 버튼의 마우스 커서 변경
	// (m_ctrlButton: 해당 버튼의 컨트롤 변수)
	HCURSOR hCursor; 
	hCursor = AfxGetApp()->LoadStandardCursor(IDC_HAND); 
	SetClassLong(m_ctrlButton.GetSafeHwnd(),GCL_HCURSOR,(LONG)hCursor);

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}


SetClassLong 함수는 해당 윈도우 핸들을 통하여 클래스 정보를 수정하는 함수입니다.

이를 통해 버튼 클래스의 커서 정보를 수정하는 원리입니다.



무료이미지: http://office.microsoft.com/en-us/images/?CTT=97


무료템플릿: http://office.microsoft.com/en-us/templates/?CTT=97

다음과 같이 다양한 템플릿을 제공합니다.


'디자인' 카테고리의 다른 글

무료 클립아트 사이트  (0) 2012.05.14