[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bcel-user
Subject:    Re: How to replace a complete instruction in J2ME Bytecode
From:       "Klaus Teller" <klaus.teller () gmx ! net>
Date:       2009-02-16 4:53:08
Message-ID: 20090216045308.65880 () gmx ! net
[Download RAW message or body]

Hi Arin,

I would like to follow up on this problem. Right now, i can indeed replace the method \
following your instruction. The method i'm replacing is Connector.open. I can replace \
it with another MyConnector.open. 

The only problem i have now is that in my custom open method, if i'm not able to call \
methods from other objects. The following error message is produced:

Approximate bytecode offset 3: Inconsistent or missing stackmap at target

Any idea how i can address this?

Thanks,

Klaus.


 
-------- Original-Nachricht --------
> Datum: Tue, 10 Feb 2009 16:27:08 +1100
> Von: Arrin Daley <arrin.daley@anu.edu.au>
> An: BCEL Users List <bcel-user@jakarta.apache.org>
> Betreff: Re: How to replace a complete instruction in J2ME Bytecode

> Hi Klaus
> 
> I've primarily only used JavaClass but should've probably used ClassGen.
> 
> Do you do a MethodGen.getMethod()? this returns a Method object which 
> you should then make part of the JavaClass (via JavaClass.setMethods()) 
> or ClassGen (via setMethods() or setMethodAt()) which you got the method 
> from. Your supposed to do a setMaxStack() and setMaxLocals() before a 
> call to getMethod() but your changes shouldn't change the stack or local 
> variables, but it's probably good practice.
> 
> You will also have to get a ConstantPool via 
> ConstantPoolGen.getFinalConstantPool() and make this part of your 
> JavaClass, I don't think it's required for ClassGen as I think it 
> happens when you ask for a JavaClass, not sure though, you might need to 
> check.
> Note: sorry I remembered constant pools being associated with methods 
> but they're associated with the class.
> 
> Basically you need to make sure your changes take effect in the 
> JavaClass before you dump it, so ConstantPoolGen needs to create a new 
> ConstantPool, MethodGen needs to create a new Method, and ClassGen (if 
> you use it) needs to create a new JavaClass, otherwise the JavaClass 
> will continue to have the old state and that's what will be dumped.
> ClassGen may take care of some of this for you via getJavaClass().
> 
> Hope it helps,
> 
> Bye Arrin
> 
> 
> Klaus Teller wrote:
> > Hi Arin,
> > 
> > Thanks for your feedback; very insightful. I went through all the steps,
> identified the right invokestatic, added it into the constant pool, and
> updated the index of the invokestatic. 
> > 
> > Right now, the only issue i'm having is that the dump doesn't include my
> changes, which might indicate that something is missing.
> > 
> > Any idea?
> > 
> > If you wish, i can send you the code offline.
> > 
> > Thanks again,
> > 
> > Klaus.
> > 
> > 
> > -------- Original-Nachricht --------
> > 
> > > Datum: Tue, 10 Feb 2009 12:32:16 +1100
> > > Von: Arrin Daley <arrin.daley@anu.edu.au>
> > > An: BCEL Users List <bcel-user@jakarta.apache.org>
> > > Betreff: Re: How to replace a complete instruction in J2ME Bytecode
> > > 
> > 
> > 
> > > Hi Klaus
> > > 
> > > You'll need to find the INVOKESTATIC instruction first, if you have an 
> > > idea which methods and classes the call(s) exist in this will help, 
> > > InstructionFinder is about finding a pattern of instructions you could 
> > > use it to find INVOKESTATIC instructions but that would probably be 
> > > overkill, you could just use an iterator or something similar.
> > > 
> > > Once you have found the INVOKESTATIC instructions you could then test
> to 
> > > see which one(s) match your function call, you could do this by looking
> > > at the classname and method name and possibly arguments the other way 
> > > would be to look up the index for the method in the constant pool (if
> it 
> > > exists in the constant pool, don't put it in if it doesn't) and compare
> > > this index to that of the INVOKESTATIC instruction which you have
> found. 
> > > If the static method doesn't exist in the constant pool then there
> isn't 
> > > a call to that static method in the code your currently looking at so 
> > > you could move on to the next method to search.
> > > 
> > > Once you find an INVOKESTATIC that matches you need to put your new 
> > > static method in the constant pool via a ConstantPoolGen, this will 
> > > return an index which you can then use with the setIndex method on the 
> > > INVOKESTATIC instruction. You can use the setIndex because you are just
> > > changing the target of INVOKESTATIC instructions, otherwise you would 
> > > have to replace the instruction itself.
> > > 
> > > I'm not sure what other finalising things you will need to do, the 
> > > ConstantPool, ConstantPoolGen  will have changed so will need to 
> > > finalise that, and you will have to get a Method from the MethodGen 
> > > object you previously had but I think that's about all...
> > > 
> > > Another way might be to define an InstructionVisitor overriding the 
> > > visit method for INVOKESTATIC to find and edit the appropriate
> > > instructions.
> > > 
> > > Hope it helps
> > > 
> > > Bye Arrin
> > > 
> > > Klaus Teller wrote:
> > > 
> > > > Hi Folks,
> > > > 
> > > > I have a J2ME Library that contains the following instruction:
> > > > 
> > > > invokestatic
> > > > 
> > > 
> javax/microedition/io/Connector/open(Ljava/lang/String;IZ)Ljavax/microedition/io/Connection;
> 
> > > 
> > > > I would like to replace it with:
> > > > 
> > > > invokestatic
> > > > 
> > > 
> mypackage/AlphaConnector/open(Ljava/lang/String;IZ)Ljavax/microedition/io/Connection;
> 
> > > 
> > > > What do i need to do?
> > > > 
> > > > I couldn't find a way to search instruction based on the operand (that
> > > > 
> > > is the second part of the instruction). I tried IntructionFinder; but
> it
> > > couldn't help me. 
> > > 
> > > > I would very much appreciate any input.
> > > > 
> > > > Thanks,
> > > > Klaus.
> > > > 
> > > > 
> > > > 
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
> > > For additional commands, e-mail: bcel-user-help@jakarta.apache.org
> > > 
> > 
> > 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: bcel-user-help@jakarta.apache.org

-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: \
http://www.gmx.net/de/go/multimessenger01

---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-user-help@jakarta.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic