24.01.2021, 16:51
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
13.02.2021, 01:25
XEPOMAHT, не могли бы Вы подсказать мне, по какому адресу лежит MonTable2?
13.02.2021, 01:46
(13.02.2021 01:25)Raistlin Wrote: [ -> ]по какому адресу лежит MonTable2?
Прямого адреса нет (точнее он есть, но только внутри Тифона). Можно только вычислить, но без гарантий, что после какого-нибудь обновления Тифона он не поменяется. В исходниках Тифона добавь RedirectMemoryBlock на MonTable2, чтобы он передавался Эре, а потом как его взять из Эры - наверное знаешь.

13.02.2021, 13:13
XEPOMAHT, как взять его потом, я и вправду знаю, но... К сожалению, я не знаю, как воспользоваться RedirectMemoryBlock в условиях ассемблера. Правда, у меня имеется иная идея: что, если на месте какой-то не используемой больше функции создать новую, которая будет попросту записывать в какой-то регистр адрес таблицы? Я тогда смогу вызвать ее где-то ещё, сохранив при этом предыдущее значение, хранящееся в регистре, куда-нибудь скопировать указатель, а затем восстановить данные в том регистре, куда я его сохранял.
13.02.2021, 16:56
Посмотреть в исходники Тифона 2.7z можно. Я тоже не знал, но нагуглил же.
Code:
section '.idata' data readable
data import
; Импортируемые процедуры
library kernel32, 'kernel32.dll',\
era, 'era.dll'
import kernel32,\
CreateFileA,'CreateFileA',\
GetFileSize, 'GetFileSize',\
VirtualAlloc, 'VirtualAlloc',\
ReadFile, 'ReadFile',\
CloseHandle, 'CloseHandle',\
VirtualFree, 'VirtualFree',\
WriteFile, 'WriteFile'
import era,\
RegisterHandler, 'RegisterHandler',\
RedirectMemoryBlock, 'RedirectMemoryBlock'
Code:
stdcall [RedirectMemoryBlock], 7D0C90h, 196 * sizeof._Creature_, MonTable
13.02.2021, 18:11
Berserker, спасибо! Не могли бы Вы только подсказать мне, что находится по адресу 7D0C90?
13.02.2021, 21:22
MonTable. То есть основная таблица монстров. Адрес воговский. ВоГ расширил содовскую таблицу, а МОР — воговскую.
13.02.2021, 23:26
Все, теперь понял. Собственно, то, что это воговский адрес, я знаю, проблема была в том, что я пока не разобрался, как находить нужное в воговской секции кода.
Еще раз спасибо за пример, это, правда, не совсем то, чего мне было нужно, но, кажется, я знаю, как мне быть. Я имел ввиду вот эту таблицу:
Делать надо вот так?
Еще раз спасибо за пример, это, правда, не совсем то, чего мне было нужно, но, кажется, я знаю, как мне быть. Я имел ввиду вот эту таблицу:
Spoiler (Click to View)
Code:
MonTable2 rb 59000; вторичные абилки
Counterstrike_Table = MonTable2
AlwaysPositiveMorale_Table = MonTable2+1000
AlwaysPositiveLuck_Table = MonTable2+2000
Arrow_Table = MonTable2+3000
Ballistic_Table = MonTable2+4000
DeathBlow_Table = MonTable2+5000
DeathCloudAndFireBall_Table = MonTable2+6000
Espionage_Table = MonTable2+7000
Fear_Table = MonTable2+8000
Fearless_Table = MonTable2+9000
NoWallPenalty_Table = MonTable2+10000
MagicAura_Table = MonTable2+11000
FireShield_Table = MonTable2+12000
StrikeAndReturn_Table = MonTable2+13000
SpellsCostLess_Table = MonTable2+14000
SpellsCostDump_Table = MonTable2+15000
Skeleton_Transformer_Table = MonTable2+16000
Upgrades_Table = MonTable2+20000
Properties1_Table = MonTable2+24000
Properties2_Table = MonTable2+25000
Properties3_Table = MonTable2+26000
Properties4_Table = MonTable2+27000
Properties5_Table = MonTable2+28000
Immun_Table = MonTable2+29000
GnomResistance_Table = MonTable2+30000
GolemResistance_Table = MonTable2+31000
Spells_Table = MonTable2+32000
Hate_Table = MonTable2+33000
JoustingBonus_Table = MonTable2+34000
ImmunToJoustingBonus_Table = MonTable2+35000
RegenerationHitPoints_Table = MonTable2+36000
RegenerationChance_Table = MonTable2+40000
ThreeHeadedAttack_Table = MonTable2+41000
ManaDrain_Table = MonTable2+42000
MagicChannel_Table = MonTable2+44000
MagicMirror_Table = MonTable2+45000
Sharpshooters_Table = MonTable2+46000
ShootingAdjacent_Table = MonTable2+47000
ReduceTargetDefense_Table = MonTable2+48000
Rebirth_Table = MonTable2+49000
PackAttack_Table = MonTable2+50000
AttackAllMove1 = MonTable2+51000
AttackAllMove2 = MonTable2+52000
PreventiveCounterstrikeTable= MonTable2+53000
RangeRetaliation_Table = MonTable2+54000
RayColor_Table = MonTable2+55000
Ban_Table = MonTable2+56000;
Stun_Table = MonTable2+57000;
ProtectFromShooting_Table = MonTable2+58000;
Делать надо вот так?
Code:
stdcall [RedirectMemoryBlock], (свободный адрес, за которым идет необходимое колличество пустого пространства), 59000, MonTable2
14.02.2021, 00:10
Да.
14.02.2021, 02:38
Хорошо. Кстати, а где можно найти 59000 байт пустого пространства? Вот я ткнул наугад на адрес 023474B2, как я могу быть уверенным, что в этом месте ничего нет? Или я не могу?
14.02.2021, 04:29
ОМГ. Ты либо объявляешь обычную статическую/глобальную переменную как часть статической памяти DLL, либо динамически её выделяешь через что угодно от геройской функции MAlloc до VirtualAlloc. Но тут имеет смысл статически новую таблицу объявить. MonTable2.
14.02.2021, 04:51
Berserker, по идее, эта таблица и добавлена как статическая, но впрямую она доступна, насколько я понимаю, только внутри самого Тифона. Мне же надо прочитать ее содержимое в собственном плагине, который написан уже не ассемблере, а на С++.
В общем, я отправляюсь гуглить - надеюсь удастся найти решение.
В общем, я отправляюсь гуглить - надеюсь удастся найти решение.
14.02.2021, 05:21
Raistlin, What do you plan to do with MonTable2 in Typhon? Discover new addresses for UN:C?
14.02.2021, 13:54
No, I just want to add a chance for Preventive Counterstrike. It should not work always, but I don't know how to do it using only Assembler. If I will not find a way, I will simply recreate this ability using C++.
14.02.2021, 15:45
Raistlin,
В Тифоне делаем так:
stdcall [RedirectMemoryBlock], оригинальный_адрес_MonTable2_в_воге, 59000, MonTable2
В твоём плагине делаем так: в событии OnAfterStructRelocations получаем адрес таблицы по GetRealAddr(оригинальный_адрес_MonTable2_в_воге).
В Тифоне делаем так:
stdcall [RedirectMemoryBlock], оригинальный_адрес_MonTable2_в_воге, 59000, MonTable2
В твоём плагине делаем так: в событии OnAfterStructRelocations получаем адрес таблицы по GetRealAddr(оригинальный_адрес_MonTable2_в_воге).