Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Инъекция опкода в тело метода (http://www.flasher.ru/forum/showthread.php?t=215581)

DEVORON 22.05.2018 14:41

Инъекция опкода в тело метода
 
[решено]

Используя библиотеку 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.display:DisplayObjectContainer"),StaticProtectedNs("flash.display:InteractiveObject"),StaticProtectedNs("flash.display:DisplayObject"),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);

Тему можно считать закрытой)


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

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