mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
142 lines
4.1 KiB
Text
142 lines
4.1 KiB
Text
object Form9: TForm9
|
|
Left = 411
|
|
Top = 229
|
|
BorderStyle = bsDialog
|
|
Caption = 'Step 8'
|
|
ClientHeight = 308
|
|
ClientWidth = 703
|
|
Color = clBtnFace
|
|
Font.Charset = DEFAULT_CHARSET
|
|
Font.Color = clWindowText
|
|
Font.Height = -14
|
|
Font.Name = 'MS Sans Serif'
|
|
Font.Style = []
|
|
OldCreateOrder = False
|
|
Position = poOwnerFormCenter
|
|
Visible = True
|
|
OnClose = FormClose
|
|
OnCloseQuery = FormCloseQuery
|
|
OnCreate = FormCreate
|
|
PixelsPerInch = 120
|
|
TextHeight = 16
|
|
object Label1: TLabel
|
|
Left = 10
|
|
Top = 266
|
|
Width = 21
|
|
Height = 16
|
|
Caption = '100'
|
|
end
|
|
object Label2: TLabel
|
|
Left = 118
|
|
Top = 265
|
|
Width = 7
|
|
Height = 16
|
|
Caption = '3'
|
|
Visible = False
|
|
end
|
|
object SpeedButton1: TSpeedButton
|
|
Left = 670
|
|
Top = 286
|
|
Width = 30
|
|
Height = 20
|
|
Caption = 'Skip'
|
|
Flat = True
|
|
OnClick = SpeedButton1Click
|
|
end
|
|
object Memo1: TMemo
|
|
Left = 0
|
|
Top = 0
|
|
Width = 703
|
|
Height = 228
|
|
Align = alTop
|
|
Color = clBtnFace
|
|
Lines.Strings = (
|
|
'This step will explain how to use multi-level pointers.'
|
|
|
|
'In step 6 you had a simple level-1 pointer, with the first addre' +
|
|
'ss found already being the real base address.'
|
|
|
|
'This step however is a level-4 pointer. It has a pointer to a po' +
|
|
'inter to a pointer to a pointer to a pointer to the health.'
|
|
''
|
|
|
|
'You basicly do the same as in step 6. Find out what accesses the' +
|
|
' value, look at the instruction and what probably is '
|
|
|
|
'the base pointer value, and what is the offset, and already fill' +
|
|
' that in or write it down. But in this case the address '
|
|
|
|
'you'#39'll find will also be a pointer. You just have to find out th' +
|
|
'e pointer to that pointer exactly the same way as you did '
|
|
|
|
'with the value. Find out what accesses that address you found, l' +
|
|
'ook at the assembler instruction, note the probable '
|
|
'instruction and offset, and use that.'
|
|
|
|
'and continue till you can'#39't get any further (usually when the ba' +
|
|
'se address is a static address, shown up as green)'
|
|
''
|
|
'Click Change Value to let the tutorial access the health.'
|
|
|
|
'If you think you'#39've found the pointer path click Change Register' +
|
|
'. The pointers and value will then change and you'#39'll '
|
|
'have 3 seconds to freeze the address to 5000'
|
|
''
|
|
|
|
'Extra: This problem can also be solved using a auto assembler sc' +
|
|
'ript, or using the pointer scanner'
|
|
|
|
'Extra2: In some situations it is recommended to change ce'#39's code' +
|
|
'finder settings to Access violations when '
|
|
|
|
'encountering instructions like mov eax,[eax] since debugregister' +
|
|
's show it AFTER it was changed, making it hard to '
|
|
'find out the the value of the pointer'
|
|
''
|
|
''
|
|
''
|
|
''
|
|
''
|
|
|
|
'Extra3: If you'#39're still reading. You might notice that when look' +
|
|
'ing at the assembler instructions that the pointer is '
|
|
|
|
'being read and filled out in the same codeblock (same routine, i' +
|
|
'f you know assembler, look up till the start of the '
|
|
|
|
'routine). This doesn'#39't always happen, but can be really useful i' +
|
|
'n finding a '
|
|
'pointer when debugging is troublesome')
|
|
ReadOnly = True
|
|
ScrollBars = ssVertical
|
|
TabOrder = 0
|
|
end
|
|
object Button2: TButton
|
|
Left = 305
|
|
Top = 236
|
|
Width = 93
|
|
Height = 31
|
|
Caption = 'Next'
|
|
Enabled = False
|
|
TabOrder = 1
|
|
OnClick = Button2Click
|
|
end
|
|
object Button1: TButton
|
|
Left = 10
|
|
Top = 281
|
|
Width = 100
|
|
Height = 23
|
|
Caption = 'Change value'
|
|
TabOrder = 2
|
|
OnClick = Button1Click
|
|
end
|
|
object Button3: TButton
|
|
Left = 114
|
|
Top = 281
|
|
Width = 100
|
|
Height = 23
|
|
Caption = 'Change pointer'
|
|
TabOrder = 3
|
|
OnClick = Button3Click
|
|
end
|
|
end
|