Как в AS3 извлекать данные из объекта в буфер обмена, отдых, базу данных, файл и т. Д.?

По сути, я пишу мод пользовательского интерфейса для игры.

Поддерживает загрузку файлов SWF для управления пользовательским интерфейсом.

Я уже создал fla с проектом AS3 с текстовой областью, который действует как регистратор и печатает все, что мне нужно, проблема в том, что у меня нет возможности извлечь оттуда данные.

Я пробовал:

  1. Буфер обмена с MouseEvent и без него (как указано в документации) - не работает.

Clipboard.generalClipboard.formats возвращает пустой массив.

Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, 'myData') буквально ничего не делает (с сериализацией и без нее).

  1. Запись в файл вызывает исключение, код ошибки отличается в зависимости от подхода (1001, 1006 и т. Д., Точно не помню)

  2. Ошибка отправки HTTP-запроса на ioerrorevent 1006

  3. Попытка подключиться к локальной БД - MySQL или SQLite также не удается

Я предполагаю, что все эти проблемы каким-то образом блокируются самой игрой, чтобы моддеры не раскрывали важные данные.

Проблема еще и в том, что буквально нет документации и большинство авторов модов не используют взаимодействие с файловой системой и / или http-запросами.

Те моддеры, которые смогли записать в файл - либо игнорируют, либо месяцами не работают.

Итак, вопрос: Есть ли способ раскрыть какие-то данные из игры? Буквально все, что будет работать, будет соответствовать моим потребностям.

Для тех, кому интересно - я хочу написать рынок для продажи внутриигровых предметов (только за внутриигровую валюту) и сделать свою работу с открытым исходным кодом, как только это будет сделано.

На всякий случай - использование любого из этих подходов в самой среде IDE работает нормально, так что я предполагаю, что это каким-то образом блокируется игрой.

У меня была идея какой-то инъекции DLL или чего-то еще, но Google говорит, что это невозможно.

SWF-файл загружается во время выполнения в игре.

UPD:

Я новичок в ActionScript и самом Flash, буквально это мой самый первый любимый проект.

Ни один из AIR недоступен. Для своего самого первого теста я декомпилировал уже созданный мод и сделал некоторые пользовательские изменения (например, переименованный текст, просто чтобы убедиться, что он работает).

Компиляция выполняется через Adobe Flash CS6, я открываю FLA-файл и использую публикацию с FlashPlayer 11.2 и AS3.

Затем скомпилированный swf помещается в специальный архив (как того требует игра) и все. Мод работает, но я не могу извлечь данные из самой игры. Все, что позволит мне захватить данные в файл, буфер обмена, базу данных, отправить запрос сокета и т. Д., Будет работать для моих целей.

Я также пробовал компилировать с возможностью доступа только к локальному и только к сети - каждый раз одно и то же, для:

  • http Я получаю ошибку IOError, что-то вроде [IOErrorEvent type = ioError bubble = false cancelable = false eventPhase = 2 text = Ошибка № 2031: Ошибка сокета. URL: http: // localhost: 4567 / testEndpoint? Test = myTestData] - при запуске приложения с Adobe Flash работает отлично; если работает как часть мода, загружается в игре - нету
  • файл просто невозможно использовать, так как он является частью AIR
  • socket - мне удалось sometimes получить запрос файловой полиции на бэкэнде, и я ответил на него, как было упомянуто в документации, а затем - в сокет ничего не поступает.
  • база данных буквально не работает, я использовал довольно старые библиотеки, нашел на github
  • Буфер обмена - Clipboard.generalClipboard.setData - ничего не делает; System.setClipboard() - ничего не делает, ошибок вообще нет
  • fscommand ('exec', 'sample.exe') - на всякий случай попробовал, согласно документации - не работает (поместите exe-файл в каталог fscommand рядом с исполняемым файлом и самим модом, только в кейс)

Я также добавил это:

Security.allowDomain("*");
Security.allowInsecureDomain("*");

Подход dxgi.dll, упомянутый в комментариях, работает с множеством проблем, но это может быть причиной того, что игра очень часто вылетает, поэтому, боюсь, я не смогу пройти проверку мода перед публикацией.

Так что в основном у меня нет идей.

Был бы признателен за любую помощь в этом.

На всякий случай - документации как модифицировать игру совершенно нет ...


person Serhii Daskaliesku    schedule 23.07.2020    source источник
comment
Просто немного подумал. Я думаю, что в той игре, которую вы упомянули, есть специальная сборка Flash Player, в которой они отменяют выбор определенных классов и возможностей. У вас есть официальная документация по игре со всеми (не) поддерживаемыми функциями. В качестве альтернативы, если у вас есть доступ к моду с возможностью записи файлов, вы можете (не могу поверить, что предлагаю это) декомпилировать их SWF и найти классы / код, которые они используют для записи файла.   -  person Organis    schedule 24.07.2020
comment
Вот и проблема - документации нет вообще. Официально моддинг объявлен, что он будет запущен где-то в этом году, но сама возможность уже существует с документацией. Я уже копался во всех SWF-файлах (в основном во всем пользовательском интерфейсе, созданном на их основе), и нет ничего особенного или каких-либо ограничений, так что, возможно, он ограничен где-то в другом месте, Во-первых, я связался с автором мода, который записывает в файл, использует некоторый модифицированный dxgi.dll и не знает, как его использовать, поскольку часть записи была сделана другим человеком, которого сейчас нет. слишком сложно   -  person Serhii Daskaliesku    schedule 24.07.2020
comment
@SerhiiDaskaliesku Непонятно ... Вы сами создали текстовую область (регистратора) или она является частью какого-то другого импортированного SWF? (1) Если он создан, когда он зарегистрировал все необходимые данные, почему бы просто не поместить содержимое textArea.text в какую-нибудь другую переменную, например String, и использовать по мере необходимости? (например: сохранить на диск). (2) Если импортировано, вы можете попробовать узнать (может быть, с помощью декомпилятора?) имя var (или instance) текстовой области, а затем извлеките его с помощью некоторого пути, например myString = myLoadedSWF.textArea.text; ...   -  person VC.One    schedule 24.07.2020
comment
@ VC.One это gist MyMod - на самом деле простой мод с одним текстовым полем в качестве регистратора, работает отлично. второй - это часть основного SWF-файла, который загружает пользовательские (пользовательские) SWF-файлы, и он работает для меня в любом случае, кроме установки данных в буфер обмена, при загрузке моего мода в игру (регулярный запуск моего SWF-файла работает так, как я ожидал) . То же самое относится ко всем другим подходам, которые я использовал - db, http, file - ничего не работает, когда он загружается в родительский swf.   -  person Serhii Daskaliesku    schedule 24.07.2020
comment
Чтобы уточнить - я декомпилирую родительский SWF в файлы и fla-файл, вношу необходимые изменения и компилирую обратно в swf. Я сделал это впервые с уже созданным модом, просто чтобы проверить, работает ли он, и да, он работает, поэтому я не думаю, что проблема здесь ...   -  person Serhii Daskaliesku    schedule 24.07.2020
comment
Вы не думали о том, чтобы вместо этого поместить свой мод в основной SWF? Загрузка может накладывать дополнительные ограничения на внешний SWF-файл.   -  person Organis    schedule 24.07.2020
comment
То же самое, не работает :( Я тестирую только в буфере обмена, но буквально ЛЮБОЙ вариант извлечения определенных данных из игры во время выполнения будет работать.   -  person Serhii Daskaliesku    schedule 24.07.2020


Ответы (1)


Это расширенный комментарий относительно вашего показанного примера кода.

Сначала проверьте простейший способ получить текст из переменной mylogger (без буфера обмена).

Создайте и запускайте какую-нибудь функцию extract_LoggerText(); всякий раз, когда необходимо ввести myLogger текст в вашу строку.

Попробуйте отрегулировать BasicModLoader.as, как показано ниже:

import flash.display.Loader;
 ...      

public var __myModLoader :Loader;
public var loadedSWF :MovieClip;
public var myString :String = "";  

public function ModLoaderCtr()
{
    ....
    
    __myModLoader = new Loader();
    __myModLoader.addEventListener(Event.COMPLETE, on_SWFLoadComplete);
    __myModLoader.load(new URLRequest("MyAwesomeMod.swf"),new LoaderContext(false,ApplicationDomain.currentDomain));
    //__myModLoader.load( new URLRequest("MyAwesomeMod.swf") ); //# or try basic without ApplicationDomain
}

public function on_SWFLoadComplete (evt:Event)
{   
    loadedSWF = MovieClip(evt.target.content);
    addChild(loadedSWF);
    
    //extract_LoggerText(); //# run this function later when logger has some text content...
}

public function extract_LoggerText() : void
{
    myString = loadedSWF.myLogger.text;
    trace ( " Extracted Text Check : \n" + myString ); //# should be logger text here
}
person VC.One    schedule 27.07.2020
comment
Спасибо за ваш вклад! Да, я смог получить реквизит ребенка в родительском, но все равно ни один из вариантов извлечения данных не работает. Я нашел парня, который написал собственный dxdi.dll файл с сокетами и записью файлов для этих целей, во время выполнения его dll при загрузке просматривает все корневые сцены для специальной именованной переменной и вводит туда фактическую логику. На данный момент это единственный рабочий вариант .. - person Serhii Daskaliesku; 29.07.2020
comment
К сожалению, это слишком сложно. Есть тонны SWF-файлов, которые загружают во время выполнения еще один, а один загружает еще раз и так далее ... Буквально я перепробовал все, о чем мог подумать - при запуске простого приложения в Adobe Flash все работает отлично, но как только оно загружен в игру как мод - ничего не работает, вроде бы все http запросы запрещены; буфер обмена отключен и так далее. Если это правда - можно ли это сделать с помощью SWF-файла? Есть ли обходные пути? Я также пробовал все упомянутые действия в родительском swf - то же самое, не работает - person Serhii Daskaliesku; 31.07.2020