3번째는 타입별 스캔을 다루는듯
Step 4를 보면 문제 내용이 float와 double 형태를 다루고 있습니다.
개요로는 일부 게임에서는 hp와 같은 정보들을 실수형태로 사용하기 때문에
우리도 이것들을 다룰 수 있어야 한다라는 말을 하고 싶어하는 거 같습니다.
근데 맞는 말인게 4Byte보다도 웬만하면 실수형태로 다루는게 정배입니다.
그럼 문제를 한 번 보도록 할까요?
해결 방안은 일단 두개 다 5000 이상으로 올리라는 말이네요.
우선은 Float 형태로 된거부터 찾아보죠. 체력이 100이니까 Float형태로 스캔을 합시다.
애초에 Float로 100 스캔 했을때도 값이 거의 없었는데.. 어쨌든 찾았습니다.
그러면 밑에꺼는 더블 형태니까 Double로 스캔해줍시다.
두개 다 찾았네요. 그러면 우선 해결 조건이 맞는지 디버깅을 잠깐 걸어봅시다.
[rbx+818]이 체력값이 들어가는 곳입니다. xmm0이라 하면 FPU 레지스터라 하여 이러한 실수 형태를
집어 넣고 연산하는 레지스터입니다. 일반적인 레지스터랑 살짝 달라요. 조건문이 2개 있는거 봐서는
[rbx+818]이 체력값이고 [rbx+820]이 Ammo값임을 짐작할 수 있습니다.
그러니까 체력값 5000 이상이 됐을 때 Ammo값을 검사한다는 소리죠. 그 전까지는 따로 검사 안하구요.
JP의 경우 연산했을 때 패리티 플래그가 1일 때, 즉 짝수일 때 통과한다는건데 사실 없는 명령어라고
쳐도 상관 없습니다. 정상적으로 조작할 경우 짝수가 나올 일이 없으니까요. 그러면 JB만 보면 되는데
JB의 경우 Jump Below라 하여 cmp A,B일때 A가 B보다 작으면 점프해서 다음으로 가란 명령어입니다.
즉 이 조건문은 [rbx+818]의 값이 들어간 xmm0과 [tutorial-x86_64.exe+22D5C8]을 비교 했을때
xmm0이 [tutorial-x86_64.exe+22D5C8]보다 작으면 점프 한다는 명령어에요.
옆에 Comment에 보시면 5000이라고 써져 있습니다. 즉 [tutorial-x86_64.exe+22D5C8] 에 5000이
들어가 있다는걸 편하게 보라고 보여주는거죠.
체력값이 5000보다 적은 상태일 때 점프를 하고 있는 모습을 볼 수 있습니다. 그러면 5000으로 맞춰보죠.
5000으로 맞춰주니 조건문을 통과하지 않고 밑을 진행합니다. 이제 Ammo 값을 맞춰주라는 뜻이죠.
둘 다 맞췄을 때 Next 버튼이 활성화 된 것을 볼 수 있습니다.
* 비교 하는 쪽 명령어들을 보면 movss, comiss와 movsd, comisd로 차이가 있는데
movss와 comiss의 경우 32비트 형태의 실수, 즉 4Byte를 다룰 때 사용하는 명령어고
movsd와 comisd의 경우 64비트 형태의 실수, 즉 8Byte를 다룰 때 사용하는 명령어입니다.
예전에야 32비트 프로그램들이 대다수여서 32비트 형태의 명령어만 봤지만
이제는 64비트 프로그램들이 주를 차지하기 시작한 상태라 64비트 형태의 명령어도
알아둘 필요는 있습니다. *
'Reversing & Cheat Engine' 카테고리의 다른 글
33. Cheat Engine Tutorial 6 (0) | 2024.03.18 |
---|---|
31. Cheat Engine Tutorial 4 (0) | 2024.03.16 |
29. Cheat Engine Tutorial 2 (0) | 2024.03.14 |
28. Cheat Engine Tutorial 1 (0) | 2024.03.14 |
27. CRC, 데이터 변조 검사 (0) | 2024.03.12 |