I've documented few opcodes of the VM just to give you and example:
04 FLdRfVar -> Loads a reference to a variable into the stack. Usually references to local variables of the
current routime.
VB6:
Size: (3 bytes)
Format: 04h / SIGNED WORD Offset
Offset: Signed displacement to add to the current stack address (EBP). The result
points to and address containing a number to add to the computed address (EBP+Offset).
The result is a pointer to a local variable.
1c BranchF -> Branch if False, Jumps if the word pointed by ESP is equal to 0
VB6:
Size: (3 bytes)
Format: 1Ch / WORD Size
Size: A word indicating the number of bytes to add to the address of the
current routine or function where the BranchF is located. To obtain the
jump address you must add the relative address and the size.
To get the relative address of the current routine you must get the dword
placed on (EBP-58h)
23 FStStrNoPop : Stores a pointer to a widechar string into the stack.
Size: (3 bytes)
Format: 23h / SIGNED WORD Stack Offset
StrOffset: A signed WORD to add to EBP. The result is and address
containing the pointer to the widechar string.
On ESP you'll find the pointer to the WideChar stored in StrOffset.
64 NextI2:
VB6:
Size (5 bytes)
Format: 64h / SIGNED WORD Unknow WORD jump Offset
Jump Offset: Displacement to add to the the entry point of the current routine.
This entry point is stored in EBP-58h. ESP points to a signed word containing the
current loop counter.
These are few of the opcodes that we've documented most of them work on similars ways i think is not hard to find what each opcode does, it's simply a matter of tracing the routiine that interprets the opcode and also looking at the death listing of the vm. I leave the door open for you guys to try to figure out some of the opcodes :-)
Important thing to note is that always the interpreted use the stack to manage everything so it's very important you dig inside the values pointed by ESP, as a clue this values contains always the following:
ebp-58 -> contains a pointer to the current running routine or procedure.
ebp-50 -> a pointer to the current Form (the form object structure is defined on the www.decompiler.com forum)
ebp-54 -> pointer to a table to pointers of wide char strings (these are the string references if you prefer

)
This information is quite useful and gives you a lot of clues on how to figure out the rest of things, so go ahead the point of all this is learning
Mr. Silver