object Form9: TForm9
  Left = 437
  Top = 446
  BorderStyle = bsDialog
  Caption = 'Step 8'
  ClientHeight = 250
  ClientWidth = 571
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poOwnerFormCenter
  Visible = True
  OnClose = FormClose
  OnCloseQuery = FormCloseQuery
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 216
    Width = 18
    Height = 13
    Caption = '100'
  end
  object Label2: TLabel
    Left = 96
    Top = 215
    Width = 6
    Height = 13
    Caption = '3'
    Visible = False
  end
  object Memo1: TMemo
    Left = 0
    Top = 0
    Width = 571
    Height = 185
    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 (like this) it is recommended to chan' +
        'ge ce'#39's codefinder 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. This doesn'#39't al' +
        'ways happen, but can be really usefull in finding a '
      'pointer when debuggng is troublesome')
    ReadOnly = True
    ScrollBars = ssVertical
    TabOrder = 0
  end
  object Button2: TButton
    Left = 248
    Top = 192
    Width = 75
    Height = 25
    Caption = 'Next'
    Enabled = False
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button1: TButton
    Left = 8
    Top = 228
    Width = 81
    Height = 19
    Caption = 'Change value'
    TabOrder = 2
    OnClick = Button1Click
  end
  object Button3: TButton
    Left = 93
    Top = 228
    Width = 81
    Height = 19
    Caption = 'Change pointer'
    TabOrder = 3
    OnClick = Button3Click
  end
end
