Current time: 09.05.2024, 10:51 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
patcher_x86.dll
» версия 2.8
Author Message
baratorch Offline

Posts: 197
Post: #62

Bers, продолжим здесь.

baratorch Wrote:
Berserker Wrote:На мой взгляд, указанная тобой, Бара, проверка, неэффективна. Мало ли из какого кода какого модуля вызывается запись патча? Из ЕРМ? Из сгенерированного в оперативной памяти обработчика? Из модуля, который использует функционал другого?

Patcher := Core.GlobalPatcher.CreateInstance(pchar(GetUniquePatchName(BinPatchSource)));
Я создавал по экземпляру патчера для каждого файла-заплатки под уникальным именем и тут же пробовал через этот объект вносить изменения в цикле:
Patcher.Write(cardinal(Patch.Addr), cardinal(@Patch.Bytes), Patch.NumBytes, CODE_PATCH);
В итоге ошибки и, как следствие, вылеты.
Берс, я хочу чтобы у тебя там все работало с патчером.
Но что ты предлагаешь, убрать эту проверку совсем?
Мне это сделать не сложно. Я задавал вопросы, чтобы понять, можно ли решить твою проблему не трогая патчер, но ситуацию ты не прояснил.

Я пока не представляю себе случая когда модулю нужно создать патчер_инстанс, но не писать патч, а модулю не создававшему использовать чужой патчер_инстанс чтобы создавать патч; и чтобы требуемую задачу нелзя было полностью решить с помощью того что есть сейчас.
Покажи мне конкретный пример (из твоих слов о цикле и заплатках мне ничего не понятно).

Если убрать эту проверку, то (как мне кажется) теряется вообще смысл в классе PatcherInstance. И как тогда отслеживать авторов патчей в логе и дампе (одна из важнейших фич патчера), если автором патча может быть кто угодно, вместо обозначенного?


Quote:Patcher := Core.GlobalPatcher.CreateInstance(pchar(GetUniquePatchName(BinPatchSource)));
Я создавал по экземпляру патчера для каждого файла-заплатки под уникальным именем и тут же пробовал через этот объект вносить изменения в цикле:
Patcher.Write(cardinal(Patch.Addr), cardinal(@Patch.Bytes), Patch.NumBytes, CODE_PATCH);
Вот я написанное понимаю так, что и инстанция и патч через эту инстанцию создаются в одном куске кода, т.е. без вариантов в одном модуле (pe-файле... dll/exe).
Поэтому та проверка (на идейном плане), считаю, не может быть помехой (разве что в ее реализации косяки).

вот код из ХД:

Code:
void LoadBinPatch(char* file_name)
{
    DWORD fr;
    _dword_ patches_count = 0;
    _dword_ patch_size = 0;
    _byte_ patch_data[2048];
    _ptr_ address = 0;
    HANDLE hFile = INVALID_HANDLE_VALUE;
    hFile = CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        PatcherInstance* _PIbin = _P->CreateInstance(Base::GetShortFileName(file_name));
        SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
        if (ReadFile(hFile, (LPVOID)&patches_count, 4, &fr,  NULL))
            for (int i = 0; i < patches_count; i++)
                if (ReadFile(hFile, (LPVOID)&address, 4, &fr,  NULL))
                    if (ReadFile(hFile, (LPVOID)&patch_size, 4, &fr,  NULL))
                    {
                        if (patch_size > 2048) BREAKPOINT;
                        if (ReadFile(hFile, (LPVOID)&patch_data, patch_size, &fr,  NULL))
                        {
                            _PIbin->Write(address, (_ptr_)patch_data, patch_size);
                        }
                        
                    }
        CloseHandle(hFile);
    }
}

...

void LoadBinPatches(char* dir)
{
    WIN32_FIND_DATA file_find_data;
    HANDLE h_search;
    BOOL finished = FALSE;

    Base::dir_set(dir);
    h_search = FindFirstFile("*.bin", &file_find_data);
    if (h_search == INVALID_HANDLE_VALUE)
    {
        Base::dir_restore();
        return;
    }

    while (!finished)
    {
        //////////////////////////////////////
        LoadBinPatch(file_find_data.cFileName);
        //////////////////////////////////////

        if (!FindNextFile(h_search, &file_find_data))
            if (GetLastError() == ERROR_NO_MORE_FILES)
                finished = TRUE;
            else
            {
                FindClose(h_search);
                Base::dir_restore();
                return;
            }
    }

    FindClose(h_search);
    Base::dir_restore();
}

в цикле вызывается создание инстанций для каждой заплатки и запись патча этой заплатки через созданную инстанцию.
по-моему то же самое. все работает.

...

Я понял в чем дело.

Нужно заменить

Patcher.Write(cardinal(Patch.Addr), cardinal(@Patch.Bytes), Patch.NumBytes, CODE_PATCH);

на

Patcher.Write(cardinal(Patch.Addr), cardinal(@Patch.Bytes), Patch.NumBytes, DATA_PATCH);

Это не очевидно, но я объясню почему.

Я понимаю что, практически все сочиняемые пачти подразумевают содержание кода. Однако CODE_PATCH в Методе Write
означает не то что 'мы пишем код', а то что данные по адресу @Patch.Bytes будут восприниматься как код.

Возмем пример из ченджлога к патчеру 2.5.
Допустим мы хотим поставить патч 0x639C40: call 0x447799.
В бин-файле это будет записано в прямом виде:
   0x639C40, 5, E8 54 DB E0 FF
после считывания в Patch.Bytes будет E8 54 DB E0 FF
но ведь @Patch.Bytes не равен 0x639C40!!!
а значит если мы подразумеваем что по адресу @Patch.Bytes код, а не данные, то E8 54 DB E0 FF будет вызывать не 0x447799, а функцию заданную адресом относительным к @Patch.Bytes.
Ну вот представь, что мы процессору передали на выполнение адрес @Patch.Bytes: будет вызвана функция не 0x447799, а совершенно левая.

***

Еще раз повторю вопрос: что выдает лог патчера?

создаем рядом с patcher_x86.dll - patcher_x86.ini c записью Logging = 1
и после установки всех патчей вызываем Patcher::SaveLog(char* file_name).

если в логе отсутствуют записи
ERROR! Can not create ... at ... (...): Wrong Patcher Instance!
то проверка на верный модуль ни при чем, а дело в CODE_PATCH

жду ответа.
03.11.2014 02:49
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Messages In This Thread
patcher_x86.dll - baratorch - 11.02.2012, 13:20
RE: patcher_x86.dll - Berserker - 11.02.2012, 15:48
RE: patcher_x86.dll - kostya_76 - 11.02.2012, 22:59
RE: patcher_x86.dll - baratorch - 13.02.2012, 18:42
RE: patcher_x86.dll - kostya_76 - 13.02.2012, 21:42
RE: patcher_x86.dll - Berserker - 13.02.2012, 20:09
RE: patcher_x86.dll - baratorch - 13.02.2012, 21:36
RE: patcher_x86.dll - Berserker - 13.02.2012, 22:04
RE: patcher_x86.dll - baratorch - 13.02.2012, 22:56
RE: patcher_x86.dll - Berserker - 13.02.2012, 23:25
RE: patcher_x86.dll - baratorch - 15.02.2012, 13:53
RE: patcher_x86.dll - baratorch - 17.02.2012, 02:15
RE: patcher_x86.dll - baratorch - 20.02.2012, 08:49
RE: patcher_x86.dll - baratorch - 28.02.2012, 09:38
RE: patcher_x86.dll - Sav - 18.03.2012, 19:04
RE: patcher_x86.dll - Sav - 24.03.2012, 23:36
RE: patcher_x86.dll - gamecreator - 25.03.2012, 01:37
RE: patcher_x86.dll - Sav - 25.03.2012, 09:10
RE: patcher_x86.dll - baratorch - 26.03.2012, 09:14
RE: patcher_x86.dll - baratorch - 04.04.2012, 14:17
RE: patcher_x86.dll - Berserker - 04.04.2012, 19:33
RE: patcher_x86.dll - baratorch - 25.06.2012, 08:23
RE: patcher_x86.dll - baratorch - 27.07.2012, 09:43
RE: patcher_x86.dll - Berserker - 27.07.2012, 14:04
RE: patcher_x86.dll - baratorch - 27.07.2012, 17:30
RE: patcher_x86.dll - Berserker - 27.07.2012, 19:18
RE: patcher_x86.dll - baratorch - 24.09.2012, 17:36
RE: patcher_x86.dll - baratorch - 21.11.2012, 06:37
RE: patcher_x86.dll - Berserker - 21.11.2012, 13:38
RE: patcher_x86.dll - Berserker - 01.01.2013, 22:27
RE: patcher_x86.dll - gamecreator - 01.01.2013, 23:00
RE: patcher_x86.dll - Berserker - 04.01.2013, 21:51
RE: patcher_x86.dll - Sav - 04.01.2013, 22:01
RE: patcher_x86.dll - Berserker - 04.01.2013, 22:43
RE: patcher_x86.dll - Berserker - 05.01.2013, 00:05
RE: patcher_x86.dll - hippocamus - 09.01.2013, 12:59
RE: patcher_x86.dll - Berserker - 06.01.2013, 03:10
RE: patcher_x86.dll - Berserker - 09.01.2013, 18:11
RE: patcher_x86.dll - Berserker - 28.06.2013, 14:16
RE: patcher_x86.dll - Berserker - 28.06.2013, 15:21
RE: patcher_x86.dll - Berserker - 02.07.2013, 19:50
RE: patcher_x86.dll - baratorch - 16.08.2013, 09:06
RE: patcher_x86.dll - Sav - 22.08.2013, 21:02
RE: patcher_x86.dll - Berserker - 05.09.2013, 21:11
RE: patcher_x86.dll - Berserker - 25.09.2013, 19:27
RE: patcher_x86.dll - Berserker - 26.09.2013, 18:44
RE: patcher_x86.dll - Berserker - 10.10.2013, 19:43
RE: patcher_x86.dll - baratorch - 24.10.2013, 21:32
RE: patcher_x86.dll - Berserker - 24.10.2013, 22:38
RE: patcher_x86.dll - baratorch - 25.10.2013, 08:11
RE: patcher_x86.dll - Berserker - 25.10.2013, 17:42
RE: patcher_x86.dll - baratorch - 25.10.2013, 20:20
RE: patcher_x86.dll - Berserker - 25.10.2013, 22:04
RE: patcher_x86.dll - baratorch - 26.10.2013, 21:47
RE: patcher_x86.dll - Berserker - 26.10.2013, 22:12
RE: patcher_x86.dll - baratorch - 28.10.2013, 12:46
RE: patcher_x86.dll - baratorch - 03.12.2013, 16:39
RE: patcher_x86.dll - Berserker - 03.12.2013, 19:21
RE: patcher_x86.dll - Arseniy - 31.03.2014, 12:28
RE: patcher_x86.dll - Berserker - 31.03.2014, 21:39
RE: patcher_x86.dll - baratorch - 03.11.2014, 02:19
RE: patcher_x86.dll - baratorch - 03.11.2014 02:49
RE: patcher_x86.dll - Berserker - 03.11.2014, 20:14
RE: patcher_x86.dll - Berserker - 03.11.2014, 20:21
RE: patcher_x86.dll - baratorch - 03.11.2014, 20:22
RE: patcher_x86.dll - Berserker - 03.11.2014, 22:18
RE: patcher_x86.dll - baratorch - 07.11.2014, 16:12
RE: patcher_x86.dll - baratorch - 21.08.2015, 11:25
RE: patcher_x86.dll - Bes - 10.09.2015, 20:04
RE: patcher_x86.dll - gamecreator - 11.09.2015, 00:57

Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group