Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.05.2018, 14:41
DEVORON вне форума Посмотреть профиль Отправить личное сообщение для DEVORON Найти все сообщения от DEVORON
  № 1  
Ответить с цитированием
DEVORON

Регистрация: Jul 2014
Сообщений: 42
Checked Инъекция опкода в тело метода

[решено]

Используя библиотеку org.as3commons.bytecode изменяю в классе TestClass тело метода

Код AS3:
public function exe():void
		{
 
}
Пытаюсь добавить внутрь него следующую инструкцию
Код AS3:
classProxy.exe(arguments);
Пока удалось добавить
Код AS3:
classProxy.exe();
Следующим образом


Код AS3:
		public function injectOpcodesIntoMethod(abcFile:AbcFile):void
		{
			for (var classIndex:int = 0; classIndex < abcFile.instanceInfo.length; ++classIndex)
			{
				var instance:InstanceInfo = abcFile.instanceInfo[classIndex];
				var item:TraitInfo;
				for each (item in instance.traits)
				{
					if (item is MethodTrait)
					{
						var methodTrait:MethodTrait = item as MethodTrait;
 
 
						if (String(methodTrait.traitMultiname) == "QName[Namespace[public]:exe]")
						{
							var opcodes:Vector.<Op> = methodTrait.traitMethod.methodBody.opcodes;
 
							var qn1:QualifiedName = new QualifiedName("classProxy", LNamespace.PUBLIC);
							var op1:Op = new Op(Opcode.getlex, [qn1]);
							var nk:NamespaceKind = NamespaceKind.determineKind(22);
							var ln:LNamespace = new LNamespace(nk, "");
 
							var qn2:QualifiedName = new QualifiedName(methodTrait.traitMethod.methodName, ln);
							var op2:Op = new Op(Opcode.callpropvoid, [qn2, 0]);
 
							opcodes.splice(2, 0, op1, op2);
							break;
						}
 
					}
				}
			}
		}
Если попытаться вывести classProxy.exe(arguments); в виде опкодов через декомпил, то получаем

callpropvoid Multiname("exe",[PrivateNamespace("TestClass"),ProtectedNamespace("TestClass"),StaticProtectedNs("TestClass"),StaticProtectedNs("flash.display:Sprite"),StaticProtected Ns("flash.displayisplayObjectContainer"),StaticProtectedNs("flash.display:InteractiveObject"),StaticProtectedNs("flash.displayisplayObject"),Stati cProtectedNs("flash.events:EventDispatcher"),StaticProtectedNs("Object"),PackageNamespace(""),PackageInternalNs(""),PrivateNamespace("FilePrivateNS:Te stClass"),Namespace("http://adobe.com/AS3/2006/builtin")])

словом, невероятно длинную запись аргумента arguments.

Если кто-нибудь работал с этой библиотекой или может подсказать, как иначе внедрить внутрь метода конструкцию вида
Код AS3:
classProxy.exe(arguments);
, очень прошу)

Добавлено через 8 часов 49 минут
UPD. У меня не получилось сделать

Код AS3:
classProxy.exe(arguments);
Но удалось встроить rest-параметр и передать его в вызываемом методе. Для решения сойдёт.

Код AS3:
public function exe(... rest) : void
      {
classProxy.exe(rest);
}
Код такой, если кому нужно будет.

Код AS3:
var opcodes:Vector.<Op> = methodTrait.traitMethod.methodBody.opcodes;
 
							var testFlags:uint = 0;
							testFlags = MethodFlag.addFlag(testFlags, MethodFlag.HAS_PARAM_NAMES);
							testFlags = MethodFlag.addFlag(testFlags, MethodFlag.NEED_REST);
							methodTrait.traitMethod.flags = testFlags;
 
 
							var qn1:QualifiedName = new QualifiedName("classProxy", LNamespace.PUBLIC);
							var op1:Op = new Op(Opcode.getlex, [qn1]);
							var nk:NamespaceKind = NamespaceKind.determineKind(22);
							var ln:LNamespace = new LNamespace(nk, "");
 
							var qn2:QualifiedName = new QualifiedName(methodTrait.traitMethod.methodName, ln);
 
							var op2:Op = new Op(Opcode.callpropvoid, [qn2, 1]);
 
							var op3:Op = new Op(Opcode.getlocal_1);
 
 
							opcodes2.splice(2, 0,  op1, op5, op2);
Тему можно считать закрытой)


Последний раз редактировалось DEVORON; 23.05.2018 в 00:25.
Создать новую тему Ответ Часовой пояс GMT +4, время: 09:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 09:48.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.