Computer/Programming2009. 9. 11. 18:20

Milliseconds vs. FPS

I've come to the realization that many new graphics/game programmers don't know how to accurately measure the speed of their rendering. Most of them fall into the common pitfall of utilizing frames per second (FPS) as their method of profiling. This is the wrong thing to do.

많은 그래픽/게임 프로그래머들이 그들의 프로그램에서 랜더링 속도를 정확히 측정 모르더군요. 대부분이 frames per second(FPS) 속도 측정의 방법으로 사용하고 있는데 이는 정확한 방법이 아닙니다.


Let's see a little bit of the mathematics. First, the definition of millisecond, better visualized as .
We can now build a relationship between the frames per second and the number of milliseconds it takes to render one frame. The inverse of the frames per second gives us the number of seconds it takes to render one frame e.g. 1/2 FPS = 0.5 s, 1/10 FPS = 0.01 s, etc. Since there are 1,000 milliseconds in a second, we then multiply the value, given above, by 1,000 to retrieve the number of milliseconds it takes to render one frame.

잠깐 수학책을 들여다 봅시다. 우선 millisecond 정의 입니다.  이렇게 보면 명확해 보이죠. Frames per second 프레임을 랜더링 하기 위해 걸리는 milliseconds 대한 관계를 정리해 보겠습니다. Frames per second 역수는 프레임을 랜더링 하는데 초가 걸리는지를 말해줍니다. 예를 들어 1/(2 FPS) = 0.5s, 1/(10 FPS) = 0.01s 입니다. 1초는 1,000milliseconds이므로 위의 수에 1,000 곱하면 프레임에 milliseconds 걸리는지 계산이 됩니다.


Here's a graph that shows the number of milliseconds it takes to render one frame as a function of the frames per second:

아래는 FPS 프레임을 랜더링 하는데 milliseconds 걸리는지를 보여주는 그래프입니다.


As you can see, the two values are not linearly related. While the frames per second increase, the number of milliseconds decreases at a slower rate. (In mathematical terms, the limit of the function approaches 0.) What does this mean to the general programmer? The difference between 900 FPS and 870 FPS is negligible while the difference between 60 FPS and 30 FPS is quite noticeable.

보시는 것처럼 값은 1차원적으로 비례하지 않습니다. Frames per second 증가하지만 milliseconds 천천히 감소합니다(수학적 용어로 함수가 0으로 수렴한다고 합니다). 그래프가 의미 하는 뭘까요? 60FPS 30FPS 차이를 보이는 변화이지만 900FPS 870FPS 의미가 없다는 것입니다.


To conclude, I will give you a little real world example. Your program has a pixel shader that operates on 100 pixels giving you 1,000 FPS. You move closer to the object, now the pixel shader is operating on 150 pixels (50% more) and your framerate drops to 666 FPS. Some graphics programmers would think, "Oh no! I'm doing something wrong." With our new knowledge, this change is to be expected: We've gone from 1 millisecond to 1.5 milliseconds to render one frame. Given that we are shading 50% more pixels, this change in rendering speed is not bad at all.

결론으로 실제적인 예를 하나 들어 보이겠습니다. 100픽셀에 적용되고 있는 픽셀 셰이더가 포함된 프로그램을 만들었다고 생각해 봅시다. 물체에 다가갈수록 FPS 1,000에서 666으로 떨어지고 픽셀 셰이더는 150픽셀에(50% 많아졌습니다) 적용됩니다. 일부 그래픽 프로그래머는 .. 뭔가 잘못된 아냐?” 라고 생각할 있겠지만 우리는 이제 이런 변화가 당연하다고 받아들일 있습니다: 프레임을 랜더링 하는데 1millisecond에서 1.5milliseconds 느려졌지만 50% 많은 픽셀에 적용된 픽셀 셰이더를 생각해 보면 그다지 크게 느려지진 않은 겁니다..


Now get out there, use those milliseconds, and never stop the crusade to convert everyone from using FPS!

이제부터 milliseconds 사용하도록 하고 FPS 사용하는 사람들을 milliseconds 사용하도록 일깨워 줍시다!

Posted by J.sean
Computer/Crack2009. 5. 25. 20:32


Step 9까지 모두 푸셨다면 이제 웬만한 게임은 대부분 혼자서도 원하는 값을 찾아 고치실 수 있을 겁니다. 이번 강좌에선 간단한 tip 몇 가지를 소개해 드리겠습니다.

오늘 함께할 게임은 또 다른 고전 명작 게임 Prehistorik 1입니다.






이 게임의 간단한 줄거리는 먹을게 부족한 원시인이 가족을 위해 식량을 구하러 다닌다는 이야기 입니다. TITUS사의 1991년 작품입니다. XP에서도 게임이 실행은 되지만 원활한 진행을 위해 DOSBox를 사용 했습니다.
게임이 시작되면 아래 그림과 같이 원시인 한 명이 공중에서 뛰어 내리고 몽둥이로 공룡, 곰, 알, 뱀등을 때려 기절시킨 후 'FOOD' 게이지를 채워가야 합니다. 처음 'FOOD'게이지는 0, 'LIVES'는 03, 'TIME'은 99, ENERGY는 가득 차 있는 상태로 시작 됩니다.


그럼 우리는 TIME부터 정지시켜 놓도록 하겠습니다. TIME은 99부터 천천히 1씩 감소하는데 감소하는 속도가 그리 빠르지 않으므로 타이밍을 잘 맞춰 검색 하면 됩니다. Cheat Engine으로 이 게임을 오픈시키고 TIME수치를 찾아 보도록 하죠.


96초에서 한번, 94초에서 다시 검색을 했는데 아무런 결과도 갖지 못했습니다. Cheat Engine이 찾지 못했다는 말이지요. 왜 그럴까 다시 생각해 보니 이 게임은 1991년도 작품이라는게 생각 났습니다. 그 당시는 32비트가 아닌 16비트가 주류를 이루던 시대였지요. 요즘 게임과는 달리 이 게임은 2 Bytes를 사용할거 같습니다.

만약 어떤 수치는 정확히 알지만 데이터 타입은 모를때 그 수치를 담을 수 있는 가장 작은 데이터 타입을 선택해 주는것이 더 정확한 검색을 할 수 있도록 도와줍니다.

그럼 'Value type'을 2 Bytes로 바꾸고 다시 검색을 시도해 보겠습니다.


이번엔 제대로 찾았습니다. 그리고 'Value'를 90으로 freeze시켜 놓았습니다. 이 값이 100이상으로 수정되면 게임이 다운되어 버리더군요. 가끔 이런 경우가 발생하기도 하므로 오류가 나지 않는 범위에서 적절한 값으로 수정해 주도록 합니다. 그럼 다른 값을 찾기 전에 헷갈리지 않도록 이름을 붙여 주도록 하지요. 'No description'을 더블 클릭해 줍니다.


description을 바꿀 수 있는 윈도우가 나오는군요. TIME이라고 바꿔 주겠습니다.

그전에 여기서 잠깐 리스트 윈도우의 단축키를 알아 보고 가죠.

Enter : Change value
Ctrl + Enter : Change description
Alt + Enter : Change address
Space : Freeze
+ : Positive freeze
- : Negative freeze
Delete : Delete address
Ctrl + S : Switch the position of 2 selected addresses
Ctrl + E : Edit the selected address
Ctrl + Alt + A : Open the auto assembler



제대로 바뀌었으면 이번엔 LIVES를 찾아 바꿔 보도록 하겠습니다. 처음엔 03이므로 03으로 검색을 시작해 값을 찾은 후 리스트 박스에서 description을 LIVES라고 바꾸고 수치를 10으로 바꿔놓겠습니다.


우리의 원시인이 영원한 생명을 갖도록 freeze시켜 주겠습니다. 그러데 이번엔 그냥 freeze시키는게 아니라 값이 증가 하는것은 허용하는 freeze를 해보죠. 우선 'Frozen'체크 박스를 클릭해 freeze시키고 왼쪽에 있는 '='를 한번 클릭해 줍니다. '-'로 표시가 바뀌는데 이것은 감소만 허용하는 freeze입니다. 우리는 증가만을 허가할 것이므로 한번더 클릭해 '+'로 표시를 바꿉니다.


자, 그럼 이제 우리의 원시인은 생명이 늘어나긴 해도 줄어들진 않는 신과 같은 존재가 되었습니다. 이번엔 'ENERGY'를 줄어들지 않도록 해보죠. 우선 에너지가 가득차 있는 상태의 수치정보는 나와 있지 않으므로 'Unknown initial value'로 시작해서 ENERGY를 조금씩 잃어가며 'Decreased value'로 재 검색을 해보겠습니다.


굉장히 많은 검색 결과가 나왔지만 결국 2개만 남았습니다. 값이 768인 주소와 3인 주소입니다. 그럼 잠시 게임 화면으로 돌아가 보죠.


'ENERGY'게이지를 보니 막대가 3개 남았군요. 그럼 어느 주소가 우리가 찾는 주소일까요? 당연히 3이라는 값을 가진 057085CA번지겠죠? 리스트 박스로 옮겨 Description을 ENERGY로 바꿔주고 'Value'를 20으로 바꾼 후 freeze시키겠습니다.


이제 'FOOD'게이지 하나 남았군요. FOOD는 아무것도 먹지 않은 상태에선 0인 상태일것이라 추측할 수 있습니다. 0으로 초기 검색을 시작하고 공룡이나 과일 따위를 하나 먹을때 마다 'Increased value'로 재검색을 해주겠습니다.


3개의 결과가 남았습니다. 2560, 10, 720 셋중에 어느것일까요? 대충 생각해 봐도 10일것 같군요. 공룡을 한마리 더 잡아 먹은후 다시 수치를 확인해 보겠습니다.


2816, 11, 770으로 바뀌었습니다. 아무래도 11일거 같죠? 리스트 박스로 옮겨놓고 Description을 FOOD라 바꾸고 'Value'는 100으로 바꿔보겠습니다.


이제 다시 게임으로 돌아가 게임을 약간 진행해 보겠습니다.


FOOD는 가득차 있고 LIVES는 10, TIME은 89에서 90을 왔다 갔다 하고 ENERGY는 게이지를 넘어가 있군요. 슈퍼 원시인이 되었습니다. Cheat Engine으로 돌아가 언제든지 원하는 수치를 변경, 고정 시킬 수 있겠죠?



Level 7입니다. Level 7이 시작하자 마자 FOOD를 가득 채웠고 LIVES는 특별히 바꾸지 않았지만 22로 증가되어 있군요.


가끔 LIFE를 주기도 하는 할아버지는 이제 가볍게 무시할 수 있습니다.


Level 7까지 모두 가볍게 클리어 하고 그리운 가족의 품으로 돌아 왔습니다.

더 많은 tip과 좋은 내용들이 Cheat Engine help에 들어 있습니다. 조금더 공부 하고 싶으시다면 꼭 한번 읽어 보시기 바랍니다.

Posted by J.sean
Computer/Crack2009. 5. 24. 22:14


드디어 마지막 step입니다. 마지막 단계인 만큼 알아야 할 것도 다른 step에 비해 조금 많습니다. 우선 c에 대해 조금 알아야 하는군요. 튜토리얼에서 필요한 코드가 주어지긴 하지만 이 코드를 이해 하려면 기본적인 c문법은 알고 있어야 합니다. c는 아래 링크에서 간단히 공부하고 오시기 바랍니다.

Win32 Api - C(문법) C(고급) C++(문법) C++(고급)

자, 그럼 마지막 단계를 풀어 보도록 하겠습니다. 이번에도 역시 Health값이 100으로 주어져 있고 'Hit me'버튼을 누를때마다 1씩 감소합니다. 우리가 해주어야 할 작업은 'Hit me'버튼을 클릭할때 시간에 따라 현재 시간의 초가 30초 이상이면 Health 값을 1000으로 , 미만이면 2000으로 바뀌게 하는 것입니다. 굉장히 어렵게 보이지만 그다지 어렵지 않으니 천천히 따라 오시기 바랍니다.

우선 위 링크에서 간단히 c문법을 공부하고 오셨을테니 튜토리얼에서 주어진 c코드를 잠시 살펴 보도록 하죠.

#include <time.h>

struct tm *timep;
time_t c;
c=time(0);

timep=localtime(&c);

if (timep->tm_sec>=30)
  *(int *)addresstochange=1000;
else
  *(int *)addresstochange=2000;


굉장히 짧은 코드입니다. 간단히 설명 드리자면 현재 시간을 구해서 30초 이상인지 비교후 30초 이상이면 addresstochange에 1000을, 미만이면 2000을 대입하는 코드입니다. 물론 addresstochange는 나중에 실제 주소로 바꿔야 겠지요.

그럼 시작해 보겠습니다. 우선 'Hit me'버튼을 클릭해 가며 Health의 주소를 찾은후 어떤 코드가 쓰기를 시도하는지 찾아보겠습니다.


00458eaa번지의 'ff 8b 18 03 00 00'코드 였군요. 'Show disassembler'버튼을 클릭해 'Memory Viewer'를 살펴 보죠.


조금 전 찾아 놓은 코드가 보이는 군요. 우리는 메뉴에서 'Tools - Script Engine'을 클릭합니다. 'Ctrl+Alt+A'를 눌러도 됩니다.



'Script engine'윈도우가 생성 되었습니다. 이 윈도우에 튜토리얼에서 주어진 코드를 입력해 줍니다. 물론 addresstochange는 Cheat Engine에 찾아놓은 Health의 주소로 바꿔 주어야 합니다. 주소값은 16진수 이므로 앞에 0x를 붙여야 겠죠? 제 컴퓨터 상에선 주소값이 009739B0으로 나왔기 때문에 0x009739B0으로 바꿔 주었습니다.


그럼 이제 메뉴에서 'Inject - inject into current process'를 클릭해 줍니다.


2번째 줄에 call명령이 포함된 'Auto assemble'윈도우가 생성 되었습니다. 이 명령어를 잘 기억해 두고 'Memory Viewer'윈도우로 돌아가 step 7에서 했던 것처럼 우리가 찾았던 1감소시키는 코드를 선택해 주고 'Tools - Auto Assemble'을 클릭해 'Auto assemble'윈도우가 생성되면 'Template-Code injection'을 클릭해서 아래 그림과 같은 template을 만들어 줍니다.


가독성을 위해 윈도우를 살짝 넓혀 보도록 하죠.


이제 이 template에서 1감소 시키는 originalcode를 삭제해 주겠습니다. 이 코드를 삭제 하지 않으면 Health값이 1000이 되어야 하는 상황에서 999가 되고 2000이 되어야 하는 상황에선 1999가 되어 버립니다. 그럼 3, 15, 16번째 줄을 삭제하고 newmem에는 우리가 만들었던 스크립트를 call하는 명령어를 입력해 주겠습니다. 기억 하시죠? 'call 011600CD'.


자 필요한 일을 모두 해 주었으므로 'Execute'버튼을 클릭해 코드를 'inject'하고 튜토리얼로 돌아가 'Hit me'버튼을 클릭해 보겠습니다.


Health가 2000으로 바뀌면서 'Next'버튼이 활성화 되었습니다. 성공이군요. 잠시 후에 다시 한번 'Hit me'버튼을 클릭해 보죠.


이번엔 1000으로 바뀌었습니다. 모든게 제대로 되었죠? 'Next'버튼을 클릭합니다.


모든 튜토리얼이 끝났습니다. 수고 하셨습니다.

 

'Computer > Crack' 카테고리의 다른 글

Cheat Engine - Searching Tip  (4) 2009.05.25
Cheat Engine - Step 8 : Multilevel pointers  (2) 2009.05.23
Cheat Engine - Step 7 : Code Injection  (4) 2009.05.22
Cheat Engine - Pointer(3D Pinball)  (0) 2009.05.22
Cheat Engine - Step 6 : Pointers  (3) 2009.05.21
Posted by J.sean
Computer/Crack2009. 5. 23. 21:25


step 8은 Multilevel pointers, 포인터의 포인터 찾기 입니다. 주어진 값은 4단계의 포인터에 의해 지시되고 있습니다. step 6를 완전히 이해 했다면 어렵지 않게 해결할 수 있을겁니다. 우선 문제를 해결하기 전에 'Settings'를 클릭해 설정을 약간 바꿔 주겠습니다.


Settings를 클릭하면 위와 같은 윈도우가 나타나는데 'General settings'에서 'Pointer adding:Append pointerline instead of insert'를 선택해 줍니다.

자, 그럼 문제를 풀어 보도록 하죠. 이번 튜토리얼은 step 6와 마찬가지로 'Change pointer'를 클릭해 변수의 주소가 바뀌었을 때도 값이 5000으로 고정 되어있도록 만들어 주는 것입니다. 그럼 Cheat Engine을 실행하고 튜토리얼을 오픈 합니다. 'Change value'버튼을 클릭하면 값이 바뀌므로 쉽게 주소를 찾을 수 있을 겁니다. 'Change pointer'버튼은 마지막에 쓰이므로 건드리지 않도록 합니다. 주소를 찾았다면 step 6에서 했던 것처럼 포인터를 찾아 리스트 박스에 옮겨 놓습니다.


값은 814로 바뀌었고 포인터의 주소는 00972F10, 오프셋은 18이었습니다. 00972FBC를 가리키는 포인터군요. 여기까진 step 6와 다를바 없습니다. 하지만 우리가 찾은 00972F10역시 다른 포인터에 의해 지시되고 있다는게 다른점 입니다. 베이스 주소는 녹색으로 표시되므로 녹색으로 된 주소를 찾을때까지 계속 같은 작업을 반복해 주면 됩니다.

그럼 우리가 찾아놓은 포인터를 지시하는 다른 포인터를 찾아 보도록 하겠습니다. 리스트 박스에 추가해 놓은 포인터 위에서 오른쪽 마우스 클릭하여 'Find out what accesses this address'를 선택해 주고 'Find out what accesses this pointer'를 클릭합니다.


다시 튜토리얼로 돌아가 'Change Value'버튼을 클릭하면 어떤 코드가 포인터에 접근하는지 찾아낼 수 있습니다.


0045981e번지에 있는 '8b 10'이라는 코드가 잡혔군요. 'More information'버튼을 클릭하여 더 자세한 정보를 확인 하도록 하죠.


우리가 찾아야 할 값은 00972F10이겠죠? Cheat Engine으로 돌아가 검색 하겠습니다.


00972EF8번지가 검색 되었습니다. 이 주소가 우리의 포인터의 포인터 주소입니다. 이 포인터를 리스트 박스에 추가해 주겠습니다. 포인터의 포인터를 추가 하는 작업은 처음 포인터를 추가할때와는 약간 다른 작업을 필요로 합니다. 하지만 별로 어렵지 않으니 천천히 따라 오시기 바랍니다.

우선 우리가 추가해 놓았던 'P->00972FBC'를 더블 클릭하겠습니다.


조금전 포인터를 추가 했던 윈도우가 다시 등장합니다. 이 윈도우에서 'Add pointer'버튼을 클릭합니다.


윈도우가 약간 길어지면서 새로운 포인터를 입력할 수 있는 에디트 박스가 추가 되었고 처음에 입력했던 주소가 사라져 버렸습니다. 하지만 오프셋 값은 그대로 남아 있군요. 이렇게 된 이유는 우리가 포인터의 포인터를 추가할 계획이기 때문입니다. 새로생긴 맨 아래의 'Address of pointer'에디트 박스에 우리가 조금전 찾아던 주소를 입력해 주면 모든 주소가 다시 자동으로 입력되고 오프셋값과 계산 됩니다. 그러므로 우리는 맨 마지막 에디트 박스에 정확한 주소와 오프셋 값만 다시 넣어주면 되는 것입니다.

그럼 우리가 조금전 새로 찾아 놓은 주소와 오프셋 값을 입력 하도록 하겠습니다.


자, 마지막 에디트 박스에 포인터 주소로 972EF8과 오프셋 0을 입력하니 나머지 주소가 자동으로 입력되고 결과적으로 00972FBC를 가리키는 포인터의 포인터라는게 확인 되었습니다. 'OK'버튼을 눌러 추가 하도록 합니다.


다시 Cheat Engine으로 돌아가게 되는데 아무것도 달라진게 없어 보입니다. 하지만 'P->00972FBC'를 더블 클릭하면 우리가 해 놓은 작업을 다시 볼 수 있습니다.

이제부터 같은 작업의 반복 입니다. 다시 'P->00972FBC'에 접근하는 코드를 찾아 포인터의 주소를 검색하고 같은 방법으로 포인터를 추가해 주는 것입니다. 베이스 주소인 녹색으로 표시되는 주소를 찾을때까지 진행시켜 보겠습니다.


드디어 마지막 베이스 주소를 찾았습니다. 그럼 추가해 줘야겠죠?


주소값으로 460C20, 오프셋값으로 C를 입력했습니다. 00972FBC를 정확히 지시하는군요. 'OK'버튼을 눌러 추가해 주고 'Value'를 5000으로 바꾼 후 freeze시키겠습니다.


튜토리얼이 원하는 대로 모두 해줬으므로 튜토리얼로 돌아가 'Change pointer'버튼을 눌러 확인해 보도록 하죠.


step 6와 마찬가지로 'You've got x seconds left to change the value to 5000'라는 메세지가 나오고 'Next'버튼이 활성화 되었습니다. 성공이군요.

'Next'버튼을 클릭해 마지막 step인 step 9으로 이동합니다.

'Computer > Crack' 카테고리의 다른 글

Cheat Engine - Searching Tip  (4) 2009.05.25
Cheat Engine - Step 9 : Injection++  (6) 2009.05.24
Cheat Engine - Step 7 : Code Injection  (4) 2009.05.22
Cheat Engine - Pointer(3D Pinball)  (0) 2009.05.22
Cheat Engine - Step 6 : Pointers  (3) 2009.05.21
Posted by J.sean
Computer/Crack2009. 5. 22. 20:34



step 7을 시작하면 'Health'값 100과 'Hit me'버튼 하나가 있습니다. 'Hit me'버튼을 클릭할때 마다 수치가 1씩 줄어들게 됩니다. 제목 그대로 code를 inject해서 'Hit me'버튼을 클릭할때 마다 수치가 2씩 증가 하도록 바꾸는 것이 이번 튜토리얼의 목표입니다.

그럼 간단히 Health값을 바꿔가며 Cheat Engine으로 Health값이 저장되어 있는 주소를 찾아 리스트 박스로 옮겨 놓고 어떤 코드가 그 주소에 쓰기를 시도 하는지 찾아 보도록 하겠습니다.


'ff 8b 10 03 00 00'이었군요. 오른쪽 중간쯤에 보면 'Decrement by 1'이라는 설명까지 자세히 나옵니다. 그럼 이제 이 코드가 있는 0045a063번지 주위를 자세히 살펴 보도록 하겠습니다. 'Show disassembler'버튼을 클릭합니다.


굉장히 복잡해 보이는 'Memory Viewer'윈도우가 생성 되었습니다. 우리가 해야할 일은 조금전 찾아놓은 주소에서 하는 작업을 다른 작업으로 바꾸는 것입니다. 다행히 이 일은 그다지 어렵지 않습니다. 우선 우리가 찾았던 주소인 '0045A063'을 한번 클릭해 주고 메뉴에서 'Tools - Auto Assemble'을 선택합니다. 'Ctrl+A'를 눌러도 됩니다.


그러면 아래와 같은 'Auto assemble'윈도우가 생성되는데 메뉴에서 'Template - Code injection'을 선택합니다.


아래 그림처럼 'Code inject template'윈도우가 생성되고 우리가 찾았던 주소값이 자동으로 입력되어 있습니다. 'OK'버튼을 클릭합니다.


다시 'Auto assemble'윈도우로 포커스가 넘어가고 아래 그림처럼 코드가 자동으로 입력되어 있습니다.


특히 이 부분은 다양한 방법으로 해결이 가능합니다. 하지만 저는 다른 코드는 건드리지 않는 가장 간단한 방법 한가지만 보여드리도록 하겠습니다. 각자 여러가지 방법을 시도해 보시기 바랍니다. 우선 코드의 가독성을 높이기 위해 윈도우를 확장 시켜 보죠.


이미 주석으로 간단한 설명이 잘 되어 있군요. 16번째 줄에 health값을 1감소 시키는 원래 코드가 있고 19번째 줄에 다시 원래 위치로 돌아가는 코드가 있습니다. 11번째 줄에 있는 'newmem:'아래 부터 우리가 코드를 입력해야 하는 부분입니다. 주석을 지울 필요는 없으니 13번째 줄부터 작성해 나가면 되겠군요.


13번째 줄에 'add [ebx+00000310], 3' 명령어를 입력했습니다. 15번째 줄부터 나오는 원래 코드에서 1을 감소 시키므로 우리는 3을 증가 시켜야 결과적으로 2가 증가 되겠죠.

자 필요한 일을 모두 해줬으므로 아래에 있는 'Execute'버튼을 클릭 하고 'Yes'버튼을 눌러 코드를 'inject'하겠습니다.


코드가 성공적으로 010B0000번지에 'inject'되었다는 메세지 박스 입니다. 010B0000번지로 가보면 우리가 입력한 내용을 볼 수 있습니다. 'OK'버튼을 클릭 합니다.

다시 'Memory Viewer'윈도우로 돌아가 보겠습니다.


우리가 찾았던 코드가 바뀌어 있는걸 볼 수 있습니다. 코드가 'jmp 010b0000'로 바뀌었으므로 프로그램이 이 부분에 도달하게 되면 010b0000로 건너 뛰어 우리가 입력한 코드를 실행하겠죠?

자 그럼 이제 다시 튜토리얼로 돌아가서 'Hit me'버튼을 클릭해 보겠습니다.


'Hit me'버튼을 클릭 할때마다 'Health'값이 2씩 증가하고 'Next'버튼이 활성화 되었습니다. 성공입니다.

'Next'버튼을 눌러 다음 step으로 이동합니다.

'Computer > Crack' 카테고리의 다른 글

Cheat Engine - Step 9 : Injection++  (6) 2009.05.24
Cheat Engine - Step 8 : Multilevel pointers  (2) 2009.05.23
Cheat Engine - Pointer(3D Pinball)  (0) 2009.05.22
Cheat Engine - Step 6 : Pointers  (3) 2009.05.21
Cheat Engine - Step 5 : Code finder  (0) 2009.05.19
Posted by J.sean
Computer/Crack2009. 5. 22. 20:19


step 6까지 진행하며 약간 어려운 편에 속했던 내용들을 3D Pinball게임을 통해 복습해 보는 시간을 갖도록 하겠습니다.

3D Pinball게임을 실행하고 Cheat Engine으로 오픈 시킨후 ball개수를 저장하는 주소를 찾아 리스트 박스로 옮겨 줍니다. ball의 개수는 10개로 바꿔 주겠습니다.


0121AFAE번지를 오른쪽 마우스 클릭하여 'Find out what writes to this address'를 선택해 debugger를 붙여 줍니다. 그리고 다시 ball을 하나 잃어 어떤 코드가 공의 개수를 줄여주는지 찾아 보겠습니다.


'89 86 46 01 00 00'이군요. 저 코드를 선택해 주고 'Replace'를 클릭해 아무것도 하지 않는 코드로 바꿔주면 더 이상 볼의 개수가 줄어들지 않게 되겠죠? 우리는 포인터를 한번 찾아 보겠습니다. 'More information'을 클릭합니다.


이번에도 역시 우리가 주목할 부분은 붉은색으로 나타난 '>>010175b7 - mov [esi+00000146], eax'입니다. 그 아래에는 0121AE68이 우리가 찾아야 할 값이라고 친절하게 나와 있습니다. 이 값이 포인터가 가지고 있는 값이겠죠? 그럼 Cheat Engine으로 돌아가서 그 값을 찾아 보겠습니다.


346개의 결과가 나왔습니다. 그 중 녹색으로 나오는 주소값이 위에 2개 있군요. 주소값이 static일때 녹색으로 표시 됩니다. 그럼 둘 중 위의 주소값으로 먼저 확인해 보겠습니다.

'Add address manually'버튼을 눌러 포인터를 추가해 줍니다.


offset값은 146입니다. 기억 하시죠? '>>010175b7 - mov [esi+00000146], eax'이 우리가 찾은 코드였습니다. 0121AE68 + 146 = 0121AFAE로 이 값은 우리가 처음 찾아 놓은 주소값과 일치 합니다.

그럼 'OK'버튼을 클릭해 줍니다.


'P->0121AFAE'가 추가 되었습니다. 이 포인터가 우리가 찾던 포인터인지 확인해 보도록 하죠. 'Value'를 20으로 바꿔주고 freeze시킨 후 게임을 진행시켜 공을 잃도록 하겠습니다. 처음 찾아놓았던 주소의 'Value'도 자동으로 똑같이 바뀝니다.


아무리 해도 공의 개수는 변하지 않는군요. 성공입니다.

윈도우 사용자라면 대부분 가지고 있는 3D Pinball게임으로 간단한 포인터 찾기 연습을 해 보았습니다. 포인터에 대해 확실히 이해하고 넘어 가시기 바랍니다.

Posted by J.sean
Computer/Crack2009. 5. 21. 20:56

지난 강좌에선 변수의 위치가 변하는 경우를 다루기 위해 Code finder를 공부했습니다. 하지만 Code finder만으로 변화하는 변수의 위치를 찾아내 값을 바꾸기는 힘듭니다. 그래서 포인터라는게 있는거죠. 포인터에 대해 잘 모르신다면 아래 링크에서 살짝 공부하고 오시기 바랍니다.

Win32 Api - Pointer

이번 강좌에서 어셈블리어를 꼭 알아야 할 필요는 없지만 알고 있다면 상당히 도움이 됩니다. 어셈블리어에 대한 기본적인 설명은 Cheat Engine help - Tutorials - Basic assembler에 나와 있습니다.

Basics of Assembler.rar

Assembler - The Art Of Assembly Programming In Win32.rar



Step 6는 Step 9의 기본이 되는 중요한 내용 입니다. 완전히 이해하고 넘어가시기 바랍니다. 그럼 Step 6에 대해 알아 보겠습니다.


100이라는 값이 주어져 있고 밑에는 'Change value', 'Change pointer'버튼이 있습니다. 이 값을 5000으로 고정 시켜야만 Step 6가 해결 됩니다. 'Change pointer'버튼은 문제 해결 마지막 순간에만 사용합니다. 해결 중간에 누르지 않도록 합니다. 그럼 Cheat Engine으로 튜토리얼을 오픈하고 값을 바꿔가며 주소를 찾은 후 그 변수의 주소를 리스트 박스로 옮겨 놓습니다. 지금까지 잘 따라 오셨다면 이 정도는 혼자 하실 수 있을 겁니다.


값은 836으로 바뀌었고 주소는 0096F3E4로 검색 되었습니다. 여기서 이 값을 5000으로 바꾸고 Freeze시켜도 문제는 해결되지 않습니다. 'Change pointer'버튼을 클릭 하면 변수의 주소가 변하면서 값이 바뀌기 때문입니다. 그래서 우리는 포인터를 찾아 그 포인터가 가리키는 주소의 값을 고정 시켜야 하는 것입니다. 그럼 우선 포인터를 찾아 보도록 하겠습니다. 리스트 박스에 찾아 놓은 주소에서 오른쪽 마우스 클릭을 하여 'Find out what writes to this address'를 선택하고 debugger를 붙여 줍니다. 이제 다시 값을 바꿔주면 어떤 코드가 값을 바꿨는지 찾아 주겠죠?


'89 10'이라는 코드가 잡혔군요. 저 코드를 더블 클릭하거나 코드를 선택해 주고 'More information'버튼을 클릭 합니다.


자세한 정보가 담긴 창이 열렸습니다. 붉은색으로 된 부분이 우리가 찾은 코드 입니다. 여기서 중요한 것은 '[', ']'사이의 값입니다. eax값은 아래에 다시 나와있습니다. 바로 밑에는 친절하게도 우리가 찾아야 할 값까지 말해 주고 있습니다. 그럼 다시 Cheat Engine으로 돌아가 0096F3E4라는 값으로 새로운 검색을 시작해 보겠습니다. 눈치 채셨는지 모르겠지만 이 값은 우리가 처음에 찾아 놓은 변수의 주소값과 일치 합니다. 0096F3E4는 16진수 이므로 'Hex'체크 박스를 클릭해 줘야 겠죠? 지금은 간단히 eax만이 '[', ']'사이에 있지만 식이 조금 더 복잡하게 나올 수 도 있습니다. 예를 들어 '[esi+12]'와 같이 나왔다면 우리가 검색해야 할 수치는 esi이고 offset 값은 12가 되는 것입니다. 잠시후 offset값을 입력해야 하는 상황이 나오니 잘 기억해 두시기 바랍니다.


00460C34번지가 검색 되는군요. 저 주소가 포인터의 주소입니다. 그럼 리스트 박스 오른쪽 위에 있는 'Add address manually'버튼을 클릭해 포인터를 추가 하겠습니다.


'Pointer'버튼을 클릭해 줍니다.


위 그림과 같이 창이 커지게 됩니다. 'Address of pointer'에 포인터의 주소를 넣어주고 'Offset (Hex)'에 오프셋 값을 넣어 주면 됩니다. 우리가 찾은 포인터의 주소와 오프셋 값을 넣어 주도록 하겠습니다. 우리의 offset값은 '0'입니다. 기억 하시죠? '[', ']'사이의 식이 offset값 0인 'eax'로 간단 했었습니다.


값을 모두 넣어주면 자동으로 포인터가 가리키는 주소값이 계산되어 나옵니다. 우리가 포인터의 주소값을 넣은 에디트 박스 바로 위에 'This pointer points to address 0096F3E4'라는 문장 보이시죠? 처음에 Cheat Engine리스트 박스에 찾아 넣어주었던 주소와 일치하는걸 확인할 수 있습니다.


그럼 'OK'버튼을 클릭해 포인터를 추가 합니다.


위 그림처럼 주소가 'P->0096F3E4'라는 포인터 목록이 추가 되었습니다. 이제 튜토리얼로 돌아가 'Chane value'버튼을 누르면 리스트 박스에 들어있는 2개의 value값이 똑같이 변하는걸 확인할 수 있을겁니다. 모든게 제대로 되었다는 뜻 입니다.


그럼 다음 step으로 넘어가기 위해 마무리 짓겠습니다. 'P->0096F3E4'주소의 'Value'를 5000으로 바꿔주고 'Frozen'체크 박스를 클릭합니다. '0096F3E4'의 'Value'도 같이 자동으로 변합니다.


튜토리얼로 돌아가 'Change pointer'버튼을 클릭합니다.


'You've got x seconds left to change the value to 5000'이라는 메세지가 나오고 사라진 후 'Next'버튼이 활성화 됩니다. 성공이군요. 'Next'버튼을 눌러 다음 step으로 이동합니다.

Posted by J.sean
Computer/Crack2009. 5. 19. 22:45


경우에 따라 어떤 데이터가 저장 되어 있는 장소는 프로그램을 다시 실행하거나 프로그램 실행중 바뀔 수 있습니다. 이런 경우에 쓸 수 있는 기술 하나를 step 5에서 배워 보겠습니다.

튜토리얼을 실행 시키고 step 5까지 진행 합니다.


'Change value'버튼이 있고 그 위에 100이 주어져 있습니다. 100이 저장되어 있는 장소는 튜토리얼을 실행할 때마다 바뀌게 됩니다. 수치는 'Change value'버튼을 누를때마다 바뀝니다.

Cheat Engine을 실행 시키고 튜토리얼을 오픈 합니다.


우선 100으로 검색을 시작해 보겠습니다.


50개의 결과가 나왔습니다. 튜토리얼로 돌아가 'Change value'버튼을 클릭 하겠습니다.


938로 바뀌는 군요. Cheat Engine으로 다시 938을 검색 합니다.


0096AB24라는 주소 하나가 남았습니다. 아래 리스트 박스로 옮기겠습니다.


자, 지금 까진 리스트 박스로 옮겨진 주소의 value값을 수정하여 문제를 풀어 왔습니다. 하지만 step 5에선 이 값을 아무리 바꿔주거나 freeze시켜도 소용이 없습니다. 튜토리얼 설명에선 충분히 빠른 속도로 이 값을 고정시켜 주면 step 5가 해결 될 수 도 있다고 하지만 단순히 'Frozen'체크박스를 클릭해 주는것 만으론 해결되지 않습니다. 아마도 프로그램 내부에서 'Frozen'보다 빠른 속도로 값을 체크하는것 같습니다. 보다 근본적인 해결책을 찾아 보도록 하죠.

우리가 리스트 박스에 넣은 0096AB24주소 항목을 오른쪽 마우스 클릭해 줍니다.


위 그림과 같이 여러가지 메뉴가 나오는데 그 중 'Find out what writes to this address'항목을 선택해 줍니다.


Cheat Engine의 debugger를 튜토리얼에 붙이겠냐는 말입니다. 'Yes'를 클릭해 줍니다.


'Yes'를 클릭하고 나면 위 그림과 같은 빈 윈도우가 나타납니다. 이 윈도우는 지금 부터 우리가 선택해 놓은 0096AB24주소에 무엇인가 기록을 시도 하는 코드를 찾아 줍니다. 그럼 다시 튜토리얼로 돌아가 'Change value'버튼을 클릭해 값을 바꿔 보겠습니다.


값이 304로 바뀌었습니다. 값이 바뀌었다는건 어떤 코드가 그 주소에 새로운 값을 대입했다는 뜻이므로 조금전에 생성된 윈도우에 기록이 남아 있겠죠? 포커스를 조금 전에 새로 생긴 윈도우로 다시 옮겨 가 보도록 하죠.


드디어 어떤 코드가 0096AB24번지에 기록을 시도 했는지 찾았습니다. '89 10'이라는 코드 였군요. 오른쪽 아래에 있는 'Stop'버튼을 눌러 추적을 멈추고 이 코드를 선택 해주면 오른쪽의 버튼들이 활성화 됩니다. 'Replace'를 클릭 해 우리가 리스트 박스에 선택했던 0096AB24번지에 새로운 값을 대입하는 '89 10'이라는 코드를 아무런 일도 하지 않는 코드로 대체 합니다.


Replace를 클릭하면 위와 같은 윈도우가 나오는데 새로 대체될 코드의 이름을 지어주는 것 입니다. 그냥 'OK'를 클릭해 줘도 상관 없고 특별한 이름을 지어줘도 됩니다. 'changed'라는 이름을 만들어 주도록 하겠습니다.


'OK'버튼을 클릭 합니다.


다시 이 윈도우로 포커스가 옮겨 갔습니다. 필요한 코드는 모두 찾아 해결 했으니 'Close'버튼을 눌러 닫아 줍니다.


다시 Cheat Engine으로 돌아 왔습니다. 겉보기엔 아무런 변화가 없어 보입니다. 하지만 우린 분명히 위에서 코드를 바꿔 주었습니다. 확인해 봐야 겠죠? 튜토리얼로 돌아가 'Change value'버튼을 클릭해 보겠습니다.


'Change value'버튼을 클릭했는데 값은 바뀌지 않고 'Next'버튼이 활성화 되었습니다. 우리가 위에서 0096AB24번지에 새로운 값을 대입하는 '89 10'이라는 코드를 아무런 일도 하지 않는 코드로 대체 했기 때문에 아무리 'Change value'버튼을 클릭해도 값은 바뀌지 않습니다.


cheat Engine으로 돌아가 화면 왼쪽 하단을 보면 위 그림과 같이 'Advanced options'라는 작은 버튼이 있습니다. 한번 클릭해 보겠습니다.


'Advanced Options'윈도우가 열립니다. 조금전 우리가 이름 지어준 'changed'가 있군요. 오른쪽 클릭해 보죠.


'changed'코드에서 disassembler를 열거나 원래 코드로 복원 하는등 여러가지 메뉴가 나옵니다. 실수로 엉뚱한 코드를 수정 했다면 여기서 복원이 가능합니다.

튜토리얼로 돌아가 'Next'버튼을 클릭하면 Step 6로 넘어갑니다.

Posted by J.sean
Computer/Crack2009. 5. 18. 21:12


Step 4는 지금껏 우리가 해왔던 4 Bytes가 아닌 double과 float이라는 데이터 타입의 검색입니다. 하지만 데이터 타입만 다를뿐 검색하고 수정하는 과정은 별 다를바 없으니 어렵지 않게 해결할 수 있습니다.

우선 dobule과 float이 무엇인지 궁금하신 분은 아래 링크를 통해 간단히 공부하시기 바랍니다.

Win32 Api - Real Number

자, 필요한 내용을 모두 알아 보았으면 튜토리얼 Step 4를 준비 하도록 하죠.


Heath 값이 float형으로 100, Ammo 값이 double형으로 100 으로 설정되어있습니다. 이 값들을 모두 5000이상으로 바꿔주는게 Step 4의 목표입니다. 그동안 배운 내용을 통해 다양한 Scan type으로 검색이 가능하다는걸 아실겁니다. 오늘은 'Exact Value'와 'Value Between..'을 이용해 각각 검색해 보도록 하겠습니다. 그럼 Cheat Engine을 실행 시키고 튜토리얼을 오픈 시킨후 Value type을 'Float'으로 바꿔주고 100을 검색해 보겠습니다.


6개의 결과가 나왔군요. 금방 끝날거 같습니다. 튜토리얼로 돌아가 'Hit me'버튼을 클릭합니다.


'Health'가 96으로 변경되었습니다. 그럼 96으로 다시 검색해 보겠습니다.


00969DE4가 우리가 찾는 주소겠죠? 아래 리스트 박스로 옮겨 줍니다.


이번엔 'Ammo'값을 다른 방법을 이용해 찾아보도록 하겠습니다. 'New Scan'을 한번 클릭해 주면 다른 검색을 시작할 수 있습니다. 'Value type'을 'Double'로 바꿔줍니다. 'Scan type'은 'Value between..'으로 설정해 주고 첫 번째 Value:박스에 95, 두 번째 Value:박스에 105를 입력해서 검색을 시작해 보겠습니다.


95와 105 사이에 속하는 10개의 결과가 나왔습니다. 튜토리얼로 돌아가 총알을 한번 쓰겠습니다. 'Fire'버튼을 클릭합니다.


'Ammo'값이 99.5로 바뀌었습니다. 이번엔 99와 100 사이의 값을 검색해 보겠습니다.


2개의 결과가 나왔습니다. 100이라는 값을 가진 77152EA8보다는 아무래도 99.5라는 값을 가지고 있는 첫 번째 00969DEC가 우리가 찾는 주소 같습니다. 이번엔 튜토리얼로 돌아가 총알을 한번더 쓰고 Cheat Engine으로 돌아와 아무런 검색도 하지 않겠습니다.


'Fire'버튼을 눌러 총알을 쓰니 'Ammo'값이 99로 변경 되었습니다. Cheat Engine으로 돌아 갑니다.


77152EA8은 100 그대로 지만 우리가 의심하고 있던 00969DEC의 값이 99로 변경되어 있는게 보입니다. 확실하겠죠? 아래 리스트 박스로 옮겨 놓겠습니다.


자, Float형의 Health값 96을 가지고 있는 00969DE4와 Double형의 Ammo값 99를 가지고 있는 00969DEC를 모두 찾았습니다. 이 값들을 모두 5000 이상으로 바꿔주면 Step 4는 끝나게 됩니다. 각각의 Value를 6000으로 만들어 주겠습니다.


이젠 모두 알다시피 값들을 6000으로 바꿨지만 이 수치는 아직 튜토리얼 윈도우 상에 반영되지 않았을 겁니다. 튜토리얼로 돌아가서 'Hit me'버튼과 'Fire'버튼을 한번씩 클릭해 보겠습니다.


성공입니다. 'Next'버튼을 눌러 다음 Step으로 이동 합니다.

Posted by J.sean
Computer/Crack2009. 5. 17. 20:23


Step 3에선 초기값이 얼마인지 모르는 상태에서 시작 합니다. 예를 들어 어떤 게이지가 있는데 게임이 진행됨에 따라 게이지가 늘기도 하고 줄기도 하는 겁니다. 물론 그래픽으로 그 게이지의 상태를 파악할 수 는 있지만 정확한 값은 모르는 겁니다. 이런 방법은 대전 게임에서 유용하게 사용될 수 있을것 같네요. 대표적인 예로 Street Fighter가 있습니다.


얼마전 Street Fighter 4가 나왔더군요..


자, 그럼 Cheat Engine Tutorial Step 3를 준비하시고 Cheat Engine으로 오픈시켜 줍니다.


튜토리얼을 보면 'Hit me'버튼이 있고 그 밑에 상태바가 있습니다. 우리가 알고 있는 것은 값이 0 에서 500의 범위를 갖는다는 것과 'Hit me'버튼을 누를때마다 수치가 약간 줄어든다는 것 뿐입니다.

정확한 초기 수치를 모르므로 'Unknown intial value'로 검색을 시작하도록 하겠습니다. Cheat Engine으로 돌아가 Scan type 을 'Unknown initail value'로 바꿔 줍니다.


이제 'First Scan' 버튼을 클릭합니다.

그러면 아래 그림과 같이 1519616개의 검색 결과가 나오게 됩니다.


튜토리얼로 돌아가 'Hit me'버튼을 눌러 변화를 줘 보도록 하겠습니다.


비활성화 된 'Next'버튼 밑으로 정확히 얼마가 감소되었는지 약 1초 정도 표시 되지만 무시하도록 하죠. 우리는 다시 Cheat Engine으로 돌아가 Scan type을 'Decreased value'로 바꾼후 'Next Scan'버튼을 클릭해 보도록 하겠습니다.


결과가 631개로 줄어 들었습니다. 우리가 찾는 값이 남을때까지 계속 조사해야 겠죠? 튜토리얼로 돌아가 'Hit me'버튼을 눌러 변화를 주고 계속 같은 조건으로 검색해 보겠습니다.


다시 Cheat Engine의 'Next Scan'버튼을 누릅니다.


24개가 남았군요. 다시 한번 해봅니다.



6개 남았습니다. 다시 해보겠습니다.



4개가 남았습니다. 대충 보니 마지막 009652B4의 주소를 가지는 값이 395군요. 왠지 이 값이 맞을것 같지만 확실히 하기 위해 한번더 검사해 보도록 하겠습니다.



다시 4개군요. 한번 더 해보죠.



계속 4개가 남는군요. 더 이상 줄어들지 않으려나 봅니다. 하지만 우리는 009652B4의 값이 우리가 찾는 값에 가깝다는걸 알고 있습니다. 확인해 보도록 하죠. 이 주소를 아래 리스트 박스로 옮기고 5000으로 값을 바꿔줍니다.


자, 그럼 다시 튜토리얼로 돌아가 확인해 보도록 하겠습니다.


역시 우리의 예상이 맞았습니다. 'Next'버튼이 활성화 되었군요. 이제 이 버튼을 누르면 다음 Step으로 넘어 가게 됩니다.

Posted by J.sean