Перейти к содержанию

Конунг

Стажёры
  • Постов

    3
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Конунг

  1. Всем привет. Решил поиграть в поселенцев, но чита на эту версию игры не нашел. Есть табличка у зарубежных геймхакеров на версию игры 2.1, но она не работает на 2.0. Тогда решил попробовать взломать сам. Сразу оговорюсь, что я новичок в этом ремесле, поэтому многого не знаю. Моя задача была единственной - бессмертие для моих солдат. Нашел значение здоровья своих бойцов (не без труда) и оно было в byte. Нашел инструкции на доступ и запись.
    spacer.png
    Первая из них на запись, она же и еще две другие на доступ. Все они работают с адресами и врагов тоже. Когда нопишь первую, то бессмертными становятся все. Когда нопишь остальные две, то ничего не происходит, либо и враги, и мои солдаты убивают друг друга с одного удара. Что касается четвертой mov eax,ecx, то когда ее нопишь, то мои солдаты убивают вражеских с одного удара, а враги наносят обычный дамаг. Сам не знаю как это получилось. По крайней мере с OHK прошел все сюжетные кампании. Но моих солдат все равно убивали и мне все таки захотелось бессмертия, чтобы пройти остальные дополнительные сценарии в этой игре. К сожалению, ума не хватило написать скрипт. Во первых, не смог найти адреса для фильтра свой чужой. А те которые находил, все же менялись по ходу игры. Во вторых, не знаю как написать скрипт с регистром CL. На данный момент я сделал два скрипта которые включаются одновременно - OHK и HP (где оригинальный код в обоих случаях просто закомментирован). Тогда и здоровье не убавляется и благодаря OHK враги все же убиваются, не смотря на бессмертие и у них. Нужна помощь в написании скрипта хотя бы на бессмертие в грамотном виде. Мои скрипты работают, но сам понимаю, что это халтура. Вот и хотелось бы посмотреть пример правильного написания скрипта с пояснениями.
    spacer.png
    Как видно на скрине это то, что находится рядом с sub [edi+00525e73],cl (HP1). Тут же и movzx eax,byte ptr [edi+00525e73] (HP2) которая тоже получает доступ к адресу во время получения и нанесения урона.

    spacer.png
    Здесь третья инструкция, которая тоже получает доступ к тому же адресу здоровья моего солдата.
     

    Спойлер

    Скрипт на HP

    [ENABLE]
    aobscanmodule(HP,Siedler3R.exe,28 8F 73 5E 52 00) // should be unique
    alloc(newmem,$1000)

    label(code)
    label(return)

     

    newmem:
     

    code:
      //sub [edi+00525E73],cl
      jmp return

     

    HP:
      jmp newmem
      nop

    return:
    registersymbol(HP)

     

    [DISABLE]

    HP:
      db 28 8F 73 5E 52 00

    unregistersymbol(HP)
    dealloc(newmem)

    {


    // ORIGINAL CODE - INJECTION POINT: Siedler3R.exe+13DD75

    Siedler3R.exe+13DD51: 69 C0 48 01 00 00        - imul eax,eax,00000148
    Siedler3R.exe+13DD57: 83 BC 30 EC 43 41 00 02  - cmp dword ptr [eax+esi+004143EC],02
    Siedler3R.exe+13DD5F: 75 09                    - jne Siedler3R.exe+13DD6A
    Siedler3R.exe+13DD61: 8B C1                    - mov eax,ecx
    Siedler3R.exe+13DD63: D1 E8                    - shr eax,1
    Siedler3R.exe+13DD65: 01 C1                    - add ecx,eax
    Siedler3R.exe+13DD67: 89 4D F8                 - mov [ebp-08],ecx
    Siedler3R.exe+13DD6A: 0F B6 87 73 5E 52 00     - movzx eax,byte ptr [edi+00525E73]
    Siedler3R.exe+13DD71: 3B C1                    - cmp eax,ecx
    Siedler3R.exe+13DD73: 72 0B                    - jb Siedler3R.exe+13DD80
    // ---------- INJECTING HERE ----------
    Siedler3R.exe+13DD75: 28 8F 73 5E 52 00        - sub [edi+00525E73],cl
    // ---------- DONE INJECTING  ----------
    Siedler3R.exe+13DD7B: E9 DE 0A 00 00           - jmp Siedler3R.exe+13E85E
    Siedler3R.exe+13DD80: 0F B7 87 7E 5E 52 00     - movzx eax,word ptr [edi+00525E7E]
    Siedler3R.exe+13DD87: B9 AD 00 00 00           - mov ecx,000000AD
    Siedler3R.exe+13DD8C: 66 3B C1                 - cmp ax,cx
    Siedler3R.exe+13DD8F: 0F 84 A4 04 00 00        - je Siedler3R.exe+13E239
    Siedler3R.exe+13DD95: B9 AE 00 00 00           - mov ecx,000000AE
    Siedler3R.exe+13DD9A: 66 3B C1                 - cmp ax,cx
    Siedler3R.exe+13DD9D: 0F 84 96 04 00 00        - je Siedler3R.exe+13E239
    Siedler3R.exe+13DDA3: 83 F8 03                 - cmp eax,03
    Siedler3R.exe+13DDA6: 74 05                    - je Siedler3R.exe+13DDAD
    }

    Спойлер

    Скрипт на OHK

    [ENABLE]

    aobscanmodule(OHK,Siedler3R.exe,8B C1 D1 E8 01 C1) // should be unique
    alloc(newmem,$1000)

    label(code)
    label(return)
     

    newmem:
     

    code:
      //mov eax,ecx
      shr eax,1
      add ecx,eax
      jmp return
     

    OHK:
      jmp newmem
      nop

    return:
    registersymbol(OHK)
     

    [DISABLE]

    OHK:
      db 8B C1 D1 E8 01 C1

    unregistersymbol(OHK)
    dealloc(newmem)

    {
    // ORIGINAL CODE - INJECTION POINT: Siedler3R.exe+13DD61

    Siedler3R.exe+13DD2E: 8B 4D F8                             - mov ecx,[ebp-08]
    Siedler3R.exe+13DD31: 80 A7 84 5E 52 00 DF        - and byte ptr [edi+00525E84],-21
    Siedler3R.exe+13DD38: 83 3D A8 CD 36 01 00       - cmp dword ptr [Siedler3R.exe+CDCDA8],00
    Siedler3R.exe+13DD3F: 74 29                                   - je Siedler3R.exe+13DD6A
    Siedler3R.exe+13DD41: 80 3D 94 FB 39 01 00        - cmp byte ptr [Siedler3R.exe+D0FB94],00
    Siedler3R.exe+13DD48: 74 20                                   - je Siedler3R.exe+13DD6A
    Siedler3R.exe+13DD4A: 0F B6 87 70 5E 52 00        - movzx eax,byte ptr [edi+00525E70]
    Siedler3R.exe+13DD51: 69 C0 48 01 00 00              - imul eax,eax,00000148
    Siedler3R.exe+13DD57: 83 BC 30 EC 43 41 00 02  - cmp dword ptr [eax+esi+004143EC],02
    Siedler3R.exe+13DD5F: 75 09                                   - jne Siedler3R.exe+13DD6A
    // ---------- INJECTING HERE ----------
    Siedler3R.exe+13DD61: 8B C1                                   - mov eax,ecx
    // ---------- DONE INJECTING  ----------
    Siedler3R.exe+13DD63: D1 E8                                   - shr eax,1
    Siedler3R.exe+13DD65: 01 C1                                   - add ecx,eax
    Siedler3R.exe+13DD67: 89 4D F8                             - mov [ebp-08],ecx
    Siedler3R.exe+13DD6A: 0F B6 87 73 5E 52 00        - movzx eax,byte ptr [edi+00525E73]
    Siedler3R.exe+13DD71: 3B C1                                   - cmp eax,ecx
    Siedler3R.exe+13DD73: 72 0B                                   - jb Siedler3R.exe+13DD80
    Siedler3R.exe+13DD75: 28 8F 73 5E 52 00              - sub [edi+00525E73],cl
    Siedler3R.exe+13DD7B: E9 DE 0A 00 00                  - jmp Siedler3R.exe+13E85E
    Siedler3R.exe+13DD80: 0F B7 87 7E 5E 52 00        - movzx eax,word ptr [edi+00525E7E]
    Siedler3R.exe+13DD87: B9 AD 00 00 00                  - mov ecx,000000AD
    }


    В обоих случаях просто закомментировал оригинальные инструкции. Включаю оба сразу и все работает. Как уже ранее писал, хочется понять как грамотно написать один скрипт на бессмертие.

  2. 2 часа назад, Xipho сказал:

    Судя по твоему коду, ты не представляешь, что делаешь и зачем нопишь. Рекомендую почитать про инструкцию cmp, тогда станет понятно, что ты делаешь не так.

    Да, я новичок. Но суть в том, что когда ее в коде нопишь, значения у персонажей становится максимальными и не падают. Вот оригинальный код на всякий случай. Там стоят комментарии, где такой же скрипт нопами, делает максимальное значение параметров. А вот через newmem не получается. Мне кажется через него правильнее будет, чем через code. А про cmp прочитаю, спасибо за наводку.

    Спойлер

    00460115: 8B CE                              - mov ecx,esi
    00460117: E8 BE B2 FC FF             - call 0042B3DA
    0046011C: 3B D8                             - cmp ebx,eax  //Религия
    0046011E: 7D 02                              - jnl 00460122
    00460120: FF 07                               - inc [edi]
    00460122: 33 ED                              - xor ebp,ebp
    00460124: A1 EC 7B 4F 00             - mov eax,[004F7BEC]
    00460129: 8B C8                              - mov ecx,eax
    0046012B: D1 F9                              - sar ecx,1
    0046012D: 03 C1                             - add eax,ecx
    // ---------- INJECTING HERE ----------
    0046012F: 39 86 A8 0A 00 00       - cmp [esi+00000AA8],eax  //Энергия
    // ---------- DONE INJECTING  ----------
    00460135: 7E 06                             - jle 0046013D
    00460137: 89 86 A8 0A 00 00      - mov [esi+00000AA8],eax
    0046013D: A1 F0 7B 4F 00           - mov eax,[004F7BF0]
    00460142: 8B C8                            - mov ecx,eax
    00460144: D1 F9                            - sar ecx,1
    00460146: 03 C1                            - add eax,ecx
    00460148: 39 86 AC 0A 00 00     - cmp [esi+00000AAC],eax  //Стамина
    0046014E: 7E 06                            - jle 00460156
    00460150: 89 86 AC 0A 00 00     - mov [esi+00000AAC],eax
    00460156: A1 F4 7B 4F 00           - mov eax,[004F7BF4]

     

  3. Доброго времени суток. Хотелось бы узнать у экспертов, как занопить в newmem, если при добавлении нопов в newmem, значение продолжается меняться. Вот пример...но тут мне пришлось нопить сам код (тогда значение в игре не меняется). А через newmem это можно как то сделать? Закомментировал в code ту функцию, которую нужно занопить. 
     

    Спойлер

    [ENABLE]

    aobscanmodule(Energy,GameRus.exe,39 86 A8 0A 00 00) // should be unique
    alloc(newmem,$1000)
     

    label(code)
    label(return)
     

    newmem:
     

    code:
      db 90 90 90 90
      //cmp [esi+00000AA8],eax
      jmp return


    Energy:
      jmp newmem
      nop

    return:
    registersymbol(Energy)


    [DISABLE]


    Energy:
      db 39 86 A8 0A 00 00


    unregistersymbol(Energy)
    dealloc(newmem)

     

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.