Запись строки в переменную не повлияла на работоспособность.
Так же, я заглянул в нативки StringLength и SubString, но не обнаружил в них ограничений на длину строк.
Вместо этого, я обнаружил проблему при склейке строк оператором "+".
легендарный код
Третий параметр функций Copy и Cat отвечает за размер целевого буфера.
Локальная переменная занимает 4100 байт в стеке и вряд ли уместит в себе 2 гигабайта.
Я не заметил проблем при работе с длинными строками.
код
function Trig_test_Actions takes nothing returns nothing
local integer COUNT = 8
local string array strings
local integer i = 0
local string s = ""
set strings[0] = "Lua is a powerful, efficient, lightweight, embeddable scripting language."
set strings[1] = "It supports procedural programming, object-oriented programming, functional programming, data-driven programming, and data description."
set strings[2] = "Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics."
set strings[3] = "Lua is dynamically typed, runs by interpreting bytecode with a register-based virtual machine, and has automatic memory management with a generational garbage collection, making it ideal for configuration, scripting, and rapid prototyping."
set strings[4] = "Lua is implemented as a library, written in clean C, the common subset of standard C and C++."
set strings[5] = "The Lua distribution includes a host program called lua, which uses the Lua library to offer a complete, standalone Lua interpreter, for interactive or batch use."
set strings[6] = "Lua is intended to be used both as a powerful, lightweight, embeddable scripting language for any program that needs one, and as a powerful but lightweight and efficient stand-alone language."
set strings[7] = "As an extension language, Lua has no notion of a \"main\" program: it works embedded in a host client, called the embedding program or simply the host."
loop
set s = s + strings[i]
if i < (COUNT - 1) then
set s = s + "\n"
endif
set i = i + 1
exitwhen i >= COUNT
endloop
call BJDebugMsg("s length = " + I2S(StringLength(s)))
call BJDebugMsg("«" + SubString(s, StringLength(s) - 20, StringLength(s)) + "»")
call BJDebugMsg("«" + SubString(s, StringLength(s) - 10, StringLength(s)) + "»")
call BJDebugMsg("«" + SubString(s, StringLength(s) - 10 - 1, StringLength(s) - 1) + "»")
endfunction
function InitTrig_test takes nothing returns nothing
set gg_trg_test = CreateTrigger()
call TriggerRegisterPlayerChatEvent(gg_trg_test, Player(0), "-test", true)
call TriggerAddAction(gg_trg_test, function Trig_test_Actions)
endfunction
Вывод:
s length = 1182
« or simply the host.»
« the host.»
«y the host»
nazarpunk, у виртуальной машины есть много инструкций. Можно исправить некоторые из них, а другие продолжат таить угрозу. Еще есть выход за границы таблицы хэндлов — quq_CCCP показывал мне китайскую карту, вроде на 1.29 патче, которая пошла этим путем и взламывала игру.
Еще бывают модели, от которых игра критует — как знать, может и через них можно хакнуть.
nazarpunk, ужапи не имеет исходного кода и я не могу проверить то, насколько хорошо он исправляет уязвимости. Близарды тоже "фиксили" уже.
Да и если даже исправить все известные уязвимости, то всё равно стоит опасаться появления новых, ведь уже известно какого качества код у варкрафта.
Vlod, конечно, можно обойтись без этого, но, как я понимаю, обычно игроки запускают игру от админа. Хотя я советовал бы создать отдельного пользователя (например, warcraft) и забрать у него все права какие только можно. Еще можно запускать игру из песочницы или в виртуальной машине. Впрочем, даже так лучше не запускать левые карты, а лишь те, что скачаны из довереных источников. Лучше даже запретить игре права на запись в папку Maps и тогда она не сможет туда качать новые карты от незнакомцев.
Для написания вредоносного кода тут потребуется значительно больше сил
Что сложного взять, к примеру, доту лича и достать оттуда его "DotaAllstarsHelper.dll" и заменить его каким-нибудь "trojan.dll", а дальше делай что хочешь — вся система в твоем распоряжении.
Как раз таки наоборот. Если игра установлена в ProgramFiles, то там для записи требуются права админа, а варик в своей папке любит создавать новые файлы и ему потребуются повышенные привелегии для этого.
Какое отношение эта способность имеет к дураку? Да и какая роль должна быть, чтобы иметь такую возможность? Не вижу смысла для серийного убийцы делать суицид. А доктор врядли сможет реанимировать сам себя.
Если ты регистрируешь нативку в библиотеке, загружаемой этой системой, то учти, что она ждет пока не завершится функция main в JASS скрипте и только после этого загружает библиотеки. До этого момента запустить ИИ с пользовательскими нативками не выйдет.
Наверно, нужно будет исправить это, так как сейчас уже можно загружать библиотеки сразу.
Раньше это было нужно, потому что там еще был код, который пересоздавал главный поток, а делать это пока тот исполняется — плохая идея.
Зачем синхронизировать то, что и так есть на клиентах всех игроков?
Если скрипт на компьютере одного игрока решит, что нужно запросить помощь, то и на других компьютерах те прийдут к тому же выводу, ведь всё исполняется синхронно.
Складывается такое впечатление, будто ты не писал прежде на JASS'е, а иначе почему даже простое создание юнита вызывает у тебя проблемы?
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
Если нативка зарегистрирована, то виртуальная машина JASS'а сможет её использовать.
Учитывая, что и обычный и ИИ скрипты исполняются ею, то почему бы и нет?
Единственная проблема — регистрация должна произойти до компиляции, а иначе компилятор откажется работать, сетуя на несуществующую нативку.
Хранить данные ты можешь где угодно и делать что захочешь до тех пор, пока состояние всех игровых клиентов одинаковое. И не важно, на C++ ты пишешь или же на JASS'е, в итоге, если ты сделал опасные изменения локально лишь у одного игрока, то его отсоединит от остальных.
Используй нативку GetLocalPlayer с осторожностью.
Библиотека с твоим скриптом загружается и исполняется паралельно у всех игроков.
Просто пиши код также, как ты делал это на JASS'е. Правила те же: все действия должны быть одинаковы на компьютерах всех игроков. Локально можно делать лишь некоторые, такие как смена цвета/размера юнита.
Vampir_kolik, создание юнита для локального игрока вызовет десинк на любом языке.
На игровом клиенте красного игрока создается юнит, принадлежащий игроку красному, а на клиенте синего - синему. В итоге состояние мира отличается и они играют в разные игры.
В моём примере главный работник создается для красного игрока, а прочие для игроков 1-10.
Вижу, ты цитируешь старую версию исходников библиотеки со скриптом, советую скачать последнюю.
Я как-то делал интереса ради одну систему, которая позволяла достичь этой цели.
Принцип работы: сначала временный скрипт распаковывает и загружает библиотеки, а затем он компилирует и запускает оригинальный скрипт карты, после чего самоуничтожается. Таким образом, к моменту запуска основного сценария, нативки уже зарегистрированы и компилятор не ругается.
Вот только, на сайте сейчас нерабочая версия висит. Я скрывал ресурс ибо лень исправлять, но модератор зачем-то его опубликовал.
Впрочем, думаю есть способ получше: можно модифицировать байт-код во время исполнения таким образом, чтобы вызов обычной функции превратился в вызов нативки.
Будет выглядеть как-то так
function MyNativeFunction takes nothing returns nothing
endfunction
function main takes nothing returns nothing
call RedirectToNative(function MyNativeFunction)
// На самом деле вызовется не пустая функция объявленная выше, а нативка с таким же именем.
call MyNativeFunction()
endfunction
ну там действительно есть дллки, которые появляются во время запуска карты.
Не думаю, что карта стоит упоминания, если только в ней не находится код, извлекающий файлы из архива, в чем я сомневаюсь, ведь он имеет расширение mix, а значит должен быть библиотекой, которая и сама себя сможет распаковать.
Могу предположить, что автор защиты не стал особо мудрить и поместил архив в ресурсы библиотеки, может даже не зашифровав его. Если всё так, то тебе лишь нужно открыть файл в программе, умеющей показывать вшитые в исполняемые файлы ресурсы, и извлечь их. Возможно, среди них найдется искомый архив.
Еще, как вариант, при помощи специальных программ, можно посмотреть какие файлы открывает игра и, если повезет, среди них может обнаружиться распакованый архив.
Если же нет, то придется восстанавливать исходный код библиотеки, после чего можно будет выяснить, каким же образом она добавляет новые файлы в игру.
Можешь заняться этим сам, воспользовавшись программами для обратной разработки (например, IDA), либо нанять специалистов, которые выполнят работу за тебя.
Файл mix, в первую очередь, является библиотекой (DLL). К ней можно прикрепить MPQ-архив, получив тем самым mix-архив, но вовсе необязательно, что твой файл относится к этому типу.
Возможно, эта библиотека извлекает из себя архив во временную папку и загружает оттуда в игру. А может, она перехватывает запросы игры на ресурсы (модели, текстуры) и загружает их из памяти. Сделано так могло быть из нежелания автора делиться своими трудами.
А еще, автор может, при желании, засунуть туда вирусов и майнить на твоей видеокарте или удалить тебе все файлы с диска, если ты ему в игре не понравишься.
Из-за того, что нативки возвращают строки в виде индексов из таблицы строк главного потока карты, все прочие потоки, не являющиеся дочерними ему, например те, что исполняют прелоад скрипты или ИИ, не могут получить результат от нативок с таким типом. Индекс не будет подходить для их таблицы строк.
Будет получена случайная строка или произойдет выход за границы таблицы с печальным концом.
Получение строк в результате вызова нативок работает лишь в главном потоке.
Инструкция по адресу 0x6F430C91 попыталась прочесть память по адресу 0x00000020, но так как там ничего не было — она крашнулась.
Этот код расположен в пределах game.dll (0x6F000000 - 0x6FBB5000 F:\Warcraft III 1.26S\Game.dll), что видно в разделе Loaded Modules. Учтите, что пусть эта библиотека и предпочитает распологаться по адресу 0x6F000000, но операционная система может загрузить её куда либо еще и тогда, с теми же смещениями, абсолютные адреса будут отличаться. К примеру, если библиотека будет по адресу 0x24F00000, то вместо 0x6F430C91 вы увидите 0x25330C91 (0x24F00000 + 0x430C91).
По смещению 0x430C91 находится код функции CGameState::GetAgentHandle, которая принимает указатель на агент и возвращает его хэндл.
В дампе памяти стека видны значения трёх сохраненных регистров (0x00000010 0x0019DFE8 0xFFFFFFFF), а также адрес возврата 0x6F3BBB58 и полученные аргументы: agent=0x00000010, auto_free=0x00000000. Кто-то передал кривой указатель 0x10, который ссылается на нечитаемую память.
Адрес возврата ведет к нативке Player. В стеке можно увидеть сохраненное ею значение регистра (0x6F9473BE), адрес возврата к коду виртуальной машины (0x6F45D1B8) и полученный ею аргумент (number=0xFFFFFFFF), который в виде знакового целого равняется числу -1.
Вывод: кто-то вызвал нативку Player с параметром -1, что и привело к крашу.
Найти конкретного виновника поможет программа, ссылку на которую я скинул выше.
Начало дампа стека
Обратите внимание, что дамп стека выровнен по границе 16 байт, так что, на самом деле вершина стека находится не по адресу 0x0019DF10, а как написано ниже — 0x0019DF18, так что, в данном случае, первые 8 байт можно пропустить (зачеркнуты). Синим выделены сохраненные значения регистров, зеленым — адреса возврата, а красным — кривые параметры, приведшие к крашу.
Stack: 1024 bytes starting at (ESP = 0019DF18)
Ред. IceFog
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
Вместо этого, я обнаружил проблему при склейке строк оператором "+".
Локальная переменная занимает 4100 байт в стеке и вряд ли уместит в себе 2 гигабайта.
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
» WarCraft 3 / Опасен ли мемхак?
» WarCraft 3 / Опасен ли мемхак?
» WarCraft 3 / Опасен ли мемхак?
Да и если даже исправить все известные уязвимости, то всё равно стоит опасаться появления новых, ведь уже известно какого качества код у варкрафта.
» WarCraft 3 / Опасен ли мемхак?
» WarCraft 3 / Опасен ли мемхак?
» WarCraft 3 / Мафия 1.60 - патчи от IceFog'а
» WarCraft 3 / Мафия 1.60 - патчи от IceFog'а
» WarCraft 3 / Работа с нативными функциями
Раньше это было нужно, потому что там еще был код, который пересоздавал главный поток, а делать это пока тот исполняется — плохая идея.
» WarCraft 3 / Сценарий на любом языке
Если скрипт на компьютере одного игрока решит, что нужно запросить помощь, то и на других компьютерах те прийдут к тому же выводу, ведь всё исполняется синхронно.
» WarCraft 3 / Сценарий на любом языке
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
Ред. IceFog
» WarCraft 3 / Работа с нативными функциями
Учитывая, что и обычный и ИИ скрипты исполняются ею, то почему бы и нет?
Единственная проблема — регистрация должна произойти до компиляции, а иначе компилятор откажется работать, сетуя на несуществующую нативку.
» WarCraft 3 / Сценарий на любом языке
Используй нативку GetLocalPlayer с осторожностью.
» WarCraft 3 / Сценарий на любом языке
Просто пиши код также, как ты делал это на JASS'е. Правила те же: все действия должны быть одинаковы на компьютерах всех игроков. Локально можно делать лишь некоторые, такие как смена цвета/размера юнита.
» WarCraft 3 / Сценарий на любом языке
На игровом клиенте красного игрока создается юнит, принадлежащий игроку красному, а на клиенте синего - синему. В итоге состояние мира отличается и они играют в разные игры.
В моём примере главный работник создается для красного игрока, а прочие для игроков 1-10.
» WarCraft 3 / Открытая виртуальная машина
Ред. IceFog
» WarCraft 3 / Работа с нативными функциями
» WarCraft 3 / Помогите вспомнить карту !
Ред. IceFog
» WarCraft 3 / Намертво зависает вкладка Сценарий/свойство игрока.
Ред. IceFog
» WarCraft 3 / Laddik не может открыть архив
Можешь заняться этим сам, воспользовавшись программами для обратной разработки (например, IDA), либо нанять специалистов, которые выполнят работу за тебя.
Ред. IceFog
» WarCraft 3 / Laddik не может открыть архив
» WarCraft 3 / Просмотр состояния виртуальной машины JASS
» WarCraft 3 / Получение строки в Prealod файле
Ред. IceFog
» WarCraft 3 / Переодические вылеты в карте, может кто по коду ошибки скажет.
В дампе памяти стека видны значения трёх сохраненных регистров (0x00000010 0x0019DFE8 0xFFFFFFFF), а также адрес возврата 0x6F3BBB58 и полученные аргументы: agent=0x00000010, auto_free=0x00000000. Кто-то передал кривой указатель 0x10, который ссылается на нечитаемую память.
Найти конкретного виновника поможет программа, ссылку на которую я скинул выше.
Синим выделены сохраненные значения регистров, зеленым — адреса возврата, а красным — кривые параметры, приведшие к крашу.
Stack: 1024 bytes starting at (ESP = 0019DF18)
E8 DF 19 00 75 91 45 6F10 00 00 00 E8 DF 19 00 ....u.Eo........0019DF20: FF FF FF FF 58 BB 3B 6F 10 00 00 00 00 00 00 00 ....X.;o........
0019DF30: BE 73 94 6F B8 D1 45 6F FF FF FF FF A4 D1 45 6F .s.o..Eo......Eo