Current time: 25.11.2024, 18:48 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Исследование героев
» туториал(ы)
Author Message
Sav Offline

Posts: 2180
Post: #211

Без проблем.

Ошибка по адресу 0x004417A4 (MOV EAX, [ESI+34h]) - попытка прочесть память по адресу 34h.
Ещё - отклонение, вызвавшее, скорее всего, эту ошибку - неправильная работа функции sub_5242E0, вызванной по адресу 0x00440064. Там идёт работа со стеком напрямую и извлекается неверное значение (по адресу 0x0052430F (MOV EBX, [EBP+arg_0]; arg_0 = 8])).

Но фишка-то в том, что всё это только при отладке. Просто в игре ничего такого нет.

P.S. Без включенного режима немодифицируемости (отключить - 32-й бит переменной v9501 = 1) ошибка будет в любом случае (правда, разная в игре и отладчике), но с этим я как-нибудь сам разберусь.
(This post was last modified: 14.11.2010 23:33 by Sav.)
14.11.2010 23:25
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #212

@@Exit:
    TEST ECX, EAX//Восстанавливаем испорченную команду.
    PUSH $440057

Духи говорят, что чего-то здесь не хватает.


Страус труп (с) Бьерн
15.11.2010 00:08
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #213

А чего именно, они не говорят?
15.11.2010 00:13
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #214

Говорят ))))

00440052 |. 8B4D 08 |MOV ECX,DWORD PTR SS:[ARG.1]


Страус труп (с) Бьерн
15.11.2010 00:15
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #215

...
    JNZ @@Modify

    //Восстановление изначального кода: получение всех позиций рядом, на которых кто-то стоит побитно (Запись в ECX).
    MOV ECX, [EBP+8]
    JMP @@Exit
   
    //Модифицирование кода: запись 0 (будто на всех клетках рядом кто-то стоит) в возвращаемый результат.
    @@Modify:
    MOV ECX, 0
   
    @@Exit:
...

Эта функция, для того и нужна, чтобы либо выполнить MOV ECX,DWORD PTR SS:[ARG.1], что, как я понял равно MOV ECX, [EBP+8], либо поместить в ECX 0.
В моём случае она всегда выполняет первое.
(This post was last modified: 15.11.2010 00:27 by Sav.)
15.11.2010 00:27
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #216

А данная проца тоже мутная

PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-}
ASM
    //Если 32-й бит в v9501 = 1, модифицируем.
    MOV EAX, DWORD PTR DS:[$890AD8]
    SHR EAX, 31
    TEST EAX, EAX
    JNZ @@Modify
   
    //Восстановление изначального кода: вызов функции, вычисляющей адрес конструкций для атакованного на определённой позиции (запись в EAX).
    MOV EAX, $4E7230
    CALL EAX
    JMP @@Exit
   
    //Модифицирование кода: проверка, надо ли атаковать текущий стек и запись адреса его конструкций или 0 в EAX.
    @@Modify:
    //Проверяем, какой стороне принадлежит проверяемый стек.
    CMP EBX, 21
    JAE @@Def_st
   
    //Если стек принадлежит атакующей стороне, помещаем в EAX соответствующий стеку бит из v9501.
    MOV EAX, DWORD PTR DS:[$890AD8]
    MOV CL, BL
    SHR EAX, CL
    JMP @@All_st
   
    //Если стек принадлежит защищающейся стороне, помещаем в EAX соответствующий стеку бит из v9502.
    @@Def_st:
    MOV EAX, DWORD PTR DS:[$890ADC]
    SUB EBX, 21
    MOV CL, BL
    SHR EAX, CL
    ADD EBX, 21

    //Оставляем в EAX 0 или помещаем в него адрес конструкций стека (в зависимости от начального значкния EAX, т. е. бита v-переменной).
    @@All_st:
    AND EAX, 1
    JZ @@Exit
    //EAX = $699420 + 1352*EBX + 21708.
    LEA ECX, DS:0[EBX*8]
    SUB ECX, EBX
    LEA EDX, [ECX+ECX*2]
    MOV ECX, DWORD PTR DS:[$699420]
    LEA EAX, [EBX+EDX*8]
    LEA EAX, [ECX+EAX*8+21708]
   
    @@Exit:
    PUSH $44009A
END;

Затирается вызов процедуры. Если переходим по JNZ @@Modify то там черт ногу сломит. Однозначно могу сказать только одно: если что-то не работает после твоего вмешательства, значит сам виноват. Проверяй код отладчиком.


Страус труп (с) Бьерн
15.11.2010 00:56
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #217

Всё, что в modify сейчас не важно (на самом деле там выполняестся часть затёртой функции, но номер стека берётся не от адреса инфы о гексе, а из EBX), там действительно, возможно, есть ошибки, но на данном этапе всегда выполняется то, что не modify.


Проблема в том, что если я запущу игру с этой dll-кой, то всё будет работать. А при отладке - выдавать ошибку.
Короче, попробую отлаживать в Olly.
15.11.2010 01:30
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #218

Без отладчика может работать, имея скрытые дефекты, нарушения целостности структур. А под отладчиком диапазон выделяемых адресов сдвигается и лажа даёт о себе знать.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
15.11.2010 02:57
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #219

Berserker Wrote:А под
отладчиком диапазон выделяемых адресов
сдвигается
Это как?
15.11.2010 11:24
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #220

BEGIN
    HookCode(POINTER($440052), @Damage_ability, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440064), @Damage_position, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440095), @Damage_stack, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440194), @Damage_target, C_HOOKTYPE_JUMP);
END.

Из всех врезок оставляй по одной и смотри при какой вылетает, а потом мудри.


Страус труп (с) Бьерн
15.11.2010 20:27
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #221

Да, это мне стоило сделать с самого начала.Sm
15.11.2010 22:03
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #222

Quote:Это как?
Отладчик выделяет память в процессе для своих нужд. Динамическую. То есть если без отладчика Angel.dll грузилась по адресу $3000000, то с отладчикаом запросто может по $300F000.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.11.2010 00:06
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #223

На участке кода:
Code:
.text:0044008E                 lea     ecx, [ecx+edx+1C4h]
.text:00440095                 call    sub_4E7230
.text:0044009A
.text:0044009A loc_44009A:
.text:0044009A
.text:0044009A                 mov     esi, eax
не должно меняться ESP.

Если же я делаю так:
то ESP послее выполнения выходит уменьшенным на 4. Почему?
21.11.2010 00:22
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #224

На вид всё корректно. В упор не вижу ошибки. Попробуй трассировать по шагам.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
21.11.2010 02:20
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #225

SHR EAX, 31
    TEST EAX, EAX
    JNZ @@Modify

=>
    TEST EAX, EAX
    JS @@Modify

А вообще, мне не нравится, когда в одной процедуре стоят PUSH'и без POP'ов. Зачем так сделали?
21.11.2010 12:16
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group