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

Post Reply 
Threaded Mode | Linear Mode
Программирование ВОГ
Author Message
Berserker Offline
Administrators

Posts: 16657
Post: #31

Quote:пишет
Он писал, что не программист и даже DLL не создавал. Так что в данном случае "пишет" = максимум ознакомиться с синтаксисом языка и что-то простое вроде hello world.

Каркас аналога на СИ++ нужно попросить Сержа написать.


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

Posts: 197
Post: #32

ну, хело ворлд эт канешн.. )))). Я по образованию и профессии - не ИТэшник. А вот по самообразованию и призванию - программер. Программированием увлекаюсь с 6-го класса школы. Были времена, когда я полностью забивал на прграммирование, но совсем избавиться от этого увлечения не могу, как ни стараюсь Sm

Я могу не знать чего-то (что можно найти в справочной литературе), но вот с навыками то у меня все более чем в порядке, а ведь это самое главное! так ведь?

так что я пишу, пишу на С#, C++ в MS VS,
когда-то давно еще писал на VB6 и VB.NET. Ну и со школы паскаль помню, так что примера SAG'a достаточно, прочитать смогу. Спасибо!

Я конечно и сам разобраться во всем могу, но ведь с вашей помощью то намного быстрее и легче!Большое всем спасибо!
(This post was last modified: 26.02.2010 20:27 by baratorch.)
26.02.2010 20:24
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #33

Quote:Каркас аналога на СИ++ нужно попросить Сержа написать.
Когда (если?) доперепишу - выложу простенький пример на С.
26.02.2010 20:26
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #34

Я было удивился, как "не ИТ-шник" так рьяно вошёл в сферу модинга 132
Вчера разговаривал с Дьяком по поводу встраивания нового города. Посоветовал патчить ехе после вога из DLL, чтобы гарантированно быть совместимым с другими проектами. Правда, ему придётся коренным образом многое переписать, не знаю, пойдёт ли на это.


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

Posts: 7
Post: #35

Мне в своё время помогли статьи на wasm.ru
http://wasm.ru/article.php?article=pemodify (Модификация исполняемых PE-файлов)
http://wasm.ru/series.php?sid=17 («Введение в крэкинг с нуля, используя OllyDbg»)
по первой ссылки вроде как раз то что надо.
26.02.2010 20:30
Find all posts by this user Quote this message in a reply
asm Offline

Posts: 29
Post: #36

baratorch, готов помочь во встраивании функционала в игру. У меня есть опыт написания большой ДЛЛ
http://www.heroeswt.net/features.php

В своё время обучал САГа этому делу с помощью скайпа и РАдмина, достаточно продуктивно.

В свою очередь есть ряд пожеланий по функционалу: хочу что потом можно было не сложно интегрировать в мой мод. И по этому поводу есть идеи как сделать универсально.

Моя аська 343-425-087
27.02.2010 00:12
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #37

Sample.rar
Cтавится хук на подсказки в окне юнита.

Code:
#include "main.h"

#include <windows.h>
#include <stdio.h>

#define OPCODE_JUMP 0xE9
#define OPCODE_CALL 0xE8
#define OPCODE_NOP 0x90

#define HOOKTYPE_JUMP 0
#define HOOKTYPE_CALL 1

#define HOOK_SIZE 5


inline void NopMem(void *mem, int size)
{
    memset((void*)mem,OPCODE_NOP,size);
}

inline void WriteHook( void *pOriginal, void *pNew, char type )
{
    *(byte*)pOriginal = (type==HOOKTYPE_JUMP)?OPCODE_JUMP:OPCODE_CALL;
    *(void**)( (byte*)pOriginal + 1 ) = (void*)( (byte*)pNew - (byte*)pOriginal - HOOK_SIZE );
}

#define MSG_OK 1
#define MSG_YES_NO 2
#define MSG_RIGHT_CLICK 4


__fastcall int (*ShowMSG)(const char *text, int type, int f1, int f2, int f3, int f4, int f5, int f6, int f7, int f8, int f9, int f10) =
      (__fastcall int (*)(const char*, int, int, int, int, int, int, int, int, int, int, int))(0x4F6C00);

__cdecl void  (*CallERM)(int num) =
        (__cdecl void(*)(int))(0x74CE30);

#define URMB_NAME_AREA           0x0D
#define URMB_DEFENCE_AREA        0x95
#define URMB_ATTACK_AREA         0x97
#define URMB_DAMAGE_AREA         0x78
#define URMB_SHOTS_AREA          0x7B
#define URMB_HP_AREA             0x6B
#define URMB_CURRHP_AREA         0x29
#define URMB_SPEED_AREA          0x5A
#define URMB_EFFECTS_AREA        0x3D //действующие заклятья
#define URMB_DISMISS_AREA        0x39 //кнопка "Уволить"
#define URMB_OK_AREA             0x72 //кнопка "Ок"
#define URMB_UPGRADE_AREA        0x30 //стрелки апгрейда
#define URMB_MAGIC_AREA          0x14 //кнопка каста у волшебных драконов
#define URMB_NUMBER_AREA         0x23 //количество существ в стеке


BOOL NewMsg(unsigned char type, int unit)
{
    char buf[200];
    if(type==URMB_NAME_AREA)
    {
        sprintf(buf,"%02X %i", type, unit);
        ShowMSG(buf,MSG_RIGHT_CLICK,-1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
        return true;
    }

    if(type==URMB_MAGIC_AREA)
    {
        ShowMSG("Колдовать/атаковать",MSG_RIGHT_CLICK,-1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
        return true;
    }

    if(type==URMB_EFFECTS_AREA)
    {
        CallERM(4001);
        return true;
    }
   return false;
}


__fastcall int hook_5F4E84(const char *text, int type, int f1, int f2, int f3, int f4, int f5, int f6, int f7, int f8, int f9, int f10)
{

    register void *eax asm("eax");
    register void *ebx asm("ebx");
    unsigned char unit = ((char*)ebx)[0x60];

    if(NewMsg((int)eax,unit))
       return 0;
    else
       return ShowMSG(text, type, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10);
}




extern "C" __stdcall BOOL DllMain( HINSTANCE hInstanceDLL, DWORD Reason, void *pReserved )
{
    switch (Reason)
    {
        case DLL_PROCESS_ATTACH:
        {
        WriteHook((void*)0x5F4E84,(void*)hook_5F4E84,HOOKTYPE_CALL);
        } break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
(This post was last modified: 27.02.2010 15:53 by feanor.)
27.02.2010 15:36
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #38

asm, feanor, спасибо, я уже разобрался. Уже начал переписывать свой патч в длл.

Разбирался.. - воткнул вызов LoadLibrary в WinMain героев, а где он воткнут в Эре? в WT?

asm, аськой я принципиально не пользуюсь, мой ник в скайпе такой же как здесь.
27.02.2010 20:43
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #39

Quote:а где он воткнут в Эре?
Немного далее OEP вога. За 701000. Сама DLL выполняет после инициализации затёртый код.


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

Posts: 197
Post: #40

спасибо.

вопрос тут возник.

вот в примере SAGa функция WriteAtCode использует VirtualProtect для того чтобы разрешить запись именно в те байты памяти, которые меняются, а потом восстанавливает к ним иходный доступ.

А если мой патч вызывает например миллион этих WriteAtCode.... не лучше ли сделать один вызов VirtualProtect для разрешения записи в весь геройский код, потом миллион патчей, и затем один VirtualProtect для восстаовления исходного доступа к всему геройскому коду.
Можно так? Что будет быстрее (рациональнее для машины) работать?
Что думаете?
27.02.2010 22:10
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #41

Так было бы оптимально. Один вызов на несколько патчей.
(This post was last modified: 27.02.2010 23:43 by etoprostoya.)
27.02.2010 22:21
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #42

Я предпочитаю корректность. Но если все страницы патчинга имеют одни атрибуты, то почему бы и нет.


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

Posts: 29
Post: #43

а можно вообще не протектить, т.к. в тот момент когда ты изменяешь, не думаю что др. потоки читают.
А в целом более корректно заблочить всё, как в БД - 1 транзакция на все изменения.
27.02.2010 22:43
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #44

Асм, ты про что? Не нужно ничего блочить и потоки ни на что не влияют.


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

Posts: 1809
Post: #45

Ну разве что антивирус (как поток) иль ещё кто захочет проверить что там за экзешник патчится.
27.02.2010 23:41
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