Computer2009. 5. 18. 21:38
윈도우에서 특정 프로그램을 실행 하면


이런 문구를 볼수 있을것이다..

msvcr71.dll은
자바에서 SWT 어플리케이션을구동할때필요한파일로 자세한거는 나도 잘....

암튼 이 파일이 없어서 나오는 문구 이다..

그래서 이 파일을

C:\WINDOWS\system32   폴더에서 복사 해주기만 하면 된다.


다운 받아서 압축 풀어서 사용!!!

mfc71_shakii.zip


msvcp71_shakii.zip


msvcr71_shakii.zip






 



 
 

Posted by 샤키
Computer2009. 5. 17. 16:27
C언어 작성이나 리버싱 작업을 하면서 코딩글꼴에 관심을 가지게 되었다.
http://www.lowing.org/fonts/  이런 코딩글꼴 순위 사이트도 있을정도이니...
여기 사이트에서 말하는 좋은 폰트의 조건은
1. 가독성이 좋아야함.
2. 확장된 문자셋을 지원해야함.
3. 스페이스가 쓰기 쉬워야함.
4. l, 1, i의 구분이 쉬워야함.
5. 0, o, O의 구분이 쉬워야함.
등등..

여기서 나도 공감이 되는것은 4, 5번 정말 이상한 글꼴은 짜증 지대 ;;;
순위 사이트에서도 1위인 Bitstream Vera Sans Mono 써보면 알겠지만 어느정도 1위인 이유가 있다..
일단 아래 스샷을 보며 비고 해보면

IDA에서 MS자체의 굴림체 보통의 크기 10



MS 돋움체 보통 크기  10



Bitstream Vera Sans Mono 폰트로 Bold 크기 9



네이버 나눔고딕 코딩글꼴 Bold 크기 10



스샷을 보면 알겠지만 가장 일반적인 굴림체, 돋움체..  코딩용으로 나온것이 아니니 불편한것은 당연 하지만
모르시는분은 코딩용을 저걸 쓰시는분들 계신다 (뭐 자기가 불편하지 않다면...)
네이버에서 코딩용글꼴도 어느정도 쓸만 하다.
Bitstream Vera Sans Mono는 크기9에서 가독성이 가장좋고 네이버꺼는 크기10에서 가독성이 좋다..
그래서 네이버는 뭔가 글씨간격이 너무 띄엄띄엄 있는 분위기(?)가
그래서 나는 Bitstream Vera Sans Mono글꼴을 추천
하지만 일단 사람마다 개성있고 자기 입맛에 맞는것을 쓰는것을 추천한다.

Dejavu Sans Mono라고 Bitstream Vera Sans Mono글꼴을 조금 수정한 글꼴도 쓸만하다
http://dejavu-fonts.org/wiki/index.php?title=Main_Page
Posted by 샤키
Reverse Engineering2009. 5. 13. 00:16
OllyDbg 도구모음

두번째칸에 dubug 재시"자" 라고 오타가 있네요. "재시작" ^^







W32DASM 도구모음

사실 W32DASM은 나도 잘 안써서 암튼 정보차원에서!!




디버거 잘 사용 하시는분들은 잘 아시겠지만 저처럼 잘 잊어먹는 사람을 위해 ^^; (점점 숙달되면 오로지 단축키로만 ㅋ)




출처 : http://cafe.naver.com/cmenia
Posted by 샤키
Linux/Unix2009. 5. 10. 16:51
    1. 커서 이동하기
    k는 한 줄
    h는 한 문자 왼쪽으로
    l은 한 문자 오른쪽으로
    j는 한 줄 아래
    b는 한 단어 으로
    w는 한 단어
    ^는 그 줄의 시작으로
    $는 그 줄의 마지막으로
    :n?특정줄로 이동합니다.(n는 숫자)
    Ctrl+f한 화면 아래
    Ctrl+b한 화면 위
    Ctrl+d반 화면 아래
    Ctrl+u반 화면 위
     
      2. 화면 이동하기
      z
      z.
      z-
      <n
      >n
      /sss/+n
      ?sss?-n
      ?L
      현재의 줄이 화면의 맨 위에 오도록 다시 그림
      현재의 줄이 화면의 가운데 오도록 다시 그림
      현재의 줄이 화면의 맨 아래에 오도록 다시 그림
      화면을 왼쪽으로 n(숫자)만큼 이동
      화면을 오른쪽으로 n(숫자)만큼 이동
      현재부터 뒤로 문자열 sss가 나타난 첫줄부터 n줄 뒤로 커서 이동
      현재부터 앞으로 문자열 sss가 나타난 첫줄부터 n줄 앞으로 이동
      talk 명령수신등으로 화면이 지저분할 때 다시 그림
       
        3. 문자 삭제하기
        x는 한 문자
        dw는 한 단어
        dd는 한 줄
        D는 커서부터 줄 끝까지
        :line#,line#d는 지정범위를 삭제합니다
        (예) :1,$d (첫줄부터 마지막줄까지)
        :1,. (첫줄부터 현재줄까지)
        :.,$d (현재줄부터 마지막줄까지)
        :.-2 (현재줄부터 두번째앞줄까지)
         
            4. 탐색과 치환하기
            :/zzz? 현재위치에서 파일의 뒤쪽으로 문자열 zzz를 탐색
            :?zzz? 현재위치에서 파일의 앞쪽으로 문자열 zzz를 탐색
            :n? 마지막 탐색 명령을 반복
            :line#,line#s/zzz/sss/? 지정한 범위내의 문자열 zzz 처음것만을 sss로 치환
            :line#,line#s/zzz/sss/g? 지정한 범위내의 문자열 zzz를 sss로 모두 치환
            :%s/zzz/sss/ 모든 줄의 치환
             
              5. 임시기억장소인 버퍼에 복사했다가 붙이기
              yy (현재줄을 버퍼에 복사)
              n yy (현재줄부터 시작하여 n줄 뒤까지 복사하여 버퍼에 저장)
              p (이미 버퍼에 복사해 둔것을 현 위치 뒤에 붙이기)
              (P or :p? or :P? 모두 같음)
              :line#,line#y? (해당줄을 버퍼로 복사)
              :line#,line#yy? (해당줄을 버퍼로 복사한 후 삭제)
              :line#,line#Y? (해당줄을 버퍼로 복사한 후 삭제)
              :line#p (지정한 줄 다음에 버퍼에 복사해 둔 것을 붙이기)
              :\"버퍼이름y? (버퍼로 버퍼이름에 복사)
              :\"버퍼이름p? (버퍼이름의 버퍼에 저장된 내용을 복사)
               
                6. 여러 파일을 동시에 편집하기
                yskang%> vi test1.txt test2.txt test3.txt
                yskang%> vi test*.txt
                :n? (현재 편집중인 파일의 다음 파일을 편집)
                :e <파일명>? (현재의 파일이 아닌 다른 파일 <파일명>을 편집)
                 
                   7. 기타 명령
                  :!<명령>? (vi에서 빠져나와 유닉스 명령을 시행하고 vi로 되돌아 옴)
                  :!sh? (유닉스 쉘로의 나들이를 시작하며 나들이를 끝낼때는 ?d)
                  :.r <파일명> (현재 파일의 현재 줄 뒤에 다른파일 <파일명>을 삽입)
                  :line#,line# w <파일명> (현재 파일의 해당줄을 )
                  . (가장 최근에 지시한 명령을 반복)
                Posted by 샤키
                Reverse Engineering2009. 5. 2. 16:03
                1.어셈블리어 Push: sp 레지스터를 조작하는 명령어중의 하나이다. 스택에 데이터를 저장하는데 쓰인다. ex:) Push eax :스택에 Eax의 값을 스택에 저장한다. ex:) Push 20 :즉석값인 20을 스택에 저장한다. ex:) Push 401F47 :메모리 오프셋 401F47의 값을 스택에 저장한다. Pop: 이또한 sp 레지스터를 조작하는 명령어중 하나 이다. 스택에서 데이터를 꺼내는데 쓰인다. ex:) Pop eax :스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장 주의점: Push 의 역순으로 값은 스택에서 Pop 된다. Mov: 메모리나 레지스터의 값을 옮길떄[로 만들떄] 쓰인다. ex:) Mov eax,ebx :ebx 레지스터의 값을 eax로 옮긴다[로 만든다]. ex:) Mov eax,20 :즉석값인 20을 eax레지스터 에 옮긴다[로 만든다]. ex:) Mov eax,dword ptr[401F47] :메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다] Lea: 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다. ex:) Lea eax,dword ptr[ebp + 4] :eax레지스터의 값을 ebp+4의 주소로 만든다. Inc: 레지스터의 값을 1증가 시킨다. ex:) Inc eax :Eax 레지스터의 값을 1증가 시킨다. Dec: 레지스터의 값을 1 감소 시킨다. ex:) Dec eax :Eax 레지스터의 값을 1 감소 시킨다. Add: 레지스터나 메모리의 값을 덧셈할떄 쓰임. ex:) Add eax,ebx :Eax 레지스터의 값에 ebx 값을 더한다. ex:) Add eax,50 :Eax 레지스터에 즉석값인 50을 더한다. ex:) Add eax,dword ptr[401F47] :Eax 레지스터에 메모리 오프셋 401F47의 값을 더한다. Sub: 레지스터나 메모리의 값을 뻇셈할떄 쓰임. ex:) Sub eax,ebx :Eax 레지스터에서 ebx 레지스터의 값을 뺸다. ex:) Sub eax,50 Eax 레지스터에서 즉석값 50을 뺸다. ex:) Sub eax,dword ptr[401F47] :Eax 레지스터에서 메모리 오프셋 401F47의 값을 뺸다. Nop: 아무동작도 하지 않는다. Call: 프로시저를 호출할떄 쓰인다. ex:) Call 401F47 :메모리 오프셋 401F47을 콜한다. ex:) Call dword ptr[401F47] :401F47안에 있는 주소로 점프 한다. Ret: 콜한 지점으로 돌아간다. Cmp: 레지스터와 레지스터혹은 레지스터 값을 비교하기 위하여 쓰인다. ex:) Cmp eax,ebx :Eax 레지스터와 Ebx 레지스터의 값을 비교한다. ex:) Cmp eax,50 :Eax 레지스터와 즉석값 50을 비교한다. ex:) Cmp eax,dword ptr[401F47] :Eax 레지스터와 메모리 오프셋 401F47의 값을 비교한다. Jmp: 특정한 메모리 오프셋으로 이동할떄 쓰인다. ex:) Jmp 401F47 :메모리 오프셋 401F47 로 점프한다. ex:) Jmp dword ptr[401F47] :401F47 안에 있는 주소로 점프한다. 조건부 점프: Cmp나 Test 같은 명령어의 결과에 따라 점프한다. Je: Cmp나 Test 의 결과가 같다면 점프 Jne: Cmp나 Text 의 결과가 같지 않다면 점프 Jz: 왼쪽 인자의 값이 0 이라면 점프 Jnz: 왼쪽 인자의 값이 0 이 아니라면 점프 Jl: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프 (부호있는) Jnl: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면 (크거나 같으면) 점프 (부호있는) Jb: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프 (부호없는) Jnb: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면 (크거나 같으면) 점프 (부호없는) Jg: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프 Jng: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프 Jle: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작거나 같으면 점프 (부호있는) Jge: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 약 이정도의 명령어들이 가장 많이 나오는 것들임으로 최소한 위에 나온것들은 외워 두도록 하자. 3. 논리연산 이글에서는 5가지 논리연산에 대해서 쓸것이다. 논리연산자는 두 오퍼렌드의 값의 비트들을 대응시켜 명령에 따른 적절한 값을 구하여 첫번쨰 오퍼렌드의 값을 바꾸어 주는것이다. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: AND 연산 대응되는 비트가 둘다 1이면 결과는 1이고 그외의 결과들은 모두 0 이 된다. ex:) MOV EAX,8 AND EAX,10 :위를 계산하기 위해 우선 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000 이 되고 10은 1010 이 되고 AND 연산은 둘다 1이여야 1이 됨으로 결과는 1000 이 됩니다. OR 연산 대응되는 비트중 하나가 1 또는 둘다 1이면 결과는 1이고 그외는 모두 0이 된다. ex:) MOV EAX,8 OR EAX,10 :위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 OR 연산은 한쪽 또는 양쪽둘다 1이면 1이고 그외는 모두 0 임으로 결과는 1010이 된다. XOR 연산 대응되는 비트 중에서 한비트가 1이고 다른 비트가 0이면 1이 되고 두개의 비트가 1이면 0 이 되고 두개다 0 이어도 0이 된다. ex:) MOV EAX,8 XOR EAX,10 :위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 XOR 연산은 한쪽만 1이어야 1임으로 결과는 10이 된다. NOT 연산 NOT 연산은 오퍼렌드의 값을 반대로 하여 준다. ex:) MOV EAX,10 NOT EAX :위를 계산하기 위해 오퍼렌드의 값을 2진수로 바꾸어 주면 10은 1010이 되고 NOT 연산은 1 과 0을 반대로 하여 줌으로 결과는 0101 이 된다. *Test 연산은 오퍼렌드에 영향을 주지 않으며 플래그만 세트 시키어 준다. 2.레지스터 범용 레지스터 (1) Eax 레지스터 누산기인 Eax 레지스터는 입출력과 거의 모든 산술연산에 사용된다. 곱셋과 나눗셈, 변환 명령어등은 반드시 Eax 레지스터를 필요하게 된다.Eax 레지스터는 32bit의 레지스터이고 16bit 의 레지스터로 ax가 있다. (ax는 왼쪽의 ah와 오른쪽의 al로 이루어져 있다) (2) Ebx 레지스터 Ebx는 주소지정을 확대하기 위한 인덱스로서 사용될수 있는 유일한 범용 레지스터 이며 다른 일반적인 계산 용도로도 쓰인다. Ebx는 32bit 레지스터이고 16bit로 eb가 있다. (eb는 왼쪽의 bh와 오른쪽의 bl로 이루어져 있다) (3) Ecx 레지스터 Ecx는 루프의 반복 횟수나 좌우방향의 시프트 비트 수를 기억한다. 그외의 계산에도 사용된다. Ecx는 32bit 레지스터이고 16bit로 cx가 있다. (cx는 왼쪽의 ch와 오른쪽의 cl로 이루어져 있다.) (4) Edx 레지스터 Edx는 몇몇 입출력 동작에서 사용 된다. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 플래그 레지스터 (1) OF [Over Flow] 산술연산후 상위 비트의 오버플로를 나타냄 (2) DF [Direction] 스트링 데이터를 이동하거나 비교할떄 왼쪽 또는 오른쪽으로의 방향을 결정한다. (4) SF [Sign] 산술결과의 부호를 나타낸다.[0=양수,1=음수] (5) ZF [zero] 산술연산 또는 비교동작의 결과를 나타낸다. [0=결과가 0이 아님,1=결과가 0임] (6) CF [Carry] 산술연산후 상위 비트로부터의 캐리 그리고 시프트 또는 회전동작의 결과 마지막 비트 내용을 저장한다. (7) TF [trap] 프로세서가 단일 스텝 모드(single-step mode)를 동작할수 있도록 해준다. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 유용한 API 중단점들. 파일 열기(Open) :파일 생성 & 여는데 쓰인다. 16-bit: CreateFile 32-bit: CreateFileA wide: CreateFileW 파일 입출력(Read&Write) :파일을 입출력하는데 쓰인다. ReadFile ;읽기 WriteFile ;쓰기 파일 접근(Access) SetFilePointer ;포인터 조정 시스템 디렉토리 얻어오는 함수 16-bit: GetSystemDirectory 32-bit: GetSystemDirectoryA wide: GetSystemDirectoryW .ini파일과 관련된 함수 :ini 구성설정에 관련된 함수들이다. 16-bit: GetPrivateProfileString GetPrivateProfileInt WritePrivateProfileString WritePrivateProfileInt 32-bit: GetPrivateProfileStringA GetPrivateProfileIntA WritePrivateProfileStringA WritePrivateProfileIntA wide: GetPrivateProfileStringW GetPrivateProfileIntW WritePrivateProfileStringW WritePrivateProfileIntW 레지스트리와 관련된 함수 :레지스트리의 키를 생성 혹은 삭제시 16-bit: RegCreateKey RegDeleteKey 32-bit: RegCreateKeyA RegDeleteKeyA wide: RegCreateKeyW RegDeleteKeyW :현재 열려진 레지스트리 키를 읽을때 16-bit: RegQueryValue 32-bit: RegQueryValueA wide: RegQueryValueW :레지스트리 키를 열때 16-bit: RegCloseKey RegOpenKey 32-bit: RegCloseKeyA RegOpenKeyA wide: RegCloseKeyW RegOpenKeyW 객체에서 문자열을 읽을때: 16-bit: GetWindowText GetDlgItemText 32-bit: GetWindowTextA GetDlgItemTextA wide: GetWindowTextW GetDlgItemTextW 정수여부에 상관됨: GetDlgItemInt 객체의 텍스트를 지정: 16-bit: SetWindowText SetDlgItemText 32-bit: SetWindowTextA SetDlgItemTextA wide: SetWindowTextW SetDlgItemTextW 메시지 박스: 16-bit: MessageBox MessageBeep 32bit: MessageBoxA MessageBoxExA wide: MessageBoxW MessageBoxExW 메시지 관련: 16-bit: SendMessage WSPRINTF 32-bit: SendMessageA wide: SendMessageW 날짜와 시간 :날짜와 시간을 구할때 GetSystemTime GetLocalTime SystemTimeToFileTime 윈도우(창) 생성 & 제거 :창을 생성 & 제거에 쓰이는 함수들 16-bit: CreateWindow DialogBoxParam CreateWindowEx DestroyWindow EndDialog showwindow bitblt 32-bit: CreateWindowA CreateWindowExA DialogBoxParamA wide: CreateWindowW CreateWindowExW DialogBoxParamW CD-ROM 요구 :CD롬을 요구하는 함수 들입니다. 16-bit: GetDriveType (만약 eax=5 라면 CD롬 체크 이다.) GetLogicalDrives GetLogicalDriveStrings 32-bit: GetDriveTypeA GetLogicalDrivesA GetLogicalDriveStringsA wide: GetDriveTypeW 리턴 코드: 값 설명 0 Drive Cannot Be determined 1 Root Dir Does not exist 2 DriveRemoveable 3 A Fixed Disk (HardDrive) 4 Remote Drive(Network) 5 Cd-Rom Drive <============== 6 RamDisk GetLogicalDrivesW GetLogicalDriveStringsW Win NumberSerial: GETWINDOWWORD GETWINDOWLONG +ORC가 제안한 훌륭한 함수 BOZOSLIVEHERE HMEMCPY GLOBALGETATOMNAME ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 필요한 도구들 ①역어셈블러 기계어로 되어있는 프로그램을 읽어들여 어셈블 코드로 보여주는 것이다. W32dsm 깔끔하고 사용이 쉬운 역어셈블이다. 정식버젼은 8.9 까지 나와 있으며 비공식 패치 버전으로 여러 가지가 있다. IDA W32dsm 보다 훨씬 복잡한 인터페이스를 가지고 있으며 많은 옵션들과 기능들을 가지고 있다. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ②디버거 프로그램을 한단계씩 실행하면서 상태를 살펴볼수 있는 프로그램 이다. Soft-Ice Numega사에서 만든 디버거로 가장 뛰어난 기능을 가진 디버거 이다. 대소문자를 구별할 필요는 없다. OllyDbg 쉐어웨어 프로그램이며 1.11 까지 나와 있다. GUI 인터페이스 를 가지고 있으며 커맨드 라인 사용시 대소문자를 구별하여야 한다. :::::::::::::::::::::::::::::::::::::::::::::::::::::: ③헥스 에디터 헥스로 파일을 보여주며 수정할수 있게 해준다. Hiew 외국의 강좌에서 자주 나오는 프로그램이다. 헥스 편집 뿐만 아니라 어셈단계에서의 수정도 가능하다. Hex Workshop 내가 가장 자주 애용하는 헥스 에디터이다. 기간 제한이 있음 으로 시리얼을 키를 구하거나 직접 크렉해 보는것도 좋다. :::::::::::::::::::::::::::::::::::::::::::::::::::::: ④파일 스캐너 파일의 정보를 보여주는 프로그램으로 주로 PE해더의 내용을 보여주거나 컴파일러를 알고자 할떄 쓴다. Stude_PE 내가 가장 자주 애용하는 스캐너로 다양한 기능을 지원한다. Load PE 유명한 Yoda가 스타워즈의 요다가 아니다 ㅡㅡ; 만든 프로그램 이다. 역시 좋은 스캐너라고 사용한다. :::::::::::::::::::::::::::::::::::::::::::::::::::::: ⑤리소스 에디터 파일의 리소스를 수정할떄 쓰는 프로그램 이다. Resource Hacker 내가 가장 자주 애용하는 리소스 에디터로 간편한 인터페이스로 쉽게 이용할수 있다. eXe Scope 역시 괞찮은 리소스 에디터 이지만 나에게는 리소스 해커가 좀더 자율성이 있는듯 하다.

                 




                좋은글이 도움이 많이 되어서 퍼왔습니다
                출처 :
                http://dualpage.muz.ro/

                Posted by 샤키
                CISCO2009. 4. 29. 23:11


                네트워크를 공부 하는 사람이라면 이 책을 모르는 사람을 없을듯

                나의 경우 네트워킹이라는것을 처음 접한것은 이 책은 아니고

                본격적으로 배운것은 학원에서 이지만...

                어느정도 네트워킹에 대해 배우고  나서 이 책이 좋다고 해서 한번 봤는데..

                허접한 나에게도 책을 본 순간 책이 얼마나 쉽고 이해하기 편하게 되어 있는지 알수가 있었다..

                네트워크쪽을 일하거나 아니 이제 공부를 시작 하시는분들에게는 강력 추천을 해주고 싶은 책이다.

                책을 소장 하지 않더라도 한번은 꼭 읽어 보기를...

                뭐 굳이 찾아본다면 책을 사지 않아도 볼수 있는 방법(?)은 있지만... ㅋ

                책은 책으로 봐야 보기 편하고 제 맛...

                그냥 후배가 이 책에 대해 얘기 하길래 써 봤다잉~




                http://www.yes24.com/24/goods/1490480
                책 구입을 희망 한다면 클릭!!
                Posted by 샤키
                Reverse Engineering2009. 4. 24. 02:10


                Posted by 샤키
                Reverse Engineering2009. 4. 21. 22:30
                1.어셈블리어
                Push  : sp 레지스터를 조작하는 명령어중의 하나이다.
                       스택에 데이터를 저장하는데 쓰인다.
                ex:) Push eax : 스택에 Eax의 값을 스택에 저장한다.
                ex:) Push 20 :즉석값인 20을 스택에 저장한다.
                ex:) Push 401F47 : 메모리 오프셋 401F47의 값을 스택에 저장한다.

                Pop  : 이또한 sp 레지스터를 조작하는 명령어중 하나이다.
                스택에서 데이터를 꺼내는데 쓰인다.
                ex:) Pop eax :스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장한다.
                주의점 : Push 의 역순으로 값은 스택에서 Pop 된다.

                Mov  : 메모리나 레지스터의 값을 옮길 때[로 만들 때]쓰인다.
                ex:) Mov eax,ebx    :ebx 레지스터의 값을 eax로 옮긴다[로 만든다].
                ex:) Mov eax,20     :즉석값인 20을 eax레지스터 에 옮긴다[로 만든다].
                ex:) Mov eax,dword ptr[401F47]   :메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다]

                Lea  : 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다.
                ex:) Lea eax,ebx    : eax레지스터의 값을 ebx의 값으로 만든다.

                Inc  : 레지스터의 값을 1증가 시킨다.
                ex:) Inc eax  : Eax 레지스터의 값을 1증가 시킨다.
                Dec  : 레지스터의 값을 1 감소 시킨다.
                ex:) Dec eax : Eax 레지스터의 값을 1 감소 시킨다.

                Add  : 레지스터나 메모리의 값을 덧셈할떄 쓰임.
                ex:) Add eax,ebx   :Eax 레지스터의 값에 ebx 값을 더한다.
                ex:) Add eax,50    :Eax 레지스터에 즉석값인 50을 더한다.
                ex:) Add eax,dword ptr[401F47]  : Eax 레지스터에 메모리 오프셋 401F47의 값을 더한다.
                Sub  : 레지스터나 메모리의 값을 뻇셈할떄 쓰임.
                ex:) Sub eax,ebx   : Eax 레지스터에서 ebx 레지스터의 값을 뺸다.
                ex:) Sub eax,50
                Eax  : 레지스터에서 즉석값 50을 뺸다.
                ex:) Sub eax,dword ptr[401F47]    :Eax 레지스터에서 메모리 오프셋 401F47의 값을 뺸다.
                Nop  : 아무동작도 하지 않는다. : 90
                Call : 프로시저를 호출할떄 쓰인다.
                ex:) Call dword ptr[401F47]    : 메모리 오프셋 401F47을 콜한다.
                Ret : 콜한 지점으로 돌아간다.
                Cmp : 레지스터와 레지스터혹은 레지스터 값을 비교하기위하여 쓰인다.
                ex:) Cmp eax,ebx    :Eax 레지스터와 Ebx 레지스터의 값을 비교한다.
                ex:) Cmp eax,50     :Eax 레지스터와 즉석값 50을 비교한다.
                ex:) Cmp eax,dword ptr[401F47]
                :Eax 레지스터와 메모리 오프셋 401F47의 값을 비교한다.
                Jmp : 특정한 메모리 오프셋으로 이동할떄 쓰인다.
                ex:) Jmp dword ptr[401F47]   :메모리 오프셋 401F47 로 점프한다.
                조건부 점프: Cmp나 Test 같은 명령어의 결과에 따라점프한다.
                  Je  : Cmp나 Test 의 결과가 같다면 점프
                  Jne : Cmp나 Text 의 결과가 같지 않다면 점프
                  Jz  : 왼쪽 인자의 값이 0 이라면 점프
                Jnz  : 왼쪽 인자의 값이 0 이 아니라면 점프
                Jl   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호있는)
                Jnl  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호있는)
                Jb   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호없는)
                Jnb  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호없는)
                Jg   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프
                Jng  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프
                Jle   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작거나 같으면점프 (부호있는)
                Jge  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프
                :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                약 이정도의 명령어들이 가장 많이 나오는 것들임으로
                최소한 위에 나온것들은 외워 두도록 하자.
                3. 논리연산
                이글에서는 5가지 논리연산에 대해서 쓸것이다.
                논리연산자는 두 오퍼렌드의 값의 비트들을 대응시켜 명령에 따른 적절한 값을 구하여 첫번쨰 오퍼렌드의 값을 바꾸어 주는것이다.
                ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                AND 연산
                대응되는 비트가 둘다 1이면 결과는 1이고 그외의 결과들은 모두 0 이 된다.
                ex:) MOV EAX,8
                AND EAX,10 :위를 계산하기 위해 우선 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000 이 되고 10은 1010 이 되고 AND 연산은 둘다 1이여야 1이 됨으로 결과는 1000 이 됩니다.

                OR 연산
                대응되는 비트중 하나가 1 또는 둘다 1이면 결과는 1이고 그외는 모두 0이 된다.
                ex:) MOV EAX,8
                OR EAX,10
                :위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 OR 연산은 한쪽 또는 양쪽둘다 1이면 1이고그외는 모두 0 임으로 결과는 1010이 된다.
                XOR 연산
                대응되는 비트 중에서 한비트가 1이고 다른 비트가 0이면 1이 되고 두개의 비트가 1이면 0 이 되고 두개다 0 이어도 0이 된다.
                ex:) MOV EAX,8
                XOR EAX,10
                :위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 XOR 연산은 한쪽만 1이어야 1임으로 결과는 10이 된다.

                NOT 연산
                NOT 연산은 오퍼렌드의 값을 반대로 하여 준다.
                ex:) MOV EAX,10
                NOT EAX
                :위를 계산하기 위해 오퍼렌드의 값을 2진수로 바꾸어 주면 10은 1010이 되고 NOT 연산은 1 과 0을 반대로 하여 줌으로 결과는 0101 이 된다.
                *Test 연산은 오퍼렌드에 영향을 주지 않으며 플래그만 세트 시키어 준다.

                 

                 

                 

                 

                2.레지스터
                범용 레지스터
                (1) Eax 레지스터
                누산기인 Eax 레지스터는 입출력과 거의 모든 산술연산에 사용된다. 곱셋과 나눗셈, 변환 명령어등은 반드시 Eax 레지스터를 필요하게 된다.

                Eax 레지스터는 32bit의 레지스터이고 16bit 의 레지스터로 ax가 있다.
                (ax는 왼쪽의 ah와 오른쪽의 al로 이루어져 있다)
                 (2) Ebx 레지스터
                Ebx는 주소지정을 확대하기 위한 인덱스로서 사용될수 있는 유일한 범용 레지스터 이며, 다른 일반적인 계산 용도로도 쓰인다.
                Ebx는 32bit 레지스터이고 16bit로 eb가 있다.
                (eb는 왼쪽의 bh와 오른쪽의 bl로 이루어져 있다)
                (3) Ecx 레지스터
                Ecx는 루프의 반복 횟수나 좌우방향의 시프트 비트 수를 기억한다. 그외의 계산에도 사용된다.
                Ecx는 32bit 레지스터이고 16bit로 cx가 있다.
                (cx는 왼쪽의 ch와 오른쪽의 cl로 이루어져 있다.)
                (4) Edx 레지스터
                Edx는 몇몇 입출력 동작에서 사용 된다.
                :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                플래그 레지스터
                (1) OF [Over Flow]
                산술연산후 상위 비트의 오버플로를 나타냄
                (2) DF [Direction]
                스트링 데이터를 이동하거나 비교할떄 왼쪽 또는 오른쪽으로의 방향을 결정한다.
                (4) SF [Sign]
                산술결과의 부호를 나타낸다.[0=양수,1=음수]
                (5) ZF [zero]
                산술연산 또는 비교동작의 결과를 나타낸다.
                [0=결과가 0이 아님,1=결과가 0임]

                (6) CF [Carry]
                산술연산후 상위 비트로부터의 캐리 그리고 시프트 또는 회전동작의 결과 마지막 비트
                내용을 저장한다.

                (7) TF [trap]
                프로세서가 단일 스텝 모드(single-step mode)를 동작할수 있도록 해준다.

                 

                 

                 

                 

                 

                 

                 

                 

                 


                5. Assembly 명령어

                 

                MOV <Destination>, <Source> - Move. 값을 대입하려고 할때 사용한다. 사용 방법에는 <Destination>에는 레지스터, 메모리등이 올 수 있으며 <Source>에는 <Destination>와 같은 것 이외에 직접적인 값 등이 올 수 있다.
                Example:
                MOV EAX, 14h
                MOV EAX, DWORD PTR SS:[EBP-14]
                MOV DWORD PTR SS:[EBP-14], EDX

                 

                MOVS, MOVSB, MOVSW, MOVSD(Move String Byte or Word or DWord) - ESI가 가르키는 곳의 값들을 Byte(1byte), Word(2byte), DWord(4byte)크기만음 EDI가 가르키는 곳으로 이동시킨다.

                MOVSX(Move with Sign-Extended) - Byte나 Word크기의 Operand를 Word나 DWord사이즈로 늘려준다. 부호는 유지된다.

                 

                MOVZX(Move with Zero-Extended) - Byte나 Word크기의 Operand를 Word나 DWord사이즈로 늘려준다. 연산 후 채워지지 않은 공간에는 0으로 매꾼다.

                 

                INT <Value> - Interrupt. 해당 Value에 따른 Interrupt를 발생시킨다. <Value>에 해당하는 것들이 너무 많으므로 다음에 더욱 자세하게 다루기로 하자.
                Example:
                INT 21h

                 

                ADD <Destination>, <Source> - Addition. 간단하다. <Destination>+<Source>한 값을 <Destination>에 저장한다. <Destination>에는 레지스터, 메모리등이 올 수 있으며 <Source>에는 <Destination>와 같은 것 이외에 직접적인 값 등이 올 수 있다.
                Example:
                MOV EAX, 5h
                MOV EBX, 12h
                ADD EAX, 5h  ; EAX에는 5h + 5h = Ah(10진수로 10)가 저장된다.
                ADD EAX, EBX ; EAX에는 Ah + 12h = 1Ch(10진수로 28)가 저장된다.

                 

                SUB <Destination>, <Source> - Subtact. ADD명령어와 사용법은 동일하다. 단지 기능은 빼주는 역할이라는거!
                Example:
                MOV EAX, 4h
                SUB EAX, 3h ; EAX에는 4h - 3h = 1h가 저장된다.

                 

                INC <Target> - Increments. 타겟의 값에서 1을 증가시킨다. <Target>에는 레지스터, 메모리등이 올 수 있으며, 직접적인 값은 불가능하다.
                Example:
                MOV EAX, 4h
                INC EAX     ; EAX에는 4h에서 1증가된 값인 5h가 저장된다.

                 

                DEC <Target> - Decrements. 타겟의 값에서 1을 감소시킨다. <Target>에는 레지스터, 메모리등이 올 수 있으며, 직접적인 값은 불가능하다.
                Example:
                MOV EAX, 4h
                DEC EAX     ; EAX에는 4h에서 1감수한 값인 3h가 저장된다.

                 

                JMP <Location> - Jump. 어떠한 장소로 점프한다. 쉽게 생각해서 GOTO문을 생각하면 될것이다. <Location>에는 점프할 곳의 코드주소를 담고있는 레지스터나 메모리등이 올 수 있다.
                Example:
                JMP 0041D983
                JMP DWORD PTR SS:[EBP-14]

                 

                ** Conditional JUMP **

                 

                JMP명령어와 같다. 단지 조건에 따라서 Jump할지 안할지가 결정되므로 Conditional Jump라고 하겠다. Conditional JUMP는 CMP명령어와 같이 사용된다.

                 

                CMP <Target1>, <Target2> - 두 타겟을 비교해서 Flag Register를 변경시킨다. <Target1>이 <Target2>보다 작으면 CF가 Set되고, 같으면 ZF가 Set되고 이런것 들이 있긴하지만, 다음에 왠만하면 Conditional Jump가 있기때문에 Jump문 의미로 이해하도록 하고 CMP로 인한 Flag 변화는 그냥 넘어가도록 하겠다.
                Example:
                CMP EAX, EBX

                 Unsigned
                JA(JUMP if ABOVE)                                    

                CF=0 and ZF=0
                JAE(JUMP if ABOVE or EQUAL)                    CF=0
                JB(JUMP if BELOW)                                     CF=1
                JBE(JUMP if BELOW or EQUAL)                    CF=1 and ZF=1
                JNA(JUMP if NOT ABOVE)                            CF=1 or ZF=1
                JNAE(JUMP if NOT ABOVE or EQUAL)           CF=1
                JNB(JUMP if NOT BELOW)                            CF=0
                JNBE(JUMP if NOW BELOW or EQUAL)          CF=0 and ZF=0
                JE(JUMP if EQUAL)                                      ZF=1
                JNE(JUMP if NOT EQUAL)                             ZF=0

                Signed
                JG(JUMP if GREATER)                                 ZF=0 and SF=OF
                JGE(JUMP if GREATER or EQUAL)                SF=OF
                JL(JUMP if LOWER)                                     SF!=OF
                JLE(JUMP if LOWER or EQUAL)                    ZF=1 and SF!=OF
                JNG(JUMP if NOT GREATER)                        ZF=1 or SF!=OF
                JNGE(JUMP if NOT GREATER or EQUAL)       SF!=OF
                JNL(JUMP if NOT LOWER)                            SF=OF
                JNLE(JUMP if NOT LOWER or EQUAL)           ZF=0 and SF=OF
                JE(JUMP if EQUAL)                                     ZF=1
                JNE(JUMP if NOT EQUAL)                            ZF=0

                Flag
                JC(JUMP if CARRY flag set)                        CF=1
                JNC(JUMP if NOT CARRY flag set)               CF=0
                JO(JUMP if OVERFLOW flag set)                  OF=1
                JNO(JUMP if NOT OVERFLOW flag set)         OF=0
                JP(JUMP if PARITY flag set)                        PF=1
                JNP(JUMP if NOT PARITY flag set)               PF=0
                JPE(JUMP if PARITY is EVEN)                     PF=1
                JPO(JUMP if PARITY is ODD)                      PF=0
                JS(JUMP if SIGNAL flag set)                       SF=1
                JNS(JUMP if NOT SIGNAL flag set)              SF=0
                JCXZ(JUMP if CX is ZERO)                       CX=0

                AND <Destination>, <Source> - Logical AND. 논리회로에 있어서의 AND연산을 수행한다. 그리고 AND연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다.
                Example:
                AND EAX, EBX

                CALL <Location> - Call. 말그대로 함수를 부를때 사용한다. Jump와 같다고 느껴질지도 모르지만 Call문을 시행할 경우 스택에 Call문이 시행된것을 Push를 하며 Return이 가능하다.
                Example:
                CALL 0041D983
                CALL DWORD PTR [EBX]

                DIV <Target> - Division. EAX를 <Target>으로 나누는 연산이다. 결과로 몫은EAX에 나머지는 ECX에 들어간다.
                Example:
                MOV EAX, 64h
                MOV ECX, 9h
                DIV ECX       ; 64h(100) / 9h(9) = 몫 : 0Bh(11) , 나머지 1h이므로
                                EAX = 0Bh, ECX = 1h가 저장된다.

                 

                IDIV <Target> - Integer Division. DIV와 똑같다. 하지만 다른점은 부호있는 정수를 다룬다는 점이다.

                 

                MUL <Target> - Multiplication. EAX와 <Target>을 곱하여 EAX에 저장한다.
                Example:
                MOV EAX, 2h
                MUL 4h       ; EAX에는 2h * 4h = 8h가 저장된다.

                 

                IMUL <Value> - Integer Multiplication. EAX와 <Value>를 곱하여 EAX에 저장한다.
                IMUL <Destination>, <Value> - <Destination>과 <Value>를 곱하여 <Destination>에 저장한다.
                IMUL <Destination>, <Value>, <Value> - 2개의 <Value>를 곱한 후에 <Destination>에 저장한다.

                 

                LEA <Destination>, <Source> - Load Effective Address. <Source>의 실제 주소를 <Destination>에 저장한다. 하지만 이 용도보다는 빠른 계산을 위해 주로 사용된다. 예를들어 LEA EAX, DWORD PTR [2*EAX+ECX]를 하면, EAX에 2*EAX+ECX계산값이 들어가게 된다.

                 

                NOP - No Operation. 아무것도 하지 않는다.

                 

                OR <Destination>, <Source> - Logical OR. 논리회로에 있어서의 OR연산을 수행한다. 그리고 OR연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다.
                Example:
                OR EAX, EBX

                 

                POP <Destination> - POP. 스택에서 ESP가 가르키는 곳에서 주소값을 불러내어 <Destination>에 저장한다. 그리고 ESP는 다음값을 가르키게 된다.
                Example:
                POP EAX

                 

                PUSH <Source> - 스택에 <Source>를 집어넣는다. ESP는 최근에 PUSH한 값을 가르키게 된다.
                Example:
                PUSH EAX

                 

                RET - Return. 스택에서 주소를 POP해온 후 그 주소로 돌아간다. PUSH와 RET을 조합해서 JMP처럼 사용 할 수 있다.

                 

                TEST <Target1>, <Target2> - 이 연산은 대부분이 <Target1>과 <Target2>가 같게 설정된다. 예를들면 TEST EAX, EAX. 이 연산은 논리회로의 AND연산을 수행하지만 결과값을 저장하지 않는다. 단지 EAX=0일경우 ZF=1이 되고 EAX!=0일경우 ZF=0이 된다. 그리고 OF, CF는 0이된다.
                Example:
                TEST EAX, EAX

                 

                XOR <Destination>, <Source> - Logical Exclusive OR. 논리회로에 있어서 XOR연산을 수행한다. XOR연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다. 이 연산은 XOR EAX, EAX처럼 많이 사용되는데, 이렇게 할 경우 XOR=0이 된다. 이유는 직접 해보면 알것이다.
                Example:
                XOR EAX, EBX
                XOR EAX, EAX     ; EAX=0이 됨.

                 

                LODS, LODSB, LODSW, LODSD(Load String Byte, Word, DWord) - ESI가 가르키는 곳에서 지정한 크기(Byte, Word, DWord) 만큼 읽어와 EAX에 복사한다. ESI는 복사한만큼 이동한다.

                 

                STOS, STOSB, STOSW, STOSD(Store String Byte, Word, DWord) - EAX에 들어이있는 데이터를 지정한 크기만큼 EDI가 가르키는 주소에 복사한다. EDI는 복사된 만큼 이동한다.

                 

                CLD(Clear Direction flag), STD(Set Direction flag) - Direction Flag를 Set하거나 Clear할때 사용한다.

                 

                CMC(Complement Carry flag), CLC(Clear Carry flag), STC(Set Carry flag) - Carry flag를 순서대로 반전, Clear, Set시킨다.

                 

                SHL <Destination>, <Value> - Shift Logical Left. <Destination>에 <Value>만큼 Shift연산을 왼쪽으로 수행한다. 만약 <Destination>보다 커질경우 CF=1이 된다.

                 

                SHR <Destination>, <Value> - Shift Logical Right. SHL과 기능은 동일하며 Shift연산이 오른쪽으로 진행된다.

                 

                ROL <Destination>, <Value> - Rotate Left. SHL과 기능은 동일하다. 단지 자리수가 늘어날경우 해당 비트가 오른쪽 끝으로 이동한다.

                 

                ROR <Destination>, <Value> - Rotate Reft. SHR과 기능은 동일하다. 단지 자리수가 없어질경우 해당 비트가 왼쪽 끝으로 이동한다.

                 


                1. 나눗셈 연산의 피젯수는(32bit의 나눗셈을 가정) 항상 edx:eax 이다.
                2. cdq 는 나눗셈을 위해 피젯수의 사이즈를 확장하는 것이다.


                나눗셈연산(div, idiv)은 eax와 edx에 의해서만 이루어집니다
                - 피젯수(나눔을 당하는 수) 는 eax, edx에만 들어갈 수 있다는 얘기에요
                16 / 5 연산을 한다고 가정해 봅시다.

                16과 5 둘다 32bit data라고 가정하구요

                그럼 일단 eax에 16을 넣습니다. 그 다음 ebx(다른레지스터나 메모리도 상관없음)에

                5를 넣습니다. 그 다음 div 연산을 하면.........될것 같지만 안됩니다..

                일반적으로 제수(여기서는 5)가 32bit이면 피젯수(여기서는 16) 는 64bit가 되어야

                32bit 값을 가지는 몫을 얻을 수 있습니다.

                그래서 피젯수의 bit를 확장 시켜주는것이 바로 cdq 연산입니다

                32bit 크기의 eax의 값을 64bit의 값인 edx:eax로 만들어줍니다.

                여기서 edx는 상위자리가되고 eax는 하위 자리가 되죠

                자..그럼 cdq 연산까지 끝났으면 edx:eax에 16이 들어가있고 ebx에 5가 들어있겠네요

                그럼 idiv연산을 해봅시다(div는 부호가없는 나눗셈 idiv 부호가 있는 나눗셈)

                그럼 몫과 나머지가 나와야 하겠죠? 그 결과는 다시 eax와 edx로 들어가는데

                eax에는 몫이, edx에는 나머지 부분이 들어갑니다~

                 


                LoadLibrary GetProcAddress (로드 라이브러리 겟프락어드레스) 후에 변하지 않는 레지스터는
                EBX EBP ESI EDI 이다. EAX, ECX, EDX 가 변한다


                출처 : http://zerohz.tistory.com/


                여기 글도 추천
                http://www.pyrasis.com/blog/27 
                http://asmlove.co.kr/wiki/wiki.php

                Posted by 샤키
                취미2009. 4. 13. 00:56


                지난주에 방영된 무한도전중 한장면...

                정말 무한도전의 센스는 ㅋ

                아니 김태호PD의 센스작렬!!!  

                이거 보고 한참 웃었다는 ㅎㅎ
                Posted by 샤키
                Computer2009. 4. 13. 00:35

                그동안 사용한 MyStick II 512MB

                오늘 친구에게 받은 Swing Mini Silver 2GB

                2.5 하드 시게이트 5400.3 80GB

                위에 하드케이스용인 3Bon S25SM

                3.5 하드 시게이트 7200.7 40GB

                NEXT-218 SATA, IDE 지원 변환젠더(?)

                PSP에서 사용중인 메몰카드 4GB


                이런 외장 저장매체를 쓰는데

                심심해서 각각장치 속도를 체크해 보았다.



                가장 먼저 설명한 512 USB 속도 참.. 여태 저런것을 쭉 쓰고 있었다니...

                어제 친구에게 얻어온 USB 대만족!!  디자인까지 굿!!

                역시 PSP는 어느정도 속도가 필요 하지 ㅋ

                2.5하드 + 외장하드케이스 속도 만족
                근데 학원 컴퓨터에서 전원부족 현상이 이거 산 이유가 뭔데 ㅜㅜ

                젠더 + 40GB 속도는 무난 하지만
                 2.5보다는 속도가 딸린다 SATA와 IDE 차이인가..

                속도 정리는 이정도 뭐 보통 USB는 사는것보다는 얻어야 한다는게 나의 생각 이기에..

                512MB를 얻어 여태 잘 쓰다가 역시나 용량의 한계를 느끼고..  더구나 친구가 USB 남는다고 해서 바로 GET!!!

                512랑 차이는 당연하거고 디자인 속도 모두 만족!!

                반면 외장하드는 학원에서 쓰려고 중고로 구입 했는데... 모든 컴퓨터에서 잘만 작동 하는데...

                유독 학원컴퓨터에서만 전원 부족 현상이 USB선을 2개 다 꼽아도... ㅜㅜ 

                더구나 학원에 있는 모든 컴퓨터에서 공통 현상이니.. 역시 학원컴퓨터의 문제...

                3.5인치라도 들고 가서 자료 복사해야겠다 ;;;
                Posted by 샤키