티스토리 툴바



'전체'에 해당되는 글 6건

  1. 2009/02/10 리버스 엔지니어링 관련 사이트
  2. 2009/01/31 Reverse Engineering의 기본지식들
  3. 2008/12/17 Crack 관련 초보적인 Tips
  4. 2008/09/27 STiCUBE
  5. 2008/08/30 R.C.E Tool

◆ Reverse Engineering ◆
 

1 Sites

1.1 국외

  1. PROGRAMMER`S TOOLS: 디버거, 패커, 컴파일러와 각종 유틸리티, 패치파일등 리버스 엔지니어링에 필요한 각종 툴을 구할 수 있는 곳
  2. Crack Store: 위 사이트에서 못찾는 툴은 여기서.
  3. http://www.anticrack.de : reverse engineering site link
  4. http://www.woodmann.com/crackz : CrackZ의 사이트(동글관련) 미러페이지..
  5. http://www.woodmann.com/fravia/index.htm : +HCU 사이트
  6. http://fravia.anticrack.de : Cool~
  7. http://packetstormsecurity.nl/Crack/indexdate.shtml : packetstorm의 크랙 페이지
  8. http://www.btinternet.com/~acid_cracking_crew
  9. http://biw.rult.at : 많은 튜토리얼들과 crackme, patcher, coding에 관련된 문서등등 상당히 풍부한 자료를 담고 있는 사이트.
  10. http://www.reversemes.de : 리버싱 타킷 프로그램을 제공하면서 마치 게임하듯이 리버싱을 연습할 수 있는 곳. 초보자들이 연습하기 좋은 곳이다.
  11. http://crackmes.de : cracking에 관한 각종 툴과 문서, 튜토리얼을 얻을 수 있다.
  12. http://cracking.accessroot.com : olly로 리버싱하는 튜토리얼들을 볼 수 있다. 업데이트되는 최신 튜토리얼은 메일링 리스트에 가입해야 한다.
  13. http://biw.rult.at/index.php?page=tuts : 풍부한 튜토리얼들
  14. http://www.crackstore.com
  15. IceExt Official homepage
  16. CoDe_InSiDe homepage : 다양한 연습문제(CrackMe) 및 튜토리얼, 자작 프로그램등.
  17. http://mup.anticrack.de
  18. http://crackz.reteam.org
  19. http://www.smidgeonsoft.com : Russ Osterlund의 홈페이지. 윈도우즈 시스템 내부를 탐색할수 있는도구와 각종 문서
  20. http://www.yates2k.net
  21. http://ebliss.host.sk/cte.html : Eternal Bliss' Essays. crackme, tutorial과 Visual basic cracking에 관한 tutorial
  22. The CodeBreakers Magazine : 얼마전까지 http://codebreakers.anticrack.de 에서 출판되었던 issue는 테스트였단다. 올 여름에 본격적으로 출판된다고 하니 기대를 가지고 기다려 보자.
  23. The Webbithole : 초보자를 위한 괜찮은 튜토리얼들과 컬럼들을 읽어볼 수 있다.
  24. GameHackingUniversity : 주로 게임의 패치와 크래킹에 관련된 정보들이 있다.
  25. http://zor.org/krobar : SoftIce뿐 아니라 reverse engineering에 관한 tut들을 읽어 볼 수 있다.
  26. http://www.lockless.com
  27. http://rozinov.sfs.poly.edu : Reverse Engineering: An In-Depth Analysis of the Bagle Virus 문서의 저자 홈페이지. Link 사이트에는 virus, reversing에 관한 가볼만한 사이트들이 소개되어 있다.
  28. http://www.ka0s.net : PocketPC를 비롯, WinCE, SymbianOS등 PDA와 포켓PC를 리버싱하는데 중점을 둔 사이트. SH3, ARM, MIPS등의 프로세서 기반에서 리버싱 작업하기 위한 자료들을 볼 수 있다.

1.2 국내

  1. http://www.learn2crack.com : 국내 크랙 사이트. 꽤 많은 문서들이 수집되어 있다.
  2. http://codediver.zetyx.net : 역시 리버스엔지니어링에 관한 국내 사이트. 정리가 잘 되어있다.
  3. http://www.x3chun.ce.ro : keygen과 암호쪽에 조예가 깊으신 x2chun님의 사이트
  4. http://vivaman.bcpark.net : 비바맨 님의 홈페이지 이다. 정리가 잘 되어있다.
  5. http://dualpage.muz.ro : dual5651님의 홈페이지 이다. 초보자를 위한 글들이 있다.

2 Forums

2.1 국외

  1. http://www.woodmann.com : 가장 큰 리버스포럼으로 보여짐. 많은 리버서들을 만날 수 있다.
  2. http://community.anticrack.de : 소프트웨어 프로텍션 및 리버스 엔지니어링 커뮤니티 포럼
  3. Aeron`s Forum
  4. Reverse Engineering Team Forum
  5. Ollydbg Users Forum
  6. Lockless World Headquarters Forum
  7. New2Cracking Forum
  8. http://www.security-forums.com

2.2 국내

  1. oPEN rEVERSE fORUM: 공개 리버스 포럼
  2. http://codediver.kaist.ac.kr/vbulletin : code2dive님이 운영중인 포럼. protector에 주요 포커스가 맞추어져 있지만 리버싱에 관련된 각종 자료와 플러그인, 모의 크랙등 리버싱에 관련된 정보들이 활발히 다루어져 있다.

이번글에서는 RE를 하는데에 있어서의 기초 지식인
어셈블리어,논리연산,레지스터에 대해 간단하게 다룹니다.

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

역시 괞찮은 리소스 에디터 이지만 나에게는 리소스 해커가 좀더 자율성이 있는듯 하다.

재밌는 코드 어셈에는 NOP(0x90)만 있는게 아니다.
Push eax
Pop   eax
Push ebx
Pop   ebx
Inc    ecx
Dec   ecx

by Dual

보통 Crack을 하다보면 기본적인 어셈블리 언어도 알아야 하고,

ollydbg 등의 툴을 이용할 수 있어야 하는데 아래와 같이 관련 작업을 하면서

유용한 Tip을 요약해 보았다.


1) password 입력관련 대표적인 API 의 (예)


 - 접근 순서

  윈도우에서 마우스 오른쪽 클릭 > search for > Name(label) in current module
  혹은 ctrl+N  -->이상태에서 키보드에 "GetWi" 등으로 입력하면 관련 API위치로
  이동하고, 해당 function 에서 바로 break point 설정이 가능한데,
 [set break on every reference] 로 설정함


 - 관련 API
  .  GetWindowText
  .  GetDlgItemText
  .  GetDlgItemInt



2) 사용기한 체크 관련 대표적인 API의 (예)


 - 접근 순서는 위와 동일함


 - GetLocalTime() 그 이후 로직은 해당 시간을 참조하여 비교하는   

    CALL루틴을 따라가 보면 되겠지...



3) 크랙에 필요한 어셈블리 명령어 이해


 - ADD 와 SUB
  , 'ADD EAX, 128' 'SUB EAX, -128' 은 같음
     (기계어를 사용함에 있어서 ADD를 사용하는 것 보다
     SUB를 사용하는 편이 명령어의 크기를 줄일수 있어,
     동일한 결과를 표현하는데 있어 메모리 사이즈를 줄이는 방법을 이용함)


 - 레지스터값 0으로 초기화
  . 'mov eax, 0x00000000h' 값으로 초기화가 가능하지만,
    수치를 직접 사용하는 경우에 시간이 많이 걸리므로
    아래와 같이 'xor eax, eax' 등의 방법이 쓰인다.
    (또한 'sub eax, eax' 등을 이용할 수도 있음)


 - 레지스터값 -1으로 초기화
  . -1 이라는 수치의 경우에는 아래와 같이 4가지 방법이 있음
    ① mov eax, 0xffffffffh  (5 bytes)
    ② xor  eax, eax  (2 bytes)
        dec eax  (1 byte)
    ③ sub eax, eax  (2 bytes)
        dec eax (1 byte)
    ④ stc
      sbb eax, eax
(2 bytes)
        ※ 위의 4번째 경우 에는 특수한 경우로서 컴파일러가 생성하지 않는 경우로서
            플래그 제어 명령군의 하나인 STC 명령에서 CF를 1로 세팅하고,
            SBB 명령에서 아래와 같이 계산된다.
            [SBB  EAX, EAX] = EAX - (EAX+CF) = EAX - (EAX+1) = EAX - EAX - 1 = -1


 - 0과 1을 사용하여 조건점프
  . 크래킹에 있어서 조건점프는 가장 중요 포인트이고, EAX가 0인지 1인지

    비교하는 것이 많이 나옴
    ① cmp eax, 0x00000000h (5bytes)
        je  _lebel_   (2/6 bytes (short/near))
    ② or eax, eax (2 bytes)
        je  _lebel_   (2/6 bytes (short/near))      
    ③ test eax, eax (2bytes)
        je  _lebel_   (2/6 bytes (short/near))    

 

 - -1(0xffffffffh)을 사용하여 조건점프 (인증실패)
    ① cmp eax, 0xffffffffh  ;5 bytes  
        je  _label_   ; 2/6 bytes
    ② inc eax  ; 1 byte
        je _label_  ; 2/6 bytes


 - MOVZX 명령의 이해
    아래는 동일한 결과를 수행하는 문장임
    ① xor eax, eax  ;2 bytes  
        mov   ax, word [eso+xx]  ; 4bytes
    ② movzx eax, word[esi+xx]  ; 4bytes
    MOVXZ 명령은 AX에 어드레스 [ESI+xx] 에 있는 워드 값을 복사하여

    EAX 상위 16비트를 0으로 채우고 있음.

    아래코드는 워드값이 아닌 바이트 값으로 치환한 예제임
    ① xor eax, eax  ;2 bytes  
        mov   al, bytes[esi+xx]  ; 3bytes
    ② movzx eax, word[esi+xx]  ; 4bytes

    레지스터간 데이터 복사할 때도 사용할 수 있음
    ① xor eax, eax  ;2 bytes  
        mov   ax, bx  ; 3bytes
    ② movzx eax, bx  ; 3bytes


 - 레지스터에 수치입력
    가장 일반적인 방식은 아래와 같이
    ① mov eax, 50h  ;5 bytes    
        PUSH 와 POP을 이용하여 동일하게
    ② PUSH  50h ; 2 bytes
        pop eax ; 1byte


 - IMUL 명령의 이해
    ① mov ecx, 28h  ;5 bytes    
        mul ecx  ; 2bytes
    ② PUSH 28h  ; 2bytes
        pop ecx  ; 1byte
        mul    ecx ; 2bytes
    ③ imul   eax, eax, 28h   ; 3bytes
       ; eax(2번째)를 28h 와 곱하여 eax(1번째)에 저장



※ 몇가지 Tips


  - 경험상 CALL 명령 직후에 비교/분기 명령이 있을 경우에는
    CALL 명령으로 호출되어 있는 함수는 체크루틴일 가능성이 높고
,

    CALL 명령 직후에 비교/분기 명령이 없을 경우에는
    체크 루틴과는 직접 관계 없는 함수일 가능성이 높으므로 (물론 예외도 있음)
    시간절약을 위해 코드 추적을 하지 않는다.

[출처] Crack 관련 초보적인 Tips|작성자 교옹

TSearch로 Harvest 게임 머니를 수정하기
http://progh2.cug.kr/tt/index.php?pl=1037

TSearch 문자열 디버그 방법
화면상에 떠있는 찾으려는 것이 숫자가 아닌 문자열인 경우
(1,2,4,8 바이트 숫자형에 정확히 일치하는 값이 하나도 안걸리면 결국 추측하건데 문자열이 분명하다)는
먼저 문자열의 선두를 HEX값으로 변환한다.

예) 화면에 1234 라고 표시된것이 int 형 변수를 직접 출력한거라면
2,4,8바이트 exact value로 바로 걸려야 한다. (1바이트는 255까지 이므로 제외)

안걸리면,
화면에 표시된 숫자가 1234 가 수치형이 아니고 문자열을 출력한것으로 보면된다.

즉, 4바이트 문자열을 검색해야 하는데 이때는 찾으려는 값에 1234를 입력하면 안된다.

모두 HEX값으로 변환한다. 31 32 33 34 일 것이다.
이를 4바이트 수치형으로 바꿔야 하는데, 계산기를 통해 값을 HEX로 입력한다.
이때 수치형은 오른쪽부터 읽히므로 34 33 32 31 로 해주어야 한다.
이렇게 한 Decimal 값을 Exact Value에 입력하고 4바이트로 찾으면 바로 찾을수 있다.
문자 2개를 찾으려면 2바이트형으로 ..

STiCUBE

2008/09/27 16:24

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

R.C.E Tool

2008/08/30 17:06

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

1 2 

글 보관함

카운터

Total : 2,810 / Today : 1 / Yesterday : 1
get rsstistory!