Добавлен Артас Менетил,
опубликован
Preload Exploit: работа с файлами
Содержание:
Preloader
В этой главе я расскажу, как запускать код из файла и как читать информацию из файла.. Но не из любого, а только из того, который мы создали при помощи функции PreloadGenEnd. Далее будем называть этот файл Выходным файлом.
Вернёмся к файлу save\PreExp.txt.
Вернёмся к файлу save\PreExp.txt.
function PreloadFiles takes nothing returns nothing
call Preload( "hi" )
call Preload( "65757" )
call Preload( "jjj" )
call Preload( "testtesttesr" )
call Preload( "5gfhgf" )
call Preload( "asefsdf" )
call Preload( "lolololo" )
call Preload( "hi" )
call PreloadEnd( 37.9 )
endfunction
Чтобы выполнить этот код, необходимо вызвать функцию:
call Preloader("save\\PreExp.txt")
Эта функция берёт параметр - путь к файлу. Preloader открывает этот файл и выполняет функцию PreloadFiles из его кода. Если функции PreloadFiles нет или если есть синтаксические ошибки, то ничего не выполняется.
Как мы видим, в файле вызывается функция Preload - т.е. заполняется буфер.
Но, увы, способа читать информацию из буфера я не знаю, и его, похоже, нет.
Так что применим хитрость...
Но, увы, способа читать информацию из буфера я не знаю, и его, похоже, нет.
Так что применим хитрость...
Химичим со строками
Нам необходимо добавить какой-то код в выходной файл при помощи функции Preload.
Если разобраться, то запись в выходной файл происходит так: вводится Preload( ", затем строка из буфера, затем " ) и перевод строки. То есть строка из буфера помещается как параметр функции Preload.
Чтобы добавить свой код, добавим в буфер такую строку, чтобы в выходном файле она:
Если разобраться, то запись в выходной файл происходит так: вводится Preload( ", затем строка из буфера, затем " ) и перевод строки. То есть строка из буфера помещается как параметр функции Preload.
Чтобы добавить свой код, добавим в буфер такую строку, чтобы в выходном файле она:
- Закрыла функцию Preload("
- Ввела нужный нам код
- Избавилась от остатка - ")
call Preload("\")\n <some code> \n //")
<some code> - это тот код, который мы хотим вставить.
Итак, разбор строки \")\n <some code> \n //
\"\n - это кавычки и перевод строки. Перед кавычками необходим слеш, так как иначе они воспринимаются варом как конец строки. \n, как известно, переводит строку.
<some code> \n - это наш код и перевод строки.
<some code> \n - это наш код и перевод строки.
// - это комментарий, чтобы избавиться от хвостика - ")
Вводимый код может быть многострочным - для этого строки нужно разделять при помощи \n.
В итоге в выходном файле получим следующее:
call Preload( "")
<some code>
//" )
Таким образом можно вставлять свой код в выходной файл.
Это может практически любой код. Сейчас я покажу, какой код нужен, чтобы можно было читать информацию из файла.
Это может практически любой код. Сейчас я покажу, какой код нужен, чтобы можно было читать информацию из файла.
Про код в выходном файле
Нужно заметить, что в функции PreloadFiles из выходного файла:
- Недоступны переменные из карты
- Невозможно вызывать функции из кода карты при помощи call function()
- Насколько я понял, можно вызывать native-функции. Если я ошибаюсь, поправьте меня.
- ВАЖНО: Можно применять call ExecuteFunc(function) для вызова функций из кода карты.
Последний пункт очень важен.
Для начала попробуем это проверить.
Откройте ту карту, где мы в прошлой главе делали систему записи чата в файл.
Зайдите в нестандартный код карты и введите туда следующую функцию:
Для начала попробуем это проверить.
Откройте ту карту, где мы в прошлой главе делали систему записи чата в файл.
Зайдите в нестандартный код карты и введите туда следующую функцию:
function Test takes nothing returns nothing
call DisplayTextToForce(GetPlayersAll(),"All OK!")
endfunction
Теперь откройте файл save\PreExp.txt и вставьте в него следующее:
function PreloadFiles takes nothing returns nothing
call ExecuteFunc("Test")
endfunction
Таким образом, при выполнении кода этого файла запустится функция Test и на экране появится сообщение All OK!.
Откроем в карте триггер, срабатывающий при вводе строки, и немного изменим его код:
Откроем в карте триггер, срабатывающий при вводе строки, и немного изменим его код:
if (GetEventPlayerChatString()=="-save") then
call PreloadGenEnd("save\\PreExp.txt")
elseif (GetEventPlayerChatString()=="-load") then
call Preloader("save\\PreExp.txt")
else
call Preload(GetEventPlayerChatString())
endif
Теперь при вводе -load на экране появится сообщение All OK!.
Запускайте карту и пишите в чат -load. Как мы видим, на экране появляется сообщение All OK!
Не пишите -save, иначе выходной файл испортится. :)
Запускайте карту и пишите в чат -load. Как мы видим, на экране появляется сообщение All OK!
Не пишите -save, иначе выходной файл испортится. :)
Как получить информацию из файла?
К сожалению, ExecuteFunc не позволяет передать функции параметры.
Поэтому их нужно передать другим способом. Глобальные переменные, как я говорил, не работают, зато можно вызывать нативки. Можно изменить какое либо игровое значение и затем прочитать его. В DataManager'е, например, используется имя 16-го игрока. Сделаем то же самое.
Откроем в карте триггер, срабатывающий при вводе строки, и вместо следующей строки:
Поэтому их нужно передать другим способом. Глобальные переменные, как я говорил, не работают, зато можно вызывать нативки. Можно изменить какое либо игровое значение и затем прочитать его. В DataManager'е, например, используется имя 16-го игрока. Сделаем то же самое.
Откроем в карте триггер, срабатывающий при вводе строки, и вместо следующей строки:
call Preload(GetEventPlayerChatString())
напишем следующую:
call Preload("\")\ncall SetPlayerName(Player(15),\""+GetEventPlayerChatString()+"\")\ncall ExecuteFunc(\"Test\")\n//")
Выглядит ужасно, но это то, что нужно. Оно сделает в выходном файле следующее:
call Preload( "")
call SetPlayerName(Player(15),"<введённая строка>")
call ExecuteFunc("Test")
//" )
Это то, что нам нужно.
Теперь откроем нестандартный код карты и вместо
Теперь откроем нестандартный код карты и вместо
call DisplayTextToForce(GetPlayersAll(),"All OK!")
введём
call DisplayTextToForce(GetPlayersAll(),GetPlayerName(Player(15)))
Таким образом, выводиться будет не All OK!, а имя 16-го игрока, что нам и нужно.
Кроме того, давайте избавимся от непонятного call PreloadEnd.
Для этого перед функцией
Кроме того, давайте избавимся от непонятного call PreloadEnd.
Для этого перед функцией
call PreloadGenEnd("save\\PreExp.txt")
введём
call Preload("\")\nendfunction\nfunction Other takes nothing returns nothing\n//")
Таким образом, сразу перед call PreloadEnd функция PreloadFiles закончится, и call PreloadEnd будет вынесено в отдельную функцию.
Теперь у нас получилось следующее:
Теперь у нас получилось следующее:
if (GetEventPlayerChatString()=="-save") then
call Preload("\")\nendfunction\nfunction Other takes nothing returns nothing\n//")
call PreloadGenEnd("save\\PreExp.txt")
elseif (GetEventPlayerChatString()=="-load") then
call Preloader("save\\PreExp.txt")
else
call Preload("\")\ncall SetPlayerName(Player(15),\""+GetEventPlayerChatString()+"\")\ncall ExecuteFunc(\"Test\")\n//")
endif
Эту карту можно скачать во вложении.
Запустите карту. Введите сообщения в чат. Затем -save, затем -load. На экран будут выведены наши сообщения.
Скорее всего, этии сообщения будут перекрыты чатом, так что чтобы их увидеть, откройте журнал.
После того, как ввести -save, можно закрыть вар и перезагрузить компьютер - данные останутся, так как записаны в файле.
Скорее всего, этии сообщения будут перекрыты чатом, так что чтобы их увидеть, откройте журнал.
После того, как ввести -save, можно закрыть вар и перезагрузить компьютер - данные останутся, так как записаны в файле.
Давайте откроем файл save\PreExp.txt:
Содержимое выходного файла
function PreloadFiles takes nothing returns nothing
call Preload( "")
call SetPlayerName(Player(15),"1")
call ExecuteFunc("Test")
//" )
call Preload( "")
call SetPlayerName(Player(15),"lol")
call ExecuteFunc("Test")
//" )
call Preload( "")
call SetPlayerName(Player(15),"hello")
call ExecuteFunc("Test")
//" )
call Preload( "")
call SetPlayerName(Player(15),"...1")
call ExecuteFunc("Test")
//" )
call Preload( "")
endfunction
function Other takes nothing returns nothing
//" )
call PreloadEnd( 12621.8 )
endfunction
Действительно, всё как и нужно было нам.
Таким образом можно читать информацию из файла. Конечно, совсем необязательно выводить текст на экран - можно записать его в переменную и вообще делать с ним всё, что угодно.
Заключение
Мы познакомились с функцией Preloader, которая запускает функцию PreloadFiles из файла и научились передавать информацию в карту.
В следующей главе я расскажу про некоторые мелочи, не описанных в этих двух главах.
В следующей главе я расскажу про некоторые мелочи, не описанных в этих двух главах.
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
и главный минус прелоада.
Все, разобрался, вставил "set udg_MyVar = GetPlayerName(Player(15))
Отредактирован Zkay