Cheat Engine 2020. 4. 15. 09:15

준비물

1. 치트엔진 6.8src https://hackbox.tistory.com/m/90

2. 라자루스 http://www.lazarus.freepascal.org/index.php?page=downloads

3. asr http://gusqls9901.tnaru.com/files/mc/board/0/220/actualsr_lbr_1_rbr_.zip

4. windows driver kit http://software.naver.com/software/summary.nhn?softwareId=MFS_104443

5. 아크로 에디터 http://www.acrosoft.pe.kr/board/63446

 

주의사항

driver kit 설치시 전부 체크후 설치할 것!

 

1. 6.8src를 c드라이브에 압축해제후 DBKKernel 풀더안의 ce.bet을 오른쪽 클릭후 아크로에디터로 열기

 

2.copy .\obj%BUILD_ALT_DIR%\i386\지정하고픈 엔진의 이름 5글자.sys "..\Cheat Engine\bin\지정하고픈 엔진의 이름 5글자.sys" goto successend: x86success:

  copy .\obj%BUILD_ALT_DIR%\amd64\지정하고픈 엔진의 이름 5글자.sys "..\Cheat Engine\bin\지정하고픈 엔진의 이름 5글자.sys" goto successend

 

굵게 처리된 부분을 수정해야하며 영어와 숫자로만 엔진의 이름을 정해야함. 수정후 꼭 좌상당의 저장을 누를것.

 

ex) obj%BUILD_ALT_DIR%\i386\star1.sys"

 

3. 저장을 완료한 후 다시 DbkKernel 풀더의 sources.ce를 열어 targetname에 앞서 ce.bet에 수정했던 엔진의 이름을 입력후 저장

 

ex) targetname=star1

 

4. windows driver kit에 Checked Build Environment을 열게되면 명령프롬포트창이 열림. (32비트용 x86, 64비트용 x64) 

   프롬포트창에 cd c:\CheatEngine64src\DBKKernel 을 입력해준다. (이는 자신이 소스파일을 설치한 경로를 설정해 주어야하며 앞의 예제는 c드라이브에 압축을 풀었을시 기본경로임.)

   입력후 다시 ce를 입력. 

   "1개의 파일이 복사되었습니다." 라는 말이 나와야 정상적으로 성공. 만약 실패시 처음부터 다시 시도할것.

 

5. cheatengine64src풀더안의 bin풀더를 열게되면 새롭게 복사한 sys파일이 생성되어 있어야함. 

 

ex) ...\bin\star1.sys

 

6. 다시 src풀더로 돌아가 cheatengine.lpi를 실행. 뭔가 복잡한 창이 뜨지만 우리와는 별 관계없음. 

   상단 툴바에 project->project inspector 실행.

   검색창에 main을 검색후 mainunit2.pas를 더블클릭

 

7. resoursestring부분의 ceneme='엔진의 이름' 부분을 입맛에 맞게 변경후 컴파일 진행 (단축키 F8)

 

ex) ceneme='핵커엔진' 

 

8. 다시 DBKKernnel풀더로 돌아가  IOPLDispatcher.c 파일을 아크로에디터로 열기

   많은 단어들이 나오는데 우리가 수정해야할 부분을 검색(ctrl+f)하여 찾아줌

   우리가 수정해야하는 부분은 ReadProcessMemory, WriteProcessMemory, GetMemoryRegionData 임.

   검색하게되면 ntStatus=ReadProcessMemory( (DWORD)pinp->processid-0x0000,null, (PVOID)pinp 블라블라 나올텐데

   빨간부분을 수정해야함. 자신이 원하는 우회값을 숫자로 입력 단, IOPLDispatcher.c를 수정할땐 반드시 -를 붙여야함.

 

ex) processid-0x5480

   

    3개(ReadProcessMemory, WriteProcessMemory, GetMemoryRegionData)를 검색하여 모두 같은값으로 수정해야함. 

 

9. 다시 6번과 같이 치트엔진을 열어주고 마찬가지로 상단 툴바의 project->project inspector를 실행. 검색창에 dbk를 검색하고 dbk32\DBK32functions.pas를 더블클릭후

   검색기능으로 input.ProcessID:=handlelist[i].processid 를 검색후 input.ProcessID:=handlelist[i].processid+0x0000의 빨간부분에 8번에서 설정한 우회값을 재입력

   단, 8번에서는 반드시 '-'를 붙여야 했지만 여기서는 반드시 '+'를 붙여야함.

 

ex)input.ProcessID:=handlelist[i].processid+0x5480

*프로세스 아이디 제일 쉬운 우회방법입니다. 실제사용은 매우 불가능합니다! 참고바랍니다.

posted by 핵커 커뮤니티
:
컴파일러 자료실 2020. 4. 15. 09:13

패치내역

Fixes:

Fixed some more high dpi issues

Fixed issues with the dropdown list in memory records

Fixed pointer offset symbols not calculating properly

Fixed registered binutils

Fixed graphical issues with the tablist

Fixed issue where memory blocks would get cut of before the page end

Fixed some memory leaks

Fixed some graphical issues in the addresslist

Fixed rightclick on r8 and r9 in memoryview

Fixed disassembling some instructions

Fixed DBVM so it works on windows 1709 and later (tested on 1803)

Fixed several DBVM offload crashes

Fixed freeze with allow increase/decrease for 8 byte long values

Fixed several issues where minimizing a window and then close it would hang CE

Fixed file scanning

Fixed crashes when editing memory in some some emulators

Additions and changes:

Text editor improvements

Added hundreds of new cpu instructions

Mono now has some new features like instancing of objects

Mono instances window is now a treeview where you can see the fields and values

"find what addresses this code accesses" can also be used on RET instructions now (useful to find callers)

The graphical memory view now has a lot more options to set it just the way you need

Codepage support in hexview

structure data from PDB files can now be used, and are stored in a database for lookup later

dissect structures form can now show a list of known structures (pdb, mono, ...)

Added a "revert to saved scan" option (lets you undo changes)

Added a "forgot scan" option (in case you forgot what you're doing)

Pointerscan limit nodes is default on in a new ce install (remembers your choice when you disable it)

Autoattach now happens using a thread instead of a gui blocking timer

Some colorscheme enhancements

Added a DBVM based "Find what writes/accesses" feature. (For pro users, enable kernelmode options for it to show)

Changed the dissect data setup from seperate yes/no/value dialogs to a single window

Added a bypass option for ultimap2 on windows 1709. When using ranges, do not use interrupts, or use DBVM

Added find what writes/access to the foundlist

Autoassembler scriptblocks are now grouped when written to memory

Added {$try}/{$except} to auto assembler scripts

Added an extra tutorial/practice target

Added cut/copy/paste context menu items to pointer offset fields in add/change address, and added a context menu to the pointer destination

Added an automated structure compare for two groups of addresses to find ways to distinguish between them

lua:

added automatic garbage collection and settings to configure it

added new functions:

gc_setPassive

gc_setActive

reinitializeSelfSymbolhandler

registerStructureAndElementListCallback

showSelectionList

changed the getWindowlist output

MainForm.OnProcessOpened (better use this instead of onOpenProcess)

enumStructureForms

cpuid

getHotkeyHandlerThread

bunch of dbvm_ functions (needs dbvm capable cpu, and intel only atm)

and more, including class methods and fields (read celua.txt)

출처 치트엔진깃허브

'컴파일러 자료실' 카테고리의 다른 글

[VB] 네이버 로그인 소스  (2) 2020.04.11
posted by 핵커 커뮤니티
:
게임 코드 자료실 2020. 4. 11. 13:01

CoordMode, Mouse, Screen

CoordMode, Pixel, Screen

CoordMode, ToolTip, Screen

ListLines Off

SendMode InputThenPlay

SetBatchLines -1

SetControlDelay, -1

SetKeyDelay, -1, 0

SetMouseDelay, -1

SetWinDelay, -1

PID := DllCall("GetCurrentProcessId")

Process, Priority, %PID%, Normal

global X1, Y1, X2, Y2, 돌격소총, 빨간색, 저격소총, 배경색, 전경색

global FPGCBufferDC = 0

global FPGCReady = 0

global FPGCWait = 1

Gui, Color, FFFFFF

Gui, Font,, 맑은 고딕

Gui, Add, Text,, 해상도

Gui, Add, DropDownList, AltSubmit g설정 v해상도 w200, 1024 × 768||1280 × 1024

Gui, Show,, Bomchattack

Gui, 2: +LastFound +AlwaysOnTop -Caption +ToolWindow

Gui, 2: Color, 000000

Gui, 2: Font, cffffff s12 bold, 굴림

Gui, 2: Margin, 0, 0

Gui, 2: Add, Text, v상태표시줄 w200

gosub, 설정열기

return

설정:

Gui, Submit, NoHide

if (해상도 = 1) {

X1 = 481

Y1 = 448

X2 = 513

Y2 = 385

상태표시줄Y := 768 - 66

Gui, 2: Show, x211 y%상태표시줄Y% NA, Secondary Bomchattack OSD

} else if (해상도 = 2) {

X1 = 609

Y1 = 596

X2 = 640

Y2 = 513

상태표시줄Y := 1024 - 66

Gui, 2: Show, x211 y%상태표시줄Y% NA, Secondary Bomchattack OSD

}

return

설정저장:

Gui, Submit, NoHide

IniWrite, %해상도%, bomchattack.ini, Bomchattack 설정, 해상도

return

설정열기:

if (FileExist("bomchattack.ini")) {

IniRead, 해상도, bomchattack.ini, Bomchattack 설정, 해상도, 1

GuiControl, Choose, 해상도, %해상도%

gosub, 설정

} else {

GuiControl, Choose, 해상도, 1

gosub, 설정

}

return

End::

Suspend, Off

Gosub, GuiClose

return

GuiClose:

gosub, 설정저장

ExitApp

return

돌격소총사격실행:

SetTimer, 돌격소총사격실행, Off

while (돌격소총 = 1) {

updateFPGC()

빨간색 := FPGC(X1, Y1)

if (빨간색 = 0x0000ff) {

DllCall("mouse_event", "UInt", 0x02)

DllCall("Sleep", UInt, 768)

DllCall("mouse_event", "UInt", 0x04)

DllCall("Sleep", UInt, 256)

}

}

while (돌격소총 = 0) {

updateFPGC()

빨간색 := FPGC(X1, Y1)

if (빨간색 = 0x0000FF) {

DllCall("mouse_event", "UInt", 0x02)

DllCall("Sleep", UInt, 16)

DllCall("mouse_event", "UInt", 0x04)

DllCall("Sleep", UInt, 16)

}

}

return

저격소총사격실행:

SetTimer, 저격소총사격실행, Off

updateFPGC()

전경색 := FPGC(X2, Y2)

while (저격소총 = 1) {

updateFPGC()

배경색 := FPGC(X2, Y2)

if (전경색 <> 배경색) {

저격소총 = 0

DllCall("mouse_event", "UInt", 0x02)

DllCall("Sleep", UInt, 16)

DllCall("mouse_event", "UInt", 0x04)

DllCall("Sleep", UInt, 1)

GuiControl, 2: , 상태표시줄, 저격소총 사격

break

}

}

return

FPGC(x, y) {

global FPGCBufferDC, FPGCReady, FPGCWait

global FPGCScreenLeft, FPGCScreenTop

; check if there is a valid data buffer

if (!FPGCReady) {

if (FPGCWait) {

Start := A_TickCount

While !FPGCReady {

Sleep, 10

if (A_TickCount - Start > 5000)

return -3 ; time out if data is not ready after 5 seconds

}

}

else

return -2 ; return an invalid color if waiting is disabled

}

return DllCall("GetPixel", "Uint", FPGCBufferDC, "int", x - FPGCScreenLeft, "int", y - FPGCScreenTop)

}

updateFPGC() {

global FPGCReady, FPGCBufferDC

static oldObject = 0, hBuffer = 0

static screenWOld = 0, screenHOld = 0

; get screen dimensions

global FPGCScreenLeft, FPGCScreenTop

SysGet, FPGCScreenLeft, 76

SysGet, FPGCScreenTop, 77

SysGet, screenW, 78

SysGet, screenH, 79

FPGCReady = 0

; determine whether the old buffer can be reused

bufferInvalid := screenW <> screenWOld OR screenH <> screenHOld OR FPGCBufferDC = 0 OR hBuffer = 0

screenWOld := screenW

screenHOld := screenH

if (bufferInvalid) {

; cleanly discard the old buffer

DllCall("SelectObject", "Uint", FPGCBufferDC, "Uint", oldObject)

DllCall("DeleteDC", "Uint", FPGCBufferDC)

DllCall("DeleteObject", "Uint", hBuffer)

; create a new empty buffer

FPGCBufferDC := DllCall("CreateCompatibleDC", "Uint", 0)

hBuffer := CreateDIBSection(FPGCBufferDC, screenW, screenH)

oldObject := DllCall("SelectObject", "Uint", FPGCBufferDC, "Uint", hBuffer)

}

screenDC := DllCall("GetDC", "Uint", 0)

; retrieve the whole screen into the newly created buffer

DllCall("BitBlt", "Uint", FPGCBufferDC, "int", 0, "int", 0, "int", screenW, "int", screenH, "Uint", screenDC, "int", FPGCScreenLeft, "int", FPGCScreenTop, "Uint", 0x40000000 | 0x00CC0020)

; important: release the DC of the screen

DllCall("ReleaseDC", "Uint", 0, "Uint", screenDC)

FPGCReady = 1

}

posted by 핵커 커뮤니티
:
Cheat Engine 2020. 4. 10. 16:09

준비물

1. 치트엔진 6.8src https://m.blog.naver.com/hack_kr/221891620241

2. 라자루스 http://www.lazarus.freepascal.org/index.php?page=downloads

3. asr http://gusqls9901.tnaru.com/files/mc/board/0/220/actualsr_lbr_1_rbr_.zip

4. windows driver kit http://software.naver.com/software/summary.nhn?softwareId=MFS_104443

5. 아크로 에디터 http://www.acrosoft.pe.kr/board/63446

 

주의사항

driver kit 설치시 전부 체크후 설치할 것!

 

1. 6.8src를 c드라이브에 압축해제후 DBKKernel 풀더안의 ce.bet을 오른쪽 클릭후 아크로에디터로 열기

 

2.copy .\obj%BUILD_ALT_DIR%\i386\지정하고픈 엔진의 이름 5글자.sys "..\Cheat Engine\bin\지정하고픈 엔진의 이름 5글자.sys" goto successend: x86success:

  copy .\obj%BUILD_ALT_DIR%\amd64\지정하고픈 엔진의 이름 5글자.sys "..\Cheat Engine\bin\지정하고픈 엔진의 이름 5글자.sys" goto successend

 

굵게 처리된 부분을 수정해야하며 영어와 숫자로만 엔진의 이름을 정해야함. 수정후 꼭 좌상당의 저장을 누를것.

 

ex) obj%BUILD_ALT_DIR%\i386\star1.sys"

 

3. 저장을 완료한 후 다시 DbkKernel 풀더의 sources.ce를 열어 targetname에 앞서 ce.bet에 수정했던 엔진의 이름을 입력후 저장

 

ex) targetname=star1

 

4. windows driver kit에 Checked Build Environment을 열게되면 명령프롬포트창이 열림. (32비트용 x86, 64비트용 x64) 

   프롬포트창에 cd c:\CheatEngine64src\DBKKernel 을 입력해준다. (이는 자신이 소스파일을 설치한 경로를 설정해 주어야하며 앞의 예제는 c드라이브에 압축을 풀었을시 기본경로임.)

   입력후 다시 ce를 입력. 

   "1개의 파일이 복사되었습니다." 라는 말이 나와야 정상적으로 성공. 만약 실패시 처음부터 다시 시도할것.

 

5. cheatengine64src풀더안의 bin풀더를 열게되면 새롭게 복사한 sys파일이 생성되어 있어야함. 

 

ex) ...\bin\star1.sys

 

6. 다시 src풀더로 돌아가 cheatengine.lpi를 실행. 뭔가 복잡한 창이 뜨지만 우리와는 별 관계없음. 

   상단 툴바에 project->project inspector 실행.

   검색창에 main을 검색후 mainunit2.pas를 더블클릭

 

7. resoursestring부분의 ceneme='엔진의 이름' 부분을 입맛에 맞게 변경후 컴파일 진행 (단축키 F8)

 

ex) ceneme='핵커엔진' 

 

8. 다시 DBKKernnel풀더로 돌아가  IOPLDispatcher.c 파일을 아크로에디터로 열기

   많은 단어들이 나오는데 우리가 수정해야할 부분을 검색(ctrl+f)하여 찾아줌

   우리가 수정해야하는 부분은 ReadProcessMemory, WriteProcessMemory, GetMemoryRegionData 임.

   검색하게되면 ntStatus=ReadProcessMemory( (DWORD)pinp->processid-0x0000,null, (PVOID)pinp 블라블라 나올텐데

   빨간부분을 수정해야함. 자신이 원하는 우회값을 숫자로 입력 단, IOPLDispatcher.c를 수정할땐 반드시 -를 붙여야함.

 

ex) processid-0x5480

   

    3개(ReadProcessMemory, WriteProcessMemory, GetMemoryRegionData)를 검색하여 모두 같은값으로 수정해야함. 

 

9. 다시 6번과 같이 치트엔진을 열어주고 마찬가지로 상단 툴바의 project->project inspector를 실행. 검색창에 dbk를 검색하고 dbk32\DBK32functions.pas를 더블클릭후

   검색기능으로 input.ProcessID:=handlelist[i].processid 를 검색후 input.ProcessID:=handlelist[i].processid+0x0000의 빨간부분에 8번에서 설정한 우회값을 재입력

   단, 8번에서는 반드시 '-'를 붙여야 했지만 여기서는 반드시 '+'를 붙여야함.

 

ex)input.ProcessID:=handlelist[i].processid+0x5480

*프로세스 아이디 제일 쉬운 우회방법입니다. 실제사용은 매우 불가능합니다! 참고바랍니다.

 

posted by 핵커 커뮤니티
:
Cheat Engine 2020. 4. 10. 16:08

다중 포인터 추척하는 두번째 방법입니다.

튜토리얼에 써져있는 값을 스캔합니다.

포인터 스캔 옵션을 지정해주는 창이 뜹니다!

기본적으로 설정됐으니 OK만 클릭해주시면 됩니다.

경로는 삭제하기 편한 바탕화면으로 이동하고 파일이름 또한 변경하고 난후 저장합니다.

모든 포인터를 찾아냈습니다. (어마어마하죠)

튜토리얼에서 Change pointer 클릭하게 된다면 포인터의 주소가 모두 봐뀌게 됩니다.

그리고나서 봐뀐값을 다시 스캔합니다.

Pointer scanner 클릭후 Rescan memory - Removes pointers not pointing to the right address을 클릭해주세요.

새로 스캔한값의 주소를 적어주시고 ok 버튼 클릭합시다. 그리고나면 또 저장하는창이 뜨면 확인하고 덮어쓰겠습니까? 라는 문구 나오면 예 라고 클릭하시면됩니다.

딱 하나만 나왔네요 더블클릭하여 치트테이블로 보내시면 됩니다.

벨류 [5000] 으로 변경한후 ok 누릅시다.

넥스트 버튼이 활성화 됐네요! 확실하게 첫번째방법보다는 간단하다고 생각합니다

수고하셨습니다. 당신은 치트엔진의 튜토리얼을 완료하셨고 튜토리얼 위주로 공부하시고 다른 스캔방법이 더 있나 연구or확인 해보시길 바랍니다.

여기까지 잘 따라오셨다면 고생하셨습니다.

앞으로도 치트엔진에 대해서 궁금한거나 오류나거나 그 외 여러사항들이 있다면

부담없이 댓글로 적어주시면 답변해드리겠습니다.

비밋댓글로도 받고있으니 부담없이 주세요!

posted by 핵커 커뮤니티
:
카테고리 없음 2020. 4. 10. 16:05

다중 포인터 추적해보자

튜토리얼에 나온 값을 스캔합시다.

치트테이블의 값을 오론쪽 클릭 Findout what accesses this address 클릭합시다.

그러면 새창이 뜹니다. 값에 변화가 있을때 누가 이 주소에 접근했는지 추적해주는 창입니다.

 

튜토리얼에서 Change value를 클릭해줍니다.

 

Change value를 클릭할때마다 값이 변하죠?

 

그러면 값을 쓰기/읽기 위해 접근하는 것들을 모두 감지해 목록에 표시해줍니다.

 

참고로 진행중에 Change pointer를 클릭해버리면 포인터위치가 다 변해버립니다.

 

실수로라도 클릭하지 않도록 주의하세요.

2개가 나왔네요 여기서는 하나는 쓰기 하나는 읽기입니다.

mov eax,[esi+18]이 읽기입니다.

이유 > Findout what writes this address로 볼때 mov[esi+18,eax가 나와서 입니다.

그러니 mov eax,[esi+18]을 더블클릭합니다.

TIP - Findout what accesses this address = 쓰기 + 읽기 탐지

Findout what writes this addresswrites = 쓰기만 탐지

포인터의 상세한 정보가 나타납니다.

하지만 저희가 봐야할곳은 [OOOOOO]입니다.

esi > 001FFA78 이네요~ 그리고 오프셋은 18이네요!

값이 나왔네요

여기서는 메모장을 활용하세요.

첫번째

주소

[0027FBF0]

오프셋

[18]

방금 치트테이블에 등록한것을 오른클릭 - Find out what accesses this address 클릭합시다

튜토리얼에서 Change value 클릭하세요

mov eax,[esi]더블클릭하고 esi와 offset을 적어둔후 닫아주시면됩니다.

esi > 0027FBF0 / 오프셋은 0이네요

값 > 0027FBF0 를 스캔 > 주소 02FCE01C 를얻었습니다.

이거 또한메모합시다.

첫번째

주소

[0027FBF0]

오프셋

[18]

두번째

주소

02FCE01C

오프셋

0

방금 등록한 값을 오론쪽으로 클릭합시다.

튜토리얼에서 Change value를 클릭합시다

esi > [02FCE008] 오프셋 > [14] 이네요

띠~용 값이 두개나 나왔네요 당황하지말고 둘다 해보시면 됩니다!

튜토리얼에서Change value를 클릭했을때 하나는 아무것도 안뜨고 다른하나는 하던대로 뜹니다.

찾았다! 이 가짜놈 버립시다.

여기에서 또 메모 하셔야합니다 ^^

순서

1

주소

[0027FBF0]

오프셋

[18]

순서

2

주소

02FCE01C

오프셋

0

순서

3

주소

0029DFCC

오프셋

14

esi > 0029DFC0 오프셋은 0C

오우 드디어 찾았습니다. 원하고 원하던 초록색 값...

순서

1

주소

[0027FBF0]

오프셋

[18]

순서

2

주소

[02FCE01C]

오프셋

[0]

순서

3

주소

[0029DFCC]

오프셋

[14]

순서

4

주소

[0057C3A0]

오프셋

[0C]

어드레스 메모리뷰어 클릭합시다.

포인터 클릭한후 코드값/오프셋 메모한거 적으시면 됩니다!

처음에 있던값이랑 현재에 있던값이랑 동일하다면 성공한거입니다.

벨류 [5000] 으로 변경한후 OK 클릭!

짜짠~ 넥스트버튼이 활성화가 됐네요!

posted by 핵커 커뮤니티
:
Cheat Engine 2020. 4. 10. 16:03

코드 인젝션을 배워보자.

원하는 위치에 사용자가 작성한 코드를 삽입해서 게임을 자유자재로 다룰수 있게됩니다. 재밌고 어렵지만 코드 인젝션은 활용도가 매우 높으니 꼭 알아두면 좋을껍니다.

Hit me를 클릭하면 1씩 고정으로 감소합니다!

100스캔후 99스캔합니다.

더브클릭해서 치트테이블로 보낸후 오론쪽클릭후 Find out what writes to this address 클릭합니다.

Decrem ent by 1 <<< 1씩 감소한다는 뜻입니다.

처음보는 창이 뜹니다. 이창은 메모리뷰머 (메뷰) 입니다. 게임의 정보들은 0~9 + A~F를 사용하여 16진수로 메모리에 저장됩니다.

TOOLE - AUTO ASSEM BLE 클릭 OR 단축키 컨트룰 + A 누르면 창이 뜹니다.

Template 클릭후 코드 인젝션 클릭합시다

어느주소로 점프하라는 군요 가고싶은곳은 1씩 감소시키는 명령어가 있는곳인데

근데 +[226BC] 가 있네요...

아까 메모리뷰어에 있던 어드레스 값이네요

originalcode 봅시다!

이부분이 체력을 1씩 감소 시키는 명령어입니다.

 

"ADD [Adress],Value" 하시면 Adress의 주소에있는 값을 Value씩 증가시켜줍니다.

 

그러므로 2씩 증가시키려면 ADD [ebx+00000454],2 를 입력해주면 되겠죠?

어셈블리어 기본적인 명령어 더 알고싶으면

 

[AssemBly] 기본적인 명령어

* PUSH: SP 레지스터를 조작하는 명령어 중의 하나로 스택에 데이터를 저장한다.push​push eax ; ea...

blog.naver.com

2을 추가했으니 그러면 2씩 추가 되겠죠? Yes 클릭합시다

코드삽입이 가능합니다. 진짜 삽입하시겠습니까?

OK 누르고나서 Auto Aessem ble 창은 닫지마세요!

분명 99가 됐는데 왜 다시 100으로 돌아왔을까요!

+2을 추가했다면 감소 시키는 명령어는 그대로입니다.

즉 -1 +2 =+1 이 되겠죠

TIP - //는 한줄 주석입니다. (// 뒤에있는 명령어를 인식하지 말라는 뜻입니다. 대부분 C언어 자바등에서도 많이 쓰입니다.)

그리고나서 [Execute] 클릭합니다

넥스트 버튼이 활성화 됐습니다.

코드 인젝션을 배웠는데 많이 어렵고 신기하고 재미있을껍니다.

이 부분에서 더욱더 유용하게 사용할려면 어셈블리언어를 알아야합니다.

 

posted by 핵커 커뮤니티
:
Cheat Engine 2020. 4. 10. 16:00

여기서 부터는 조금 힘들거나 헷갈릴수 있습니다. (약간 머리아픔)

 

하나는 Change value, 또다른 하나는 Change pointer입니다.

Change value는 값만을 바꿔주고 Change pointer는 3초후에 값뿐만 아니라 주소도 바꿔줍니다.

우선 Change value만 사용해 값의 주소를 찾아주세요, 밸류타입은 4byte입니다.

매우쉽게 찾았습니다. 주소는 017977A8 이군요.

치트테이블로 보낸후 오른클릭, Find out what writes to this address를 클릭해줍니다.

튜토리얼의 Change value를 클릭해주세요.

그러면 새창의 목록 새로운 항목이 생깁니다...

저것에 대한 더 자세한정보를 봐야합니다. 더블클릭하거나 한번클릭후 More info를 클릭해주세요

상세정보가 떴습니다. mov [edx],eax라고 써있습니다.

 

eax의 값을 edx가 가리키는 주소로 복사하라는 어셈블리 명령어입니다. 쉽게 말하면 "edx가 가리키는 값 = eax"라는 뜻.

 

Change pointer를 클릭할때마다 eax가 변하기때문에 치트테이블에 등록해둔 값도 변하게됩니다.

 

우선 이 창은 닫지않고 그대로 둘 수 있습니다.

 

만약 닫을거라면 [] 안에 있는 주소를 기억해둡시다. 아래에 네모칸에 써있네요.

 

제경우는 [edx]니까 edx주소인 "017997A8"을 기억해 두겠습니다.

 

※ 어셈블리언어를 더 알고싶은 분들은 참고 해주시면 되겠습니다. 메모장으로 기초적인 간단하게 정리 했으니 참고바랍니다.!

 

어셈블리(assembly) 기초 강좌 메모장 TXT

어셈블리 강의 메모장입니다.

blog.naver.com

아까 기억한 주소 있죠? edx = 017977A8.

 

꼭 HEX에 체크를 하신후 주소를 입력해주세요. 그리고 스캔을하면 결과가 나옵니다.

 

저는 두개가나왔네요, 지금 찾아야 하는건 포인터입니다.

 

그럼 둘중에 뭐가 포인터일까요? 정답은 바로 녹색으로 써있는것.

 

포인터는 녹색으로 표시하자는게 치트엔진의 약속이라고 생각했는데 그게아니네요.

 

TIP - 기준주소가 정적인 주소일때 녹색으로 보여준다네요.

Add Address Manually를 클릭해주세요. 수동으로 주소를 추가한다는 메뉴입니다. 새창이 뜨네요.

우리가 추가하려는것은 일반적인 주소가 아닌 포인터의 주소입니다.

새창의 Pointer칸에 체크를 하고, Address of pointer에 포인터의 주소를 입력해줍니다.

제경우에는 0057C370 이네요.

Offset에는 0을 적어주시면 됩니다.

설명을 보니 가끔 복잡한 경우에는 Offset도 계산해서 구해내야 한다는데,

전 아무리 재실행해도 쉽게만 나오네요;; 도저히 스크린샷을 찍을수가 없습니다.

그냥 0적어주세요 오프셋은.

입력을 했더니 This pointer points to address에 뭔가가 적혀있네요.

017977A8? 이게 뭘까요.

정답은 포인터가 가리키는 주소입니다.

치트테이블을 보면 값의 주소가 017977A8로 포인터가 가리키는 주소와 일치한다는걸 확인 가능합니다.

드디어 포인터를 확실하게 찾았네요. OK를 클릭해서 치트테이블에 포인터를 추가해주세요

목록에 포인터를 추가했습니다. 주소가 P->017977A8 인걸보아 확실해졌습니다.

값을 5000으로 바꾸고 Active에 체크를 합니다.

옛날버전에는 freeze라고 써있었는데 최신버전인 6.1버전은 active로 바뀌었네요.

active에 체크를할시 값이 강제로 고정됩니다. 체크를안하면 자꾸만 5000이 아닌 다른값으로 변합니다.

 active기능 사용 예로는 게임에서 총알값을 찾아냈을때 freeze에 체크하면,

쏠때 총알수가 29개가되자마자 30개으로 돌아가고 29개 됬다가 바로 30개로 돌아가고 이럽니다.

한마디로 무한총알인거죠. 값을 10000발 이렇게 바꿀필요가 없어집니다.

역시 포인터값을 바꿨더니 값도 따라서 5000으로 바뀌어 버리는군요.

튜토리얼에서 Change pointer를 클릭시 정상대로라면 3초후 포인터가 값과 주소를 명령어대로 바꿉니다.

하지만 우리가 명령어를 따르는 대신 값을 5000으로 바꾸도록 해킹 해주었고 그 값을 고정시켜주었습니다.

그러므로 Change pointer를 클릭시 3초후 값이 5000으로 될겁니다!

3...2....1초 지나고 나니 넥스트 버튼이 활성화 됐습니다!

이 구간에서는 약간 머리가 다소 아플껍니다. 아무것도 모르는상태라 더욱더 머리가 아픕니다!

하지만 포인터로 이용하여 그 값을 따고 이렇게 무사히 클리어 했네요

궁금한점,안되는부분 있다면 댓글로 남겨주시면 답변해드리겠습니다.

비밋댓글로도 환영하니 부담없이 질문주세요~

posted by 핵커 커뮤니티
: