IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Reply to this topicStart new topic
> Хуки на исполняемый код из ERA
feanor
сообщение 21 Dec 2014, 20:29 (Сообщение отредактировал feanor - 21 Dec 2014, 20:38)
Сообщение #1

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




http://wforum.heroes35.net/showthread.php?...=85765#pid85765
©Berserker
Цитата
ERM Hooker v1.0.0
Era plugin allows to easily install and remove code hooks which execute corresponding ERM handlers.
{code block address} => {erm function receiving the context}

API:
(*
ErmHandlerFunc receives two SN:X arguments: (Context pointer, ExecuteOverwrittenCode? = 1)
If you set ExecuteOverwrittenCode to 0, be sure to change context.RetAddr
Context structure (offsets in brackets):
: EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
: RetAddr (32)

Returns non-zero value on success. Fails if another hook is set at the same address.
*)
function SetHook (Addr: pointer; ErmHandlerFunc: integer): longbool; stdcall;
(*
Removes erm hook at specified address. Returns true if hook existed.
*)
function UnsetHook (Addr: pointer): longbool; stdcall;
(*
Prints list of hooks in "Debug\Era\erm hooks.txt"
*)
procedure PrintHooks; stdcall;

All hooks are automatically removed on the following events: new game start, game loading, game leaving (Era 2.55+).

Plugin supports both Era 2.46 and Era 2.55+. For 2.55+ it handles OnGenerateDebugInfoEvent (you can generate list of hooks by pressing F11) and OnGameLeave event.

Example of usage:
Цитата
!?FU102777;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5933074/102778; 0x5a8812

!?GM0;
!!FU102777:P;

!?PI;
!!FU102777:P;

!?FU102778;
!!IF:M^Hi from hook!^;



--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 17 Jan 2015, 10:03 (Сообщение отредактировал igrik - 12 Dec 2016, 21:49)
Сообщение #2

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




Можно также собрать небольшую базу хуков штоле:
thanks feanor
Код
4854731 [адрес хука]
   !?FU[номер функции];
   !!SN:X?y3/0;             // выполнять ли затёртые команды, говорим НЕТ
   !!VRy4:Sy3 +32;             // RetAddr (32)
   !!IF:Q1^Посетить?^;         // Вопрос
   !!UN&1:Cy4/4/4854918;     // Да
   !!UN&-1:Cy4/4/4854782;     // Нет
© Gavek
Код
4899236 [адрес хука]
   !?FU[номер функции];
   !!SN:X?y3/0;
   !!VRy4:Sy3 +32;
   !!IF:Q1^Посетить ли склеп?^;
   !!UN&1:Cy4/4/4899301; yes
   !!UN&-1:Cy4/4/4899429; no

thanks gamecreator
5090948[адрес хука]
Код
!?FU[номер функции];
   !!SN:X?y3/0;             // выполнять ли затёртые команды, говорим НЕТ
   !!VRy4:Sy3 +32;             // y4 указывает на адрес возврата, подменяем его
   !!UN:Cy4/4/5090961;         // адрес команды возврата

thanks Bes
можно эмулировать одетость почти любого арта на герое
Код
5084256 [адрес хука]
   !?FU[номер функции];
   !!SN:X?y2;                 // системный параметр хука
; получить номер арта
   !!VRy3:Sy2 +12;             // перейти к [ESP]
   !!UN:Cy3/4/?y4;             // прочитать содержимое [ESP]
   !!VRy5:Sy4 +8;             // перейти к [ESP +8]
   !!UN:Cy5/4/?y6;             // прочитать содержимое [ESP +8] (номер арта)
        
; получить номер героя
   !!VRy9:Sy2 +24;              // перейти к [ECX]
   !!UN:Cy9/4/?y10;          // прочитать содержимое [ECX]
   !!VRy11:Sy10 :1170 -63638;// получить номер героя
        
   *--------------------------------------------
; тут можно типо приодеть героя, даже если на нем нет этих артов
; для сравнения исхомых артов y6=[номер арта] y11=[номер героя]
   !!VRy20:S72; [установил свой арт, который типо одет на кукле]   тест на крыльях ангела
   !!VRy21:S52; [установил номер героя, на котором типо одет арт]  тест на октавии
   *--------------------------------------------
        
   !!if&y6=y20/y11=y21:;  условие сравнения артов
   !!SN:X?y2/0;            // получить первый параметр хука и запретить выполенние следующих за хуком внутриигровых команд
   !!VRy14:Sy2 +32;        // указывает на адрес возврата, подменяем его]
   !!UN:Cy14/4/5084351;    // адрес команды следующей за вызовом функции
   !!VRy19:Sy2 +28;        // перейти к [EAX]
   !!UN:Cy19/4/1;            // установить [EAX] равным 1, типо арт есть
   !!en:;

thanks feanor
Код
!?FU37100;
; Установка расширенных специалистов по монстрам
; 5137296 [адрес хука]
!!FU37101:P28/132/500/3/10/10/10/10;
!?FU37101;
; x1 - номер героя
; x2 - номер монстра
; x3 - здоровье
; x4 - скорость
; x5 - атака
; x6 - защита
; x7 - мин.урон
; x8 - макс.урон
!!SN:X?y1;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy2:Sy1 +24;             // перейти к [ECX]
!!UN:Cy2/4/?y3;             // прочитать содержимое [ECX]
!!VRy4:Sy3 +26;             // перейти к номеру героя [ECX +26]
!!UN:Cy4/4/?y5;             // узнать номер героя
!!FU&y5<>x1:E;              // если не нужный герой, то выход

!!VRy2:Sy1 +12;             // перейти к [ESP]                
!!UN:Cy2/4/?y3;             // прочитать содержимое [ESP]
!!VRy4:Sy3 +8;              // перейти к номеру монстра [ESP +8]
!!UN:Cy4/4/?y5;             // узнать номер монстра
!!FU&y5<>x2:E;              // если не нужный монстр, то выход

!!VRy5:Sy3 +12;             // перейти к структуре монстра [ESP +12]
!!UN:Cy5/4/?y6;             // прочитать содержимое [ESP +12]

!!VRy7:Sy6 +76;             // перейти к hit_points
!!UN:Cy7/4/?y8;             // прочитать hit_points
!!VRy8:+x3;                 // увеличить
!!UN:Cy7/4/y8;              // записать новое кол-во hit_points

!!VRy7:Sy6 +80;             // перейти к _speed_
!!UN:Cy7/4/?y8;             // прочитать _speed_
!!VRy8:+x4;                 // увеличить
!!UN:Cy7/4/y8;              // записать новый _speed_

!!VRy7:Sy6 +84;             // перейти к _attack_
!!UN:Cy7/4/?y8;             // прочитать _attack_
!!VRy8:+x5;                 // увеличить
!!UN:Cy7/4/y8;              // записать новый _attack_

!!VRy7:Sy6 +88;             // перейти к _defence_
!!UN:Cy7/4/?y8;             // прочитать _defence_
!!VRy8:+x6;                 // увеличить
!!UN:Cy7/4/y8;              // записать новый _defence_

!!VRy7:Sy6 +92;             // перейти к _damage_min_
!!UN:Cy7/4/?y8;             // прочитать _damage_min_
!!VRy8:+x7;                 // увеличить
!!UN:Cy7/4/y8;              // записать новый _damage_min_

!!VRy7:Sy6 +96;             // перейти к _damage_max_
!!UN:Cy7/4/?y8;             // прочитать _damage_max_
!!VRy8:+x8;                 // увеличить
!!UN:Cy7/4/y8;              // записать новый _damage_max_
; и т.д.

thanks feanor
Код
5128624 [адрес хука]
   !?FU[номер функции];
   !!SN:X?y1;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
   !!VRy2:Sy1 +24;             // перейти к [ECX]
   !!UN:Cy2/4/?y3;             // прочитать содержимое [ECX]
   !!VRy4:Sy3 +26;             // перейти к номеру героя [ECX +26]
   !!UN:Cy4/4/?y5;             // узнать номер героя
   !!HEy5:Fd/d/d/?y10;         // узнать параметр знания
   !!VRy2:Sy1 +16;             // перейти к [EBX]
   !!VRy10:-1;                 // короче нуно отнять еденицу
   !!UN:Cy2/4/dy10;         // добавить к [EBX] добавить приход маны

Код
4254704 [адрес хука]
!?FU[номер функции];
!!SN:X?y3/0;
!!VRy4:Sy3 +32;
!!UN:Cy4/4/4256154;
Код
ZVSE
** Скрипт первентивного удара у Лазурных драконов
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4463326/36896;

!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4463326/36896;

!?FU36896;                  [перед ударом]
!!BG:N?y2 E?y4;                 [номер атакующего и получающего стеков]
!!BMy4:T?y3;                    [тип монстра защитника]
!!BMy2:T?y5;                    [тип монстра атакующего]
!!FU&y3<>132|y5=132:E;          [только, если Лазурик]

!!BMy4:G62/?y62/d;              [проверить на ослепление]
!!BMy4:G70/?y70/d;              [проверить на окаменение]
!!BMy4:G74/?y74/d;              [проверить на паралич]
!!FU|y62>0/y70>0/y74>0:E;       [выход, если закл.есть на стеке]

!!UN:C6919200/4/?y10;           [комбатмэнеджер]
!!VRy11:Sy4 *1352 +21708 +y10;  [стек защитника как атакующий]
!!VRy21:Sy2 *1352 +21708 +y10;  [стек атакующего как получающий]
!!SN:E4461360/2/y11/y21/2;      [нанести удар]
!!VRy11:+1216; !!UN:Cy11/1/1;   [не отвечать на атаку]

!!BMy2:N?y5;   !!FU&y5>0:E;     [выход, если атакующие еще остались живы]
!!BMy2:F?y5;                    [а если мертвы ...]
!!VRy5:|32768 -32768;           [забрать у стека двойной удар]
!!BMy2:Fy5;                     [хотя может быть полубаг после их воскрешения]
!!SN:X?y1/0;                    [и + отменить ответный удар]
!!VRy1:+32;                     [переход к адресу возврата]
!!UN:Cy1/4/4463493;             [установить прыжок в 0x441B85]
** end
Код
ZVSE
** Скрипт ответного выстрела
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4456318/36894;  [после первого выстрела]
!!SN:Ey2/1/4456338/36895;  [перед вторым выстрелом (а-ля грандэльфы)]

!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4456318/36894;  [после первого выстрела]
!!SN:Ey2/1/4456338/36895;  [перед вторым выстрелом (а-ля грандэльфы)]

!?FU36894;                 [после первого выстрела]
!!BG:E?y3 A?y4 N?y5;             [номер стека получающего и наносящего урон]
!!BMy3&y3>-1:N?y2;               [проверка на жив ли получающий урон]
!!FU|y4<>7/y3=-1/y3=y5/y2<1:E;   [если выстрел, если стеки не одинаковые и жив ли получающий]
!!BMy3:F?y1;                     [получить флаги получающего]
!!VRy1:&4;                       [проверить его на стрелка]
!!BMy3:G-48/?y2/d;               [есть ли у него выстрелы]
!!FU|y1<1/y2<1:E;                [выход, если не стрелок или нет боезапаса]
!!UN:C6919200/4/?y10;            [комбатмэнеджер]
!!VRy11:Sy3 *1352 +21708 +y10;   [структура атакующего стек]
!!VRy21:Sy5 *1352 +21708 +y10;   [структура стека цель]
!!SN:E4453920/2/y11/y21;         [выстрелить]

!?FU36895;                 [перед вторым выстрелом (а-ля грандэльфы)]
!!SN:X?y1;                       [параметры хука]
!!VRy2:Sy1 +4;   !!UN:Cy2/4/?y3; [структура атакующего монстра]
!!VRy4:Sy3 +76;  !!UN:Cy4/4/?y5; [узнать их кол-во]
!!FU&y5>0:E;                     [выход, если после ответки еще хоть один жив]
!!SN:X?y1/0;                     [если нет, то отменить второй выстрел]
!!VRy1:+32;                      [переход к адресу возврата]
!!UN:Cy1/4/4456346;              [установить прыжок в 0x43FF9A]
** end
Код
ZVSE

** Скрипт: Изменение специальности (тип 1) по существам.
**         Бонус = Уровень героя - уровень монстра.
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5137688/26003;   [0x004E6518]

!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5137688/26003;   [0x004E6518]

!?FU26003;
!!SN:X?y1/0;
; [получаем параметры героя]
!!VRy2:Sy1 +28; [EAX]    !!UN:Cy2/4/?y3;  [структура героя]
!!VRy3:+85; [EAX+0x55]   !!UN:Cy3/4/?y4;  [узнать уровень героя]
; [получаем параметры монстра]
!!VRy5:Sy1 +4;  [ESI]    !!UN:Cy5/4/?y6;  [структура монстра]
!!VRy7:Sy6 +4;  [ESI+4]  !!UN:Cy7/4/?y7;  [уровень монстра]
!!VRy7:+1;                                [переводим в привычный уровень монстра]
; [бонус от специальности]
!!VRy10:Sy4 -y7;                          [разница уровня героя и монстра]
!!VRy10&y10<0:S0;                         [проверка на отрицательное значение]
; [устанавливаем бонусы]
!!VRy11:Sy6 +84;       !!UN:Cy11/4/dy10;  [бонус к атаке]
!!VRy12:Sy6 +88;       !!UN:Cy12/4/dy10;  [бонус к защите]

!!VRy99:Sy1 +32; !!UN:Cy99/4/5137828;  [возврат в 0x004E65A4]
** end
Код
ZVSE

** Скрипт: Изменение специальности (тип 5): скорость.
** Бонус теперь не фиксированный, а может устанавливаться
** через HE:X5/[бонус скорости] для каждого отдельновзятого героя
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5138023/26005;
!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5138023/26005;
!?FU26005;
!!SN:X?y1;              !!UN:Cy1/4/?y11;   [EDI] хранит бонус к скорости
!!VRy2:Sy1 +28;         !!UN:Cy2/4/?y12;   [EAX] указатель на таблицу специальностей
!!VRy3:Sy1 +20;         !!UN:Cy3/4/?y13;   [EDX] смещение на нужного героя
!!VRy4:Sy13 *8 +y12;    !!UN:Cy4/4/?y14;   [первый параметр (=5) в HE:X[5]/[2]
!!VRy5:Sy13 *8 +y12 +4; !!UN:Cy5/4/?y15;   [второй параметр (=2) в HE:X[5]/[2]
!!VRy15:-2;             !!UN:Cy1/4/dy15;   [установить наш бонус с вычетом 2 (от стандатного кода)]
** end
Код
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/6241544/26000;

!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/6241544/26000;

!?FU26000;
!!SN:X?y1;
; показ бонуса к морали
!!UN:Cy1/4/?y50;
!!VRy50:+1256;
!!UN:Cy50/1/?y51;
!!VRy51&y51<-3:S-3;
!!VRz9&y51=0:S^ ^;
!!VRz9&y51>0:S^+^;    !!VRy51&y51>3:S3;
!!VRz12:S^%Z9%Y51^;
!!VRy25:S12*512 +9597416;  получить адрес z переменной
!!SN:E6386834/1/80; !!VRy10:Sv1;
!!SN:E6014624/2/y10/46/209/20/20/y25/6687924/4/-1/10/0/8;
!!VRv10:Sv1;
!!VRy26:S10*4 +8943204;
!!VRy4:Sy1 +16;  ebx
!!UN:Cy4/4/?y4;
!!VRy5:Sy4 +8;   ebx+8
!!UN:Cy5/4/?y5;
!!SN:E6283984/2/y4/y5/1/y26;  AddItemToList
; показ бонуса к удаче
!!UN:Cy1/4/?y52;
!!VRy52:+1260;
!!UN:Cy52/1/?y53;
!!VRy53&y53<-3:S-3;
!!VRz10&y53=0:S^ ^;
!!VRz10&y53>0:S^+^;  !!VRy53&y53>3:S3;
!!VRz13:S^%Z10%Y53^;
!!VRy35:S13*512 +9597416;  получить адрес z переменной
!!SN:E6386834/1/80; !!VRy30:Sv1;
!!SN:E6014624/2/y30/99/209/20/20/y35/6687924/4/-1/10/0/8;
!!VRv11:Sv1;
!!VRy36:S11*4 +8943204;
!!VRy4:Sy1 +16;  ebx
!!UN:Cy4/4/?y4;
!!VRy5:Sy4 +8;   ebx+8
!!UN:Cy5/4/?y5;
!!SN:E6283984/2/y4/y5/1/y36;  AddItemToList
** end
Код
!?PI;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/6253538/26001;

!?GM0;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/6253538/26001;

!?FU26001;
; показ продолжительности заклинаний:
!!SN:X?y1;
!!VRy3:Sy1 +4;     !!UN:Cy3/4/?y13;   // ESI
                   !!UN:Cy13/4/?y43;  // получить номер закла (-1 если его нет)
!!VRy23:Sy13 +12;  !!UN:Cy23/4/?y33;  // получить продолжительность заклинания
!!FU|y43<0/y43=47/y43=59/y43=72/y33<1:E;
!!VRz13:S^x%Y33^;
!!VRy25:S13*512 +9597416; адрес z переменной
!!VRy70:Sy1 +8;   !!UN:Cy70/4/?y71;
!!VRy78:Sy71 -28;  !!UN:Cy78/4/?y78;
!!VRy79:Sy71 -32;  !!UN:Cy79/4/?y79;  !!VRy69:S3003 -y79;
!!VRy81:Sy71 -40;  !!UN:Cy81/4/?y81;  !!VRy82:Sy81+48;
                                      !!VRy84:Sy81+56;  !!UN:Cy84/4/?y85;
!!SN:E6386834/1/80; !!VRy10:Sv1;
!!SN:E6014624/2/y10/y78/202/46/20/y25/6687924/4/y69/10/0/8;
!!VRv15:Sv1;
!!VRy26:S15*4 +8943204;
!!SN:E6283984/2/y82/y85/1/y26;  AddItemToList
** end


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 17 Jan 2015, 13:09 (Сообщение отредактировал Gavek - 17 Jan 2015, 13:22)
Сообщение #3

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Цитата(igrik @ 17 Jan 2015, 12:03) *
Можно также собрать небольшую базу хуков штоле:

Код
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;       получить адрес плагинахука
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/^erm_hooker^; проверка на наличие плагина хука
!!SN&v1>0:Ey2/1/[адрес функции]/[номер функции]; работает, только если есть планиг хука

Если в правильно понял,то
!?PI;
!!SN:L^erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/?v1;
!!SN&v1>0:Ey2/1/4854731/31865;

Пишет не верный синтаксис для команды !!SN
Останавливается на строке Ey4/1/?v1, тоже самое если Ey4/1/^erm_hooker^. Etm_hooker.era на месте
!!SN:L^erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4854731/31865;
Без проверки хука работает, может не так понял


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 17 Jan 2015, 13:18
Сообщение #4

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




Вообще то должно работать. Проверьте еще раз правильно ли скопировали код.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 17 Jan 2015, 14:07
Сообщение #5

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Для сокровищницы если первый раз отменить, бой уже не вызывается, наверно параметры надо обратно менять?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 17 Jan 2015, 19:10
Сообщение #6

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Цитата
Можно также собрать небольшую базу хуков штоле:
Надо, да
Но я ленивай, так что могу только подогнать адресов функций для экспериментов


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 17 Jan 2015, 21:23 (Сообщение отредактировал Gavek - 17 Jan 2015, 22:37)
Сообщение #7

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Цитата(feanor @ 17 Jan 2015, 21:10) *
Цитата
Можно также собрать небольшую базу хуков штоле:
Надо, да
Но я ленивай, так что могу только подогнать адресов функций для экспериментов

Поможете найти функции для всех типов сокровищниц, как для 16 типа определили?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 17 Jan 2015, 23:24
Сообщение #8

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




Цитата(feanor @ 17 Jan 2015, 19:10) *
Но я ленивай, так что могу только подогнать адресов функций для экспериментов

это уже интересно!


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 17 Jan 2015, 23:58
Сообщение #9

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Например
0x4E6390 - расчет бонусов героя к отряду монстров (от артефактов, атаки-защиты, спецы и так далее). Покрывает все случаи, от боя до отображения в окне юнита.
Параметры - ecx - структура героя, первый стековый ([esp+4]) - номер существа, второй стековый ([esp+8]) - структура монстра, которую и нужно менять

Формат структуры монстра описан в начале темы инж.анализа, повторю:

CODE
NOALIGN struct _CreatureInfo_ : public _Struct_
{
_int_ town;
_int_ level;
_char_* sound_name;
_char_* def_name;
_int_ flags;
_char_* name_single;
_char_* name_plural;
_char_* specification_description;

//_int_ cost_wood;
//_int_ cost_mercury;
//_int_ cost_ore;
//_int_ cost_sulfur;
//_int_ cost_crystal;
//_int_ cost_jems;
//_int_ cost_gold;
union
{
_Resources_ cost_n;
_int_ cost[7];
};

_int_ fight_value;
_int_ AI_value;
_int_ growth;
_int_ horde_growth;
_int_ hit_points;
_int_ speed;
_int_ attack;
_int_ defence;
_int_ damage_min;
_int_ damage_max;
_int_ shots;
_int_ spells_count;
_int_ advmap_low;
_int_ advmap_high;
};


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Jan 2015, 00:21
Сообщение #10

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




0x4E27C0 - проверка на возможность положить артефакт в слот.
Можно врезаться в начало, посмотреть параметры (ecx - структура героя, [esp+4] - номер артефакта, [esp+8] - слот), при необходимости изменить - записать в eax 0 или 1 и прыгнуть на ret (004E2AA9)



Код
//----- (004E27C0) --------------------------------------------------------
// Slot=-1 - check all slots
char __thiscall MayThisArtBePlacedToThisSlot(_Hero_ *this, int art, unsigned int slot)


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 18 Jan 2015, 00:51
Сообщение #11

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




Цитата
Параметры - ecx - структура героя, первый стековый ([esp+4]) - номер существа, второй стековый ([esp+8]) - структура монстра, которую и нужно менять

как получить номер героя я пока так и не понял, а вот по существам поправочка:
; первый стековый ([esp+8]) - номер существа,
; второй стековый ([esp+12]) - структура монстра


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Jan 2015, 00:56
Сообщение #12

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Цитата
как получить номер героя я пока так и не понял


у тебя описалова структуры чтоль нет?

[ecx+26]

CODE
struct _Hero_
{
_int16_ x; // +0
_int16_ y; // +2
_int16_ z; // +4
_byte_ visible; // +6
_dword_ mui_xyz; // +7
_byte_ field_0B; // +11
// miu = map_item under hero
_dword_ miu_object_type; // +12
_dword_ miu_object_c_flag; // +16
_dword_ miu_setup; // +20
_word_ spell_points; // +24
_dword_ id; // +26
_dword_ id_wtf; // +30
_int8_ owner_id; // +34
_char_ name[13]; // +35
_dword_ _class; // +48
_byte_ pic; // +52
_dword_ aim_x; // +53
_dword_ aim_y; // +57
_word_ aim_z; // +61
_int16_ last_magic_level; // +61. Последний из уровней, на переходе на который предложили магию стихии.
_byte_ field_41[3]; // +65
_byte_ x_0; // +68
_byte_ y_0; // +69
_byte_ run; // +70
_byte_ field_47; // +71
_byte_ flags; // +72
_dword_ movement_points_max; // +73
_dword_ movement_points; // +77
_dword_ expa; // +81
_word_ level; // +85
_dword_ visited[10]; // +87
_byte_ field_7F[16]; // +127
_byte_ random_number_for_level_up_seed; // +143
_int8_ last_wisdom_level; // +144. Последний из уровней, на переходе на который предложили мудрость.
_Army_ army; // +145
_byte_ second_skill[28]; // +201
_byte_ second_skill_show[28]; // +229
_dword_ second_skill_count; // +257
_dword_ temp_mod_flags; // + 261
_byte_ field_109[4]; // +265
_byte_ dd_cast_this_turn; // +269
_dword_ disguise; // +270
_dword_ field_112; // +274
_dword_ field_116; // +278
_byte_ d_morale_1; // +282
_byte_ d_luck; // +283
_byte_ is_sleeping_byte11C; // +284
_byte_ field_11E[16]; // +284
_Artifact_ doll_art[19]; // +301
_byte_ free_add_slots; // +453
_byte_ locked_slot[14]; // +454
_Artifact_ backpack_art[64]; // +468
_byte_ backpack_arts_count; // +980
_dword_ sex; // +981
_bool8_ has_biography; // +985
_HStringF_ biography; // +986
_bool8_ has_spell[70]; // +1002
_bool8_ has_spell_with_arts[70]; // +1072
//_byte_ primary_skill[4];
_byte_ attack; // +1142
_byte_ defence; // +1141
_byte_ power; // +1142
_byte_ knowledge; // +1143
_byte_ field_47A[24]; // +1144
}


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 18 Jan 2015, 01:23
Сообщение #13

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




не а, не нашел в инженерном анализе


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 19 Jan 2015, 12:14
Сообщение #14

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Как можно открыть диалог любого существа, кто нить знает?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 19 Jan 2015, 13:28 (Сообщение отредактировал igrik - 19 Jan 2015, 15:31)
Сообщение #15

Immortal
Сообщений: 568
Спасибо сказали: 810 раз




Тут закопано
Код
!?FU[номер функции];
; © Master Of Puppets
; x1 - герой (0) или город (1)
; x2 - номер героя или города
; x3 - номер слота
; x4 - наличие кнопки "Уволить": 1 - да, 0 - нет
; x5 - закрыть диалог при отпускании мыши: 1 - да, 0 - нет
; x6/x7 - координаты выводимого окна
!!UN:C6933756/4/?y5;
!!OW:C?y2;
!!VRy1:Sy2*360;
!!VRy5:-y1;
!!UN:C6919480/4/?y10;
!!if&x1=0;  если герой
  !!VRy1:Sx2*1170+y5+3041;
  !!VRy3:Sx3*4+y1;
  !!UN:Cy3/4/<0;
  !!FU&1:E;
  !!VRy3:Sy1-145;
  !!SN:E5007632/2/y10/y1/x3/y3/0/x6/x7/x4/x5;
!!en;
!!if&x1=1;  если город
  !!VRy1:Sy5+2884;
  !!UN:Cy1/4/?y2;
  !!VRy1:Sx2*360+y2+224;
  !!VRy3:Sx3*4+y1;
  !!UN:Cy3/4/<0;
  !!FU&1:E;
  !!VRy3:Sy1-224;
  !!SN:E5007632/2/y10/y1/x3/y3/0/x6/x7/x4/x5;
!!en;


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 19 Jan 2015, 15:29
Сообщение #16

laughed as one fey
Сообщений: 11 812
Спасибо сказали: 19681 раз




Вот что меня определенно раздражает в хукалке, дак это невозможность ставить второй хук на то же место, как в патчере.
Ну и высокоуровневости хотелось бы, сплайсы, например, с вызовом замещаемой функции.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 19 Jan 2015, 17:31 (Сообщение отредактировал Gavek - 19 Jan 2015, 17:33)
Сообщение #17

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Код
!?FU[номер функции];
; © Master Of Puppets
; x1 - герой (0) или город (1)
; x2 - номер героя или города
; x3 - номер слота
...
...

Это отличная функция от Master Of Puppets! Правда её уже пользую. Нужно, чтобы неслотового существа диалог открывался, а любого). Копался в декомпиляте, который вы выложили. Там функция такая есть, только вот самому мне её на ERM не сделать.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
major
сообщение 26 Feb 2015, 12:48
Сообщение #18

Immortal
Сообщений: 668
Спасибо сказали: 58 раз




С этим плагином при запуске h3era сразу выпадает "Runtime error 217 at ####" (адреса всегда разные).
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 20 Jan 2019, 21:51 (Сообщение отредактировал Richter - 20 Jan 2019, 21:53)
Сообщение #19

collector of time
Сообщений: 149
Спасибо сказали: 51 раз




Подскажите пожалуйста, где поставить хук, чтобы можно было подменить изображение специальности героя без использования !#UN:G2/#/#/#;?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 21 Jan 2019, 00:00
Сообщение #20

Доделываю HIII:MoP2.2, в свободное от бана время.
Сообщений: 78
Спасибо сказали: 36 раз




Цитата(Richter @ 20 Jan 2019, 21:51) *
Подскажите пожалуйста, где поставить хук, чтобы можно было подменить изображение специальности героя без использования !#UN:G2/#/#/#;?


Такое без хуков делается: в нужном тебе триггере получаешь адреса следующих данных: HeroSpecWoG[номер_твоего_героя].SpecPicInd[0] и HeroSpecWoG[номер_твоего_героя].SpecPicInd[1] и заменяешь в них номера картинок специализаций.

Можно и поставить хук на 4Е1F2А, но это уже вог сам сделал за тебя.


--------------------
не баньте меня, пожайлуста....


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 22 September 2019 - 11:44
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика