달력

22025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

GUI로 제공되는 클라이언트들은 대부분 스크립트를 불러와 처리하는 기능을 제공한다.


하지만 CUI인 MySQL은 해당 기능들을 제대로 알고 있지 않으면 사용하기가 꽤나 까다롭다.


MySQL에서 sql파일을 불러와 처리하는 \. 명령어에 대해 알아보자.


C:\ 폴더에 test.sql 파일을 넣고 mysql에 접속한다.

 

C:\> mysql -u [username] -p [ENTER]

password: **********

 

mysql>

 

위와 같은 명령어로 접속을 해서 비밀번호를 입력한다.

 

mysql> \. test.sql  [ENTER]

 

\. 다음에 space를 눌러서 빈칸을 하나 넣어줘야 명령어가 실행된다.

 

위와같이 실행하면 파일로 저장한 쿼리를 실행시킬수 있다.


 member.sql 파일에 담겨져 있는 쿼리



 member.sql 실행과 결과물 출력


위 방법을 사용하여 쿼리를 입력하게되면 쿼리를 보존할 수 있게되고 유지, 보수하기가 한결 쉬워진다.


또한 적은 수의 쿼리를 사용할 때에는 직접 프롬프트에 입력해 사용해도 되지만


수백 수천건 이상의 데이터를 한번에 관리해야 한다면 일일이 입력하고 실행하기 힘들기 때문에


이같은 작업을 사용하게되면 당신의 수고를 덜어줄 것이다.

출처 : http://www.cyworld.com/OneByBang/3046071

Posted by 위너즈
|

데이타베이스 mysql을 설치할께요

 

http://www.mysql.com 에 가셔서,, 물어물어 찾아가보면

 

http://www.mysql.com/downloads/mirror.php?id=403506 까지 가게 됩니다.

 

 

퍼런글씨 클릭 :: >>No thanks, just take me to the downloads!

 


 

 

태극기 :: Kyung Hee~~~~~~~~User Group ..  HTTP 로 받아도 빠르게 받아지는군요

 


mysql-installer-5.5.15.0 <--- 이파일을 받았다면,, 설치하셔야죠. 더블클릭하세요

 

http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=ko

 

만약 .NET Framework 4가 설치되어 있지 않다면,, 받으셔야됩니다...

 

받고나서 보안패치//UPDATE//까지 하시구요..(설치다되면 마지막장면에 update라고 나와요.)

 

XP는 서비스팩3이상....이라고 되어있으니.. 참조하구요.. 계속~~

 

 

Install MySQL Products 클릭

 

I accept~~~~ 체크//그옆에꺼 send~는 알아서 하세요 ^^;;,, Next ...

 

 

체크안하고 Execute 한번에 안되면,, 두번하면 되요 ...

 

 

이 화면으로 넘어오면 되는데.. 노란삼각형 주의표시는 이전에 깔았던 mysql이 다 지워지지 않은 관계로 저렇게 되네요

 

여러분들은 안뜨겠죠???

 

Next> 눌러주세요

 

 

Execute누르면

 

Visual C++ 2010이 없으면 몇번클릭으로 받게 됩니다..

 

그런후에 Execute가 Next>로 바뀌죠 ^^ 클릭

 



 

 

전부는 필요없지만,,  Next> 클릭후에 Execute 클릭하세요..

 




맨위에것 선택하고 Next> 클릭

 

 

 

Root Password 와 Repeat Password를 입력하시고,, Next > 클릭

 


 

 

 

노란삼각형 주의표시 또 나왔네요~~ 어쨋든 두개다 설치가 되었으니

 

Next > 클릭 

 

 

여기서 Finish하면 설치는 끝이지만,, Workbench가 뜨게되니.. 저건 잠깐 체크해제하세요..

 

바탕화면내컴퓨터를 마우스 우클릭해서 속성선택

 

시스템정보 ==> 고급탭 ==> 환경변수 ==> 창이뜨면,,

 

시스템변수(S)에서 Path 를 더블클릭하거나 Path선택후 편집을 누르거나,, 없으면 하나만들어요.

 

시스템변수 편집 창이 뜨면,, 변수값에 C:Program FilesMySQLMySQL Server 5.5 in 를

 

입력합니다.. 입력하는 방법은 각폴더간의 구분은 세미콜론 ; 입니다.

 

즉, c:apache;c:php5 이런식이죠..

 

확인누르고,, 또 확인,, 또확인.. 세번하면 닫히죠..

 

 

 

 

\\\\\\\\\\\\\\

 

이제 실행이 되나 알아볼차례인데요..

 

시작 ==> 실행 눌러서 cmd입력합니다..

 

 

cmd창이 뜨면..

 

 

명령창에 mysql -u root -p 를 입력하고 엔터치면 패스워드 물어봅니다.. 아까 설치할때

 

썼던것 기억하시죠?? 그것 쓰면 됩니다.

 

\\\\\\\\\\\

 

 

 

이상으로 데이타베이스 설치를 끝냈습니다.........................

출처 : http://blog.naver.com/workdoumi?Redirect=Log&logNo=140140569122
Posted by 위너즈
|

MySQL을 사용할때 command창을 선호하시는 분들도 계시나...

(항상 전 시작은 이런식으로 하는듯;)

 

좀 편하게 사용하시라고 프로그램 하나를 소개해 드리겠습니다.

 

바로 SQLyog라는 녀석입니다.

 

개인적으로는 MySQL 공식사이트에 있는 MySQL Query Browser란 녀석보다 좋아라합니다.

 

이것도 추후 기회가 되면 소개하고... 우선 여기서는 SQLyog에 대해서만...



8.14버전에 와서 다시 글을 수정한 것은 이전 8.05에 썼던 내용에 비교해서 세부적인 부분들이 바뀌었기에 수정하였습니다.


1. 다운로드

 

http://code.google.com/p/sqlyog/downloads/list

 (이번에 사이트를 개편하면서 아예 다운로드를 구글 코드에서 받도록 하였더군요;ㅋ)

 

위 사이트에서... 제일 위에 있는 녀석을 다운로드 받읍시다^^; (그러니까 최신버전을ㅎ)

 

2. 설치

 

설치시에는 뭐; 그냥 따라가시면 됩니다^^;

 

3. 간단한 사용법

  

 

 

실행시키면 두둥! 이런 페이지가 뜨게 됩니다. 무섭게 buy버튼도 있고...

 

그냥 쌩~하고 Continue누르시면 됩니다.

 

 

DB에 연결해봅시다.

 

먼저 조금 오래전 버전들과는 다르게(워낙 자주 업데이트가 되다보니;) New를 눌러서 연결 정보를 저장해야합니다.

 

(예전에는 빈칸채우기?! 할 수 있었는데 말이죠)

 

 

그러면 위와 같이 Connection 이름을 적으라고 나와있는데 원하신는 이름을 적으시면 됩니다.

 

접속을 위해서 입력할 수 있는 칸들이 활성화됩니다

 

host address는... 저같은 경우에는 제 컴퓨터에 설치된 MySQL에 접속하기 때문에 localhost로...

 

User name은 접속하고 싶은 user name으로... (물론 user가 만들어져 있어야겠죠^^;)

 

비밀번호는 user의 비밀번호로...

 

열고 싶은 데이터베이스 적고...(안적어도 크게 상관은 없습니다.)

 

Connect~!

  

 


그러면 이렇게 나오는데...

 

제가 create~~쓴 부분이 query문 적는 부분이고~

 

왼쪽 옆에 DB들을 GUI로 보여주는 부분이고~

 

아랫부분이 Query 수행결과를 보여주는 것입니다~

 

근데 Query를 어떻게 실행시키면 되냐면요^^;

 

마우스 오른쪽 버튼 누르면 나오는 메뉴에서 다음을 선택해보면 실행할수있게 나올텐데...

 

F9 번 정도는 외워두면 편하겠죠?ㅎㅎㅎ 단축키 보시라고 캡쳐화면 보여드린거구요^^;

 

물론 위에 메뉴바에도 이런거 있습니다;ㅋㅋ

 

 

 

 

이제 GUI라고 하니 GUI답게 좀 써봅시다

(개인적으론 그냥 SQL문 치는게 속 편한 적이 많긴하지만;)

 

user에서 마우스 오른쪽버튼 클릭하면 다음과 같은 기능들을 수행할수 있습니다.

 

Create database 하면 이렇게 뜨는데... 설정 선택해서 create하면 DB가 생깁니다.

 

 

디비를 선택해서 마우스 오른쪽버튼 누르면 다음과 같이 나타납니다~!

 

MySQL에 조금 익숙하신 분은... 각각 기능이 무엇인지 아실 것입니다...

 

 

그냥 몇가지만 쭈~욱 보시라고 보여드리면...

 

테이블 만드는거~

 

 

SQL Dump로 backup도 되네요~

 

 
SQL dump를 import하는 부분도...


여기까지 하고... 또 하나... 테이블을 보게되면...

테이블을 열때 select * from ~~~ 하셔도 되지만

옆에서 테이블을 선택하셔서 오른쪽 버튼 누르고 open table을 선택하셔도 됩니다.



밑 부분에... 이렇게 나타나게 되는데...

테이블 모양으로...

 

 

수정하거나 삽입하고 싶은 열에 데이타 칼럼을 더블클릭하면...

 

테이블 안에 값들을 SQL문 없이 직접 수정할수있게 바뀌게 됩니다.

 

아까는 활성화되지 않았던 옆에 부분들이 활성화된거죠...

 

메뉴에 File에보면 sql파일로 저장하고 불러오는 기능이 있습니다 ㅎ 혹시나 해서 적어봅니다. 매번 sql문 다 쓰지 마시고^^;ㅋ

 

버전 7에 비해 전체적으로 깔끔해졌고 사용자의 실수를 많이 막을수있게 발전한 것 같습니다.

 

자동으로 예약어들은 대문자로 바꾸어주는 것도 마음에 들구요ㅎㅎㅎㅎ 


Posted by 위너즈
|

게임 해킹, 아는 만큼 막을 수 있다 [2006-11-29] 온라인 게임은 인터넷 사용자 증가와 환경 변화의 중요한 요인 중 하나로 자리잡고 있으며, 그 시장 규모도 2005년 1조 5천억원에 달할 정도로 고도성장을 이루고 있다. 하지만, 많은 사용자와 매출을 기록하는 화려함 뒤에는 해킹과 개인정보 유출, 아이템 거래 등 어두운 모습을 감추고 있다.

온라인 게임 보안

온라인 게임 보안은 말 그대로 온라인 게임을 공정하게 즐기는 문화를 만들기 위해 게임 상의 불법적인 행위를 감지/차단하여 게임의 밸런스를 지키는 것을 말한다. 온라인 게임에 대한 해킹은 서버 해킹와 클라이언트 해킹으로 구분 할 수 있다. 서버 해킹은 잘 알고 있는 해킹 방식이 대부분이다. 예를 들어, Dos 공격, 웹 취약점 공격, Free Server, 계정탈취, 트로이목마 등이 이에 속한다. 클라이언트 해킹은 일반적인 안티 해킹에 속하는 부분과 온라인 게임이란 영역에 특화된 부분으로 구분 지을 수 있다. 전자의 경우 일반적인 메모리 조작, 실행파일 조작, 패킷 조작 등이 있으며, 후자의 경우 스피드핵, 매크로, 오토마우스, Non-Client Bot 등이 있다.

서버 해킹의 경우 꼭 게임이 아니더라도 일반 서비스의 경우도 유사한 해킹이 발생하고 있으며, 온라인 게임 보안이 아닌 다른 분야에서도 많이 다루어지는 문제이기 때문에, 서버 해킹에 대해서 여기서 추가로 설명하지는 않기로 하며, 클라이언트 해킹에 중점을 두어 설명을 하도록 하겠다.

[표1]은 악성코드와 온라인 게임 해킹의 차이를 구분하여 설명한 것이다.

구분 악성코드 온라인 게임 해킹
대상 불특정 다수의 시스템 특정 게임 서비스
성향 시스템 파괴 게임 플레이 조작
목적 자기과시, 시스템 파괴 금전적 이익
특이사항 악성코드로부터 보호하고자 하는 대상이 명확함 개발도구, 장애인을 위한 보조 프로그램들이 해킹에 사용
보안제품에 대한
사용자 인식
보안제품은 사용자의 동지 보안제품은 사용자에게 귀찮은 존재


[표1] 악성코드와 온라인 게임 해킹의 차이


주요 국가의 온라인 게임 해킹 동향

▶ 한국
한국은 온라인 게임의 종주국으로 온라인 게임 해킹의 인프라(?)가 잘 갖추어진 지역이라고 할 수 있다. 그러나, 온라인 게임 해킹의 기술은 이제 초기 단계를 벗어났다고 볼 수 있다. 한국에서 제작되는 대부분의 해킹툴들이 매크로이며, 간단한 메모리 데이터 조작도 발견된다.
한국의 해킹기술 대부분은 중국의 기술이 그대로 유입되거나, 중국과 동남아를 거쳐 유입되기 때문에, 중국과 동남아와는 2-3개월의 차이를 두고 유사해킹이 발생한다. 그렇지만, 한국은 다른 나라가 갖추지 못한 초고속 인터넷 인프라로 인해 상대적으로 기술을 습득할 만한 환경이 잘 갖추어져 있기 때문에 앞으로 한국의 해킹 기술은 급속도로 발전하게 될 痼見? 이는 온라인 게임의 발전에 상당히 위협적인 요소가 될 것이다.

▶ 일본
일본은 세계적인 게임 시장이지만 비디오 게임이 대부분을 차지하고 있으며, 온라인 게임은 이제 막 태동 단계이다. 해킹 기술은 그들의 국민성을 반영하듯 매우 세밀하게 접근하며, 메모리 조작과 실행파일 조작이 주를 이룬다. 아직까지는 해커 그룹도 조직적이기 보다는 개인적 성향이 강하고 금전적인 이익보다는 개인과시용으로 해킹툴을 제작하여 배포하는 경우가 많다. 그러나, 최근 들어 한국의 메이저 온라인 게임들이 일본에 진출함에 따라 중국 해킹그룹의 영향력이 일본에 미치면서 일본의 해킹그룹도 금전적인 이익을 목표로 조직화되는 양상을 보이고 있다. 따라서 일본에 진출한 한국 온라인 게임들의 주의가 요구된다.

▶ 중국
중국은 가장 온라인 게임 해킹이 활성화된 나라로 대부분의 해킹 사이트가 중국에 거점을 두고 있다. 중국의 해킹 조직은 이미 조직적 단계를 넘어서 기업화를 이루고 있으며, 그들의 영향력이 한국과 동남아에 미칠 정도로 매우 크다.
중국은 게임 해킹의 모든 것을 총망라하여 다루고 있으며, 주로 네트워크 패킷을 분석하여 적절한 게임코드를 그대로 뜯어서 붙이는 방법으로 Non-Client Bot를 제작하거나, Free Server를 제작하여 별도 게임 서비스를 직접 운영하기도 한다. 최근에는 게임 클라이언트와 게임 서버 사이에 Proxy를 두고 게임패킷을 중간에서 변조하는 Proxy 공격이 많이 발생하고 있다.

▶ 미국
미국은 일본과 더불어 세계적인 게임 시장이다. 아직 PC게임과 비디오 게임이 주류를 이루고 있으나, 온라인 게임이 급속도로 확산되고 있는 상황이다. 게임 서버에 대한 Dos 공격이 많이 이루어지며, 클라이언트의 경우 메모리 조작이 가장 많이 발생하고 있다.


온라인 게임의 주요 해킹 기술

지금부터는 온라인 게임 서비스의 취약점들을 겨냥한 주요 해킹 기술에 대해서 설명을 하고자 한다.


[그림1] 온라인 게임 서비스의 취약점


▶ 게임의 속도를 조절하는 스피드핵
스피드핵은 MMORPG나 FPS 게임에서 가장 많이 사용하는 해킹툴 중 하나로 게임의 스피드를 가속시켜 게임의 흐름을 자신에게 유리하도록 바꾸는 툴이다. 스피드핵을 사용할 경우 게임의 밸런스가 무너지는 것은 물론이고, 상대적으로 많은 패킷을 교환하게 되어 서버에 랙(Lag)을 유발하기도 한다.

스피드핵은 동작방식에 따라 다음과 같이 구분할 수 있다.

구분 소프트웨어 방식 하드웨어 방식
동작방법 윈도우 시간관련 함수를 Hooking하여 카운터를 조작함 타이머와 사운드를 다루는 8263/8254 포트에 어셈블리명령으로 Frequency를 바꿔 카운터를 조작함
해킹대상 시간 관련 함수timeGetTime, timeGetSystemTime, timeSetEvent, GetTickCount, SetTimer, GetMessageTime, QeuryPerformanceCounter 등 8253/8254 PIT (Programmable Interrupt Timer)

[표2] 동작방식에 따른 스피드핵의 구분


[그림2] SpeederXP 스피드핵


▶ 게임을 자동으로 플레이할 수 있는 오토마우스 / 오토 플레이
스피드핵과 함께 가장 알려져 있으며, 게임 밸런스에도 민감한 영향을 주는 해킹 기술이다.
게임 상에서 해킹툴을 시작하기만 하면, 사용자의 특별한 조작없이 자동으로 봅을 발견하여 공격하고, HP가 떨어지면 자동으로 물약을 복용하는 등의 기능을 수행한다. 특히, 오토마우스의 경우 아이템 거래 사이트에서 실제로 현금거래가 되고 있으며, 하드웨어에 기반한 오토마우스의 경우 이미 제작자들이 기업화되어 있는 상황이다.

오토마우스는 동작방식에 따라 다음과 같이 구분할 수 있다.

구분 동작 방식
유저레벨 관련 윈도우 API(SendInput, keybd_event, mouse_event, SendMessage 등)를 이용하여 게임 프로그램에게 메시지(Message)를 보내 마우스와 키보드 입력을 자동으로 실행
커널레벨 윈도우 OS가 구성하고 있는 Keyboard 및 Mouse Driver의 Filter로 들어가 마우스와 키보드 입력을 자동으로 실행
하드웨어 Mouse, Keyboard 장비가 PC본체에 연결되는 포트에 Hub식으로 연결되는 하드웨어로 장비에 삽입된 Firmware에 따라 키보드나 마우스의 동작 신호를 자동으로 입력. 최근에는 USB 형태로 간편하고 휴대가 편하게 제작되어 판매되고 있음

[표3] 동작방식에 따른 오토마우스 종류


▶ 메모리 조작, 파일 조작, 패킷 조작
메모리 조작, 파일 조작, 패킷 조작 등은 일반적인 안티 해킹의 영역이라고 볼 수 있다. 통상적으로 이러한 해킹 기술들은 복합적으로 나타나곤 한다. 예를 들어, 게임패치를 담당하는 패쳐를 조작하여 패치가 이루어지지 않도록 조작을 한 후, 해킹툴을 실행하여 메모리나 패킷을 조작하는 형태를 이룬다.
파일 조작은 주로 실행파일(PE)에 대한 조작이 이루어지고 있으며, 암호화된 Data 파일을 풀어서 임의로 조작하기도 한다. PE 파일 조작의 경우는 변조하고자 하는 코드가 영구적으로 적용되기 위한 목적으로 사용되며, Code Segment의 게임 주요 루틴을 어셈블리 바이너리 코드로 치환한다.
메모리 조작 기술은 DLL Injection이나 API Hooking, SDT Hooking 등의 기술을 사용하여 메모리 내의 게임 Data와 주요 루틴의 흐름을 조작하는 것을 말한다. Data 조작의 경우 Data의 변경이 정상적인 행위에 의한 결과인지 여부를 판단할 수 있는 기준이 모호하기 때문에 가능한 주요 Data는 게임 서버에서 관리하고 검증하는 것이 피해를 최소화할 수 있는 방법이다.


[그림3] 메모리 상의 코드조작 예


패킷 조작은 일반적으로 send, recv, WSASend, WSARecv 등과 같은 Socket API를 Hooking 하거나, LSP(Layerd Service Provider)와 NDIS(Network Diver Interface) 레벨에서의 조작이 많이 사용된다.

▶ Non-Client Bot
Non-Client Bot은 게임 클라이언트를 실행하지 않고 해킹툴으로 실행하는 것으로, 게임을 자동으로 진행할 수 있도록 하는 해킹툴을 말한다. 이러한 Non-Client Bot은 실제 게임 클라이언트처럼 화려한 그래픽을 자랑하는 것이 아니라 단순한 Dialog Box에 설정버튼과 실행버튼만을 제공하고, 게임 서버와는 마치 실제 유저가 게임에 로그인하여 게임을 진행하고 있는 것과 동일한 패킷을 주고받는다.

[표4]와 [그림4]에서 Non-Client Bot의 특징과 동작방식에 대해 간략히 설명하였다.

구분 내용
특징 게임 해킹툴 중 가장 악성적이며, 대응도 어려움
게임 구조에 영향을 많이 받기 때문에 특정 게임에 특화되어 제작됨
게임 클라이언트를 디버깅하고 패킷을 완벽히 분석하여 인증부터 게임 진행, 종료까지 실제 게임과 동일한 메시지를 생성
중국에서 가장 활발한 제작과 판매가 이루어짐
하드웨어 게임 밸런스와 매출에 가장 심각한 영향을 미침
게임 서비스의 존폐와 직결될 만한 파워를 가진 해킹툴
실제 게임을 하지 않는 유저들의 접속으로 서버 부하 발생

[표4] Non-Client Bot의 특징



[그림4] Non-Client Bot의 동작 방식


게임보안의 도전

온라인 게임 해킹 기술은 악성코드의 기술이 유입되면서 급속도로 발전하고 있다. 최근의 기술 트렌드는 하이브리드 방식으로 해킹툴이 RootKit으로 동작하며, 자체 보호 기능도 많이 보강되고 있다.

또한, 그동안 PC게임과 비디오 게임에 집중하던 해외 메이저 게임사들이 온라인 게임에 뛰어들고 있으며, 국내 업체들도 해외진출에 투자를 하고 있는 상황이라 앞으로의 게임 해킹은 더욱 다양화되고 고도화될 전망이다.

이를 위해 게임 보안은 본격적인 서비스 체제를 갖추어 글로벌 환경에 대응할 수 있는 시스템을 갖추는데 주력하면서 지금까지와는 다른 새로운 도전을 맞을 준비를 해야 할 것이다.

출처 : http://epicros.tistory.com/81


Posted by 위너즈
|

이러한 자동입력 기능은 이미 win API함수로 만들어져 있다.
 
보안 업체는 이러한 API함수가 작동되지 않게 하였기 때문에 엔프로텍터나, 게임가드 등과같은
 
보안을 사용하는 프로그램의 오토제작을 위해서는
 
내장 API를 쓸수 없고(써도 되지만 동작하지 않는다) device driver로 새로 만들어야 된다.
 
물론 기본적인 device driver도 보안업체에서 이미 막아두었고 몇가지 우회를 통해서 만들어야 된다.
 
device driver는 범위를 벗어나기 때문에 설명은 생략하고...
 
 
API에는 다음과 같은 두가지 함수가 자동 입력기능을 담당하여 준다.
 
함수에 대한 설명은 msdn library를 참조하기 바란다.  설명은 생략하겠다.
 
VOID WINAPI keybd_event(
  __in  BYTE bVk,
  __in  BYTE bScan,
  __in  DWORD dwFlags,
  __in  ULONG_PTR dwExtraInfo
);
VOID WINAPI mouse_event(
  __in  DWORD dwFlags,
  __in  DWORD dx,
  __in  DWORD dy,
  __in  DWORD dwData,
  __in  ULONG_PTR dwExtraInfo
);
 
 
예제는 msdn library에서 발췌하였다.
 
#include <windows.h>

   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

      // Simulate a key release
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }

   void main()
   {
      SetNumLock( TRUE );
   }
 
scancode에 대한 참조는 다음 사이트를 참조하기 바란다.
 
http://www.codeproject.com/KB/system/keyboard.aspx
 
 
 
mouse_event()에서 dx, dy는 마우스의 화면 좌표를 가리키는데 0 ~ 65535의 범위를 가진다.
 
이는 화면 해상도에 상관 없이 똑같은 값을 가지는데 이는 해상도에 상관 없이 함수를 사용하기 위해서인 것 같다.
 
이점만 유의하면 함수를 사용하는데 다른 문제는 없을 것 같다.
 
다음은 마우스 이동에 관한 함수 예이다.
 
// 마우스를 이동한다. 현재 좌표에서 이동한다.
void CDriver::MouseMove(DWORD dwMoveX, DWORD dwMoveY)
{
  // 상대 좌표는 마우스의 현재 위치를 기준으로 움직인 것을 나타낸다.
  //
  // 마우스의 절대좌표는 화면 좌측상단은 0,0  우측하단은 65535,65535 이다.
  // 그렇기 때문에 화면 좌표가 들어오면 절대촤표 기준으로 변환시켜서 대입해줘야 된다.
  int scrWidth, scrHeight;
  scrWidth = GetSystemMetrics(SM_CXSCREEN);
  scrHeight = GetSystemMetrics(SM_CYSCREEN);
  int scrX = dwMoveX;
  int scrY = dwMoveY;
  mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, scrX*65535/scrWidth, scrX*65535/scrHeight, 0, 0);
 return;
}
 
이제 오토제작에 필요한 모든 기능을 알아보았다..
 
다음에는 마지막으로 간단에서 적용된 코딩예를 설명하겠다.

출처 : http://koronaii.tistory.com/219

Posted by 위너즈
|

 

클립보드에서 데이터 얻기와 데이터 쓰기

클립보드에서 데이터를 얻고자 할 경우 GetClipboardData 함수를 사용합니다.

예를 들어서 클립보드에서 텍스트 데이터를 얻고자 한다면 다음과 같이 할수 있습니다.

         HANDLE hClipboard;

hClipboard=GetClipboardData(CF_TEXT);

만약 텍스트 데이터가 없다면 hClipboard에는 NULL값이 전송될것입니다. 넘겨주는 형식이 메모리 핸들러 형식이기 때문에 이데이터를 사용허가권을 받기 위해서는 GlobalLock를 사용해야 합니다.


 

 HANDLE hClipboard;

 LPASTR pClipboard;

hClipboard=GetClipboardData(CF_TEXT);

pClipboard=GlobalLock(hClipboard);

 //pClipboar를 사용한다.


 

위와 같이 하면 클립보드에 있는 데이터를 바로 사용하는 형식이 됩니다. 때로는 클립보드에 있는 데이터를 자신의 프로그램 내로 복사하고자 할경우가 있습니다. 이럴경우에는 클립보드에 저장된 데이터 크기만큼 메모리를 확보한후에 데이터를 복사하면 됩니다. 다음은 클립보드에서 데이터를 복사하는 예입니다.


 


 

           //클립보드를 연다

        OpenClipboard(hwnd);

        //문자형식의 데이터를 클립보드에서 얻는다.

        hClipboard=GetClipboardData(CF_TEXT);

        //hClipboard가 NULL이면 클립보드를 닫는다.

        if(!hClipboard)

        {

                CloseClipboard();

                 return 0;

        }

        //클립보드 데이터를 넣을 메모리 할당

        szBuff=GlobalReAlloc(szBuff,GlobalSize(hClipboard),GMEM_MOVEABLE);

        //메모리 사용 허가권을 받는다.

        pBuff=(LPSTR)GlobalLock(szBuff);

        //클립보드 메모리 사용허가권을 받는다.

        pClipboard=GlobalLock(hClipboard);

        //클립보드 데이터를 복사한다.


 

클립 보드에 데이터를 넣고자 한다면 SetClipboardData를 사용하여 간단하게 넣을 수 있습니다.


 

HANDLE SetClipboardData(

UINT uFormat, // 클립 보드 데이터 포맷

HANDLE hMem // 데이터 적재 메모리 핸들

); 


 

위의 예에서 pBuff에 있는 데이터를 수정한후 다시 클립보드에 넘기고자 할 때 있대 pBuff를 넘겨주는 것이 아니라 szBuff를 넘겨주어야 합니다. 클립보드로 넘어가는 것은 메모리 사용 허가 포인터 변수가 아니라 메모리 핸들러 이기 때문입니다.

 SetClipboardData(CF_TEXT,szBuff);


출처 : http://kr.blog.yahoo.com/koglul82/1984
Posted by 위너즈
|

Win32를 작성하기위한 기본적인 틀을 만들어 보기로 하겠다.

단순히 메인창을 다이얼로그박스로 띄울 뿐이다.

파일 생성은 다음과 같다.
step 01. VS 2008 >> 새 프로젝트 
step 02. Visual C++ >> Win32 >> Win32 프로젝트
step 03. ((이름과 위치는 원하는 것으로 설정 하고 확인))

== Win32 응용프로그램 마법사 대화상자가 활성화==
step 04. 응용프로그램 설정단계에서 빈 프로젝트 체크박스 체크
step 05. 마침 (솔루션에는 아무런 파일도 존재하지 않는다)

== 솔루션 탐색기의 프로젝트와 리소스, 소스, 헤더 파일이라는 폴더가 활성화 ==
step 06. 프로젝트에서 리소스를 추가한다.


step 07. ID값을 IDD_DIALOG_MAIN로 변경


step 08. 프로젝트에서 새항목을 추가한다.(단순히 Basic.cpp로 만들었다)

<결과> 솔루션 탐색기에 다음과 같이 파일이 정리 된다.

step 09. Basic.cpp에 코드를 작성한다. 코드는 다음과 같다.

// Basic.cpp

#include <Windows.h>
#include <Windowsx.h>
#include <tchar.h>
#include "resource.h"
#include "Main.h"

INT_PTR WINAPI MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdParam, int nCmdShow)
{
 // DialogBox생성 함수
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), HWND_DESKTOP, MainDlgProc);

 return 0;
}

// DialogBox Procedure
INT_PTR WINAPI MainDlgProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 switch (iMessage)
 {
 case WM_INITDIALOG :
  //InitDialogBox(hWnd);
  return TRUE;

 case WM_COMMAND :
  switch (LOWORD(wParam))
  {
  case IDOK :
  case IDCANCEL :
   EndDialog(hWnd, IDOK);
   return TRUE;
  }
  return TRUE;
 }

 return FALSE;
}


참고:
SetDlgMsgResult :
Windowsx.h에 선언되어 있으며 메세지 크래커 이다.
Window Procedure(WindProc)지 크래커로는 HANDLE_MSG 매크로가 존재한다.
하지만 DialogBox에서는 이 매크로를 사용하기에는 적절하지 않다.
DlgProc는 WindProc과는 달리 LRESULT 대신 BOOL 값을 반환하게 된다.
그래서 HANDLE_MSG가 아닌 SetDlgMsgResult를 사용하였다.
사실.... 이렇게 짧은 코드에서는 필요하지 않으나... 기본 틀로 작성한것이다.


Posted by 위너즈
|

10004, "블럭킹 윈속이 WSACancelBlockingCall 함수에서 취소되었습니다 ") );
10009, "잘못된 기술자(소켓 핸들)이다 ") );
10013, "브로드캐스트 어드레스를 위한 데이터그램 소켓의 접속시도가 setsockopt 함수로 SO_BROADCAST가 설정되어있지 않은 상태에서 실패 했습니다. ") );
10014, "name 또는 namelen 매개변수가 올바른 형태가 아닙니다. ") );
10022, "accept 하기 전에 listen 함수가 불려지지 않았습니다. ") );
10024, "새로운 소켓에 할당하기 위한 소켓 기술자가 더 이상 남아있지 않습니다 ") );
10035, "소켓 함수가 비블럭킹 모드로 동작중이다 ") );
10036, "블록화 함수가 호출 되는 동안 부적절한 소켓 함수가 호출되었다 ") );
10037, "이미 완료된 비동기 명령에 대한 취소가 시도됨 ") );
10038, "지정한 기술자가 소켓 기술자가 아닙니다 ") );
10039, "해당 함수에 목적지 어드레스가 필요하지만 제공되지 않았음 ") );
10040, "수신된 메시지가 지정된 버퍼에 저장하기에 너무 커서 손실 되었습니다 ") );
10041, "지정된 프로토콜이 잘못되었거나 이 소켓에 대해서 잘못된 형식입니다 ") );
10042, "알 수 없는 옵션이거나, 지원지지 않는 옵션을 사용했습니다. ") );
10043, "지정된 프로토콜이 지원되지 않는 형식입니다 ") );
10044, "지정된 소켓 타입이 지정한 어드레스 체계에서 지원되지 않는 형식입니다 ") );
10045, "socket이 연결지향형 서비스(SOCK_STREAM)형태가 아닙니다. ex) listen이 UDP socket에서 호출 ") );
10046, "지정된 프로토콜 체계가(PF_*) 지원되지 않습니다 ") );
10047, "지정된 어드레스 체계가(AF_*) 지원되지 않습니다 ") );
10048, "지정한 어드레스(IP)가 이미 사용중이다 ") );
10049, "지정된 어드레스는 로컬 머신에서 사용할 수가 없다 ") );
10050, "네트웍 서브 시스템에 에러가 발생했습니다 ") );
10051, "원격 시스템까지 네트웍이 도달할 수 없습니다 ") );
10052, "연산이 진행되고 있는 도중 접속이 끊겨버렸습니다. ") );
10053, "연결이 out-of-band나 다른 실패 때문에 끊어져 버렸습니다. ") );
10054, "원격 연결지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다. ") );
10055, "윈도우 소켓 시스템의 버퍼 공간이 모자라거나, 애플리케이션에 의해 API에게 제공된 공간이 너무 작아서 요청된 정보를 저장 할 수가 없음 ") );
10056, "지정된 소켓이 이미 연결 되어 있음 ") );
10057, "지정된 소켓이 이미 연결 되어 있지 않음 ") );
10058, "소켓이 셧다운(shutdown()) 되었습니다. ") );
10059, "지정한 함수에 대한 인자가 너무 많음") ); 
10060, "접속 시도가 시간초과 되었습니다. ") );
10061, "접속시도가 강제로 종료되었습니다 ") );
10062, "") );                  
10063, "") );                  
10064, "원격 호스트가 다운 되었음 ") );
10065, "네트웍 시스템 장애 등에 의해서 원격호스트까지도 달 할 수 없습니다.") );
10091, "네트워크 서브 시스템이 아직 통신할 준비가 되어 있지 않음(WSAStartup()이 반환)") ); 
10092, "요청한 윈도우즈 소켓 버전이 현재 윈도우즈 소켓 시스템에서 지원하지 않습니다. ") );
10093, "이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.") ); 
11001, "호스트를 찾아낼 수 없습니다.") );
11002, "요청된 정보가 발견 되지 않음") );
11003, "회복할 수 없는 에러발생") );
11004, "잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다. ") );
Posted by 위너즈
|

Thread 의 종료를 기다리기 WaitForSingleObject 를 사용할때 주의할 사항이 있다.

 

[main]

SetEvent(exit_event);
DWORD waitResult;
waitResult = WaitForSingleObject(m_loadingThread, 20000);

[m_loadingThread]

while(true) {

    waitResult = WaitForSingleObject(exit_event, 20000);

    if (waitResult == WAIT_OBJECT_0) break;

    // Some Task that takes some time.

}

위의 코드를 보자. m_loadingThread 에는 exit_event 를 주면 Thread 가 종료되는 코드가 루프로 돌고 있고, main 에서는 exit_event 를 세팅하여 Thread 를 종료시키고자 한다. 하지만, 이 경우 문제점이 있다.

Thread 가 "Some Task" 를 실행중인 경우라면 WaitForSingleObject 문이 실행되는 시점에 Thread 가 살아있고, Thread 가 루프를 다시 돌아 break 를 만나 쓰레드가 종료되면 해피한 케이스로 모든 일이 종료될 것이다.

하지만, SetEvent 와 동시에 break 를 만난다면? SetEvent 와 동시에 쓰레드 루프에서 벗어나 쓰레드 함수가 종료될 것이고, WaitForSingleObject 는 이미 종료되어 버린 Thread 의 handle 을 무작정 기다리게 된다.

 

MSDN 에서는 "어떤 현상이 발생할지 알 수 없다." 고 경고하고 있다. (빨간색 부분)

(http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx)

 

The WaitForSingleObject function returns when the specified object is in the signaled state or the time-out interval elapses.

To enter an alertable wait state, use the WaitForSingleObjectEx function. To wait for multiple objects, use the WaitForMultipleObjects.

DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);

Parameters

hHandle
[in] Handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section.

If this handle is closed while the wait is still pending, the function's behavior is undefined.

The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.

dwMilliseconds
[in] Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.

실제 테스트 결과, 대체로 Hangup 이 걸리는 현상이 발생하였다.

사용시 Thread 가 종료된 상태로 WaitForSingleObject 를 만나는 일이 없도록 주의해야 한다.

 

Thread 종료시 Sleep 을 이용하는 방법도 있겠지만 Sleep 을 쓰는 방법은 가급적 지양하는 것이 좋을 것이므로

그래서 아래와 같이 로직을 보완하였다. thread_state 를 두어 Thread가 종료되었는지 체크하도록 한다.

 

[main]

SetEvent(exit_event);
DWORD waitResult;

if (thread_state != MY_STATE_EXIT)
     waitResult = WaitForSingleObject(m_loadingThread, 20000);

[m_loadingThread]

thread_state = MY_STATE_RUNNING;

while(true) {

    waitResult = WaitForSingleObject(exit_event, 20000);

    if (waitResult == WAIT_OBJECT_0) break;

    // Some Task that takes some time.

}

thread_state = MY_STATE_EXIT


출처 : http://blog.naver.com/hankawiii?Redirect=Log&logNo=90084211565
Posted by 위너즈
|

Thread의 사용방법 : http://scarlett.tistory.com/entry/Thread-2Thread의-사용방법

Thread와 Thread의 상속 : http://scarlett.tistory.com/entry/Thread-3Thread와-Thread의-상속

간단한 Thread 검색 프로그램 : http://scarlett.tistory.com/entry/Thread-4간단한-Thread-검색-프로그램

 

 

쓰레드를 구현하는 방법은 Thread클래스를 상속받는 방법과 Runnable인터페이스를 구현하는 방법, 모두 2가지가 있다. 이 두 가지 방법 중 어느 쪽을 사용해도 별 차이는 없지만 Thread클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable인터페이스를 구현하는 방법이 일반적이다.

 

Runnable인터페이스를 구현하는 방법은 재사용성(reusability)이 높고 코드의 일관성(consistency)을 유지할 수 있다는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있겠다.

 

1. Thread클래스를 상속

 

class ThreadExtends extends Thread {

public void run() {

// 작업내용 

} // Thread클래스의 run()을 오버라이딩

}

 

 

2. Runnable인터페이스를 구현

 

class RunnableImplements implements Runnable {

public void run() {

// 작업내용 

} // Runnable인터페이스의 추상메서드 run()을 구현

}

 

쓰레드를 구현한다는 것은 위의 2가지 방법 중 어떤 것을 선택하건 간에, 쓰레드를 통해 작업하고자 하는 내용으로 run()의 몸통을 채우기만 하면 되는 것이다.

 

 

Thread클래스를 상속받은 경우와 Runnable인터페이스를 구현한 경우의 인스턴스 생성방법은 다릅니다.

 

1. Thread클래스를 상속받아 실행

ThreadExtends te = new ThreadExtends();

te.start(); 

 

2. Runnable인터페이스를 구현하여 실행

 

Runnable r = new RunnableImplements();

Thread t = new Thread(r);

t.start(); 

 

 

여기서 한 가지 더 알아 두어야 할 것은 한 번 사용한 쓰레드는 다시 재사용할 수 없다는 것이다. 즉, 하나의 쓰레드에 대해 start()가 한 번만 호출될 수 있다는 뜻이다.

 

 

start()와 run()에 대한 차이와 쓰레드가 실행되는 과정

 

run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드 하나를 호출하는 것이다. 반면에 start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(call stack)을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 첫 번째로 저장되게 한다.

 

1. main메서드에서 쓰레드의 start메서드를 호출한다.

2. start메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출스택을 생성한다.

3. 생성된 호출스택에 run메서드를 호출해서 쓰레드가 작업을 수행하도록 한다.

4. 이제는 호출스택이 2개이기 때문에 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행된다. 

 

한 쓰레드에서 예외가 발생해서 종료되어도 다른 쓰레드의 실행에는 영향을 미치지 않는다.

출처 : http://blog.daum.net/hughlee193/138

'Programming > JAVA' 카테고리의 다른 글

JAVA Thread 동기화 방법  (0) 2011.05.02
Posted by 위너즈
|