penalyze2-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Penalyze2-commit] penalyze2 ChangeLog src/vm.c src/vm_ins/vm_ins_...


From: Stephan Peijnik
Subject: [Penalyze2-commit] penalyze2 ChangeLog src/vm.c src/vm_ins/vm_ins_...
Date: Sun, 17 Sep 2006 09:54:00 +0000

CVSROOT:        /sources/penalyze2
Module name:    penalyze2
Changes by:     Stephan Peijnik <sp>    06/09/17 09:54:00

Modified files:
        .              : ChangeLog 
        src            : vm.c 
        src/vm_ins     : vm_ins_pop.c vm_ins_push.c vm_ins_xchg.c 

Log message:
        src/vm.c:
                        Fix bug in vm_op_get_addresses
        src/vm_ins/vm_ins_*.c:
                        Make use of new methods for instruction handlers

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/penalyze2/ChangeLog?cvsroot=penalyze2&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/penalyze2/src/vm.c?cvsroot=penalyze2&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/penalyze2/src/vm_ins/vm_ins_pop.c?cvsroot=penalyze2&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/penalyze2/src/vm_ins/vm_ins_push.c?cvsroot=penalyze2&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/penalyze2/src/vm_ins/vm_ins_xchg.c?cvsroot=penalyze2&r1=1.1&r2=1.2

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/penalyze2/penalyze2/ChangeLog,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- ChangeLog   4 Sep 2006 10:45:10 -0000       1.4
+++ ChangeLog   17 Sep 2006 09:53:59 -0000      1.5
@@ -1,3 +1,9 @@
+2006-09-17 Stephan Peijnik <sp at sp dot or dot at>
+
+       * Fix bug in vm_op_get_addresses
+       * Make use of new methods for instruction handlers in push, pop and xchg
+       * Write vm_debug() messages to stdout instead of stderr
+
 2006-09-04 Stephan Peijnik <sp at sp dot or dot at>
   
     * Actually add and commit PE_LOADER and GFDL this time.

Index: src/vm.c
===================================================================
RCS file: /sources/penalyze2/penalyze2/src/vm.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/vm.c    4 Sep 2006 10:31:46 -0000       1.2
+++ src/vm.c    17 Sep 2006 09:54:00 -0000      1.3
@@ -216,8 +216,9 @@
   vsnprintf(buf, sizeof(buf), fmt, va);
   va_end(va);
   
-  fprintf(stderr, "%s\n", buf);
-  fflush(stderr);
+  /* we are now printing to stdout again */
+  fprintf(stdout, "%s\n", buf);
+  fflush(stdout);
 }
 
 void
@@ -562,6 +563,28 @@
     case OPERAND_TYPE_IMMEDIATE:
       assert(op->basereg == REGISTER_NOP);
       *virt = vm_value_signed(op->immediate, op->immbytes);
+      *real = &op->immediate;
+      
+      switch(MASK_OT(op->flags))
+      {
+        case OT_b:
+          *size = sizeof(byte);
+        break;
+        
+        case OT_w:
+          *size = sizeof(word);
+        break;
+        
+        case OT_v:
+          *size = sizeof(dword);
+        break;
+        
+        default:
+          vm_debug(0, "vm_op_get_addresses: operand type 0x%x unknown",
+                   MASK_OT(op->flags));
+          vm_exit(vm_ctx, 255);
+        break;
+      }
       
       /* automagically add eip if needed */
       if (MASK_AM(op->flags) == AM_J)

Index: src/vm_ins/vm_ins_pop.c
===================================================================
RCS file: /sources/penalyze2/penalyze2/src/vm_ins/vm_ins_pop.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/vm_ins/vm_ins_pop.c     17 Aug 2006 20:03:40 -0000      1.1
+++ src/vm_ins/vm_ins_pop.c     17 Sep 2006 09:54:00 -0000      1.2
@@ -26,15 +26,7 @@
 unsigned int
 vm_ins_pop(struct vm_ctx *vm_ctx, struct vm_ins_ctx *vm_ins_ctx)
 {
-  POPERAND op;
-  dword op_type;
-  dword op_virt;
-  void *op_real;
-  dword op_size;
-  dword *dst;
-  
-  op = &vm_ins_ctx->ins.op1;
-  op_type = vm_op_get_addresses(vm_ctx, op, &op_virt, &op_real, &op_size);
+  dword val;
   
   /* leave instruction */
   if (vm_ins_ctx->ins.opcode == 0xc9)
@@ -44,16 +36,12 @@
     return 0;
   }
   
-  if ((op_type == OPERAND_TYPE_MEMORY) || (op_type == OPERAND_TYPE_REGISTER))
+  if (!(vm_ins_ctx->op0.flags & VM_OP_FLAG_PRESENT))
   {
-    dst = (dword*) op_real;
-    *dst = vm_stack_pop(vm_ctx);
-    
-    return 0;
-  }
-  else if (op_type == OPERAND_TYPE_NONE)
-  {
-    dword val;
+    vm_debug(0, "vm_ins_pop: maybe popa? opcode = 0x%.2x",
+             vm_ins_ctx->ins.opcode);
+    vm_exit(vm_ctx, 255);
+    /* this point is never reached, we need to do some research here */
     
     /* probably popa  */
     val = vm_ctx->regs.esp;
@@ -70,5 +58,30 @@
     return 0;
   }
   
+  /* get dword from stack */
+  val = vm_stack_pop(vm_ctx);  
+  
+  
+  switch(vm_ins_ctx->op0.size)
+  {
+    case 1:
+      *((byte *) vm_ins_ctx->op0.real_addr) = (byte) val;
+    break;
+    
+    case 2:
+      *((word *) vm_ins_ctx->op0.real_addr) = (word) val;
+    break;
+    
+    case 4:
+      *((dword *) vm_ins_ctx->op0.real_addr) = val;
+    break;
+    
+    default:
+      vm_debug(0, "vm_ins_pop: unknown operand size: %d",
+        vm_ins_ctx->op0.size);
   return 1;
+    break;
+  }
+  
+  return 0;
 }

Index: src/vm_ins/vm_ins_push.c
===================================================================
RCS file: /sources/penalyze2/penalyze2/src/vm_ins/vm_ins_push.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/vm_ins/vm_ins_push.c    4 Sep 2006 10:31:47 -0000       1.2
+++ src/vm_ins/vm_ins_push.c    17 Sep 2006 09:54:00 -0000      1.3
@@ -32,6 +32,11 @@
   /* no operand flags present... */
   if (!(vm_ins_ctx->op0.flags & VM_OP_FLAG_PRESENT))
   {
+    vm_debug(0, "vm_ins_push: maybe pusha? opcode = 0x%.2x",
+                vm_ins_ctx->ins.opcode);
+    vm_exit(vm_ctx, 255);
+    /* this point is never reached, we need to do some research here */
+    
     /* probably pusha */
     val = vm_ctx->regs.esp;
     vm_stack_push(vm_ctx, vm_ctx->regs.eax);

Index: src/vm_ins/vm_ins_xchg.c
===================================================================
RCS file: /sources/penalyze2/penalyze2/src/vm_ins/vm_ins_xchg.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/vm_ins/vm_ins_xchg.c    17 Aug 2006 20:03:40 -0000      1.1
+++ src/vm_ins/vm_ins_xchg.c    17 Sep 2006 09:54:00 -0000      1.2
@@ -26,48 +26,48 @@
 unsigned int
 vm_ins_xchg(struct vm_ctx *vm_ctx, struct vm_ins_ctx *vm_ins_ctx)
 {
-  POPERAND op1;
-  POPERAND op2;
-  dword op1_type, op2_type;
-  dword op1_virt, op2_virt;
-  void *op1_real, *op2_real;
-  dword op1_size, op2_size;
-  dword tmp = 0;
-  dword *p1 = 0x0;
-  dword *p2 = 0x0;
+  dword tmp;
   
-  op1 = &vm_ins_ctx->ins.op1;
-  op2 = &vm_ins_ctx->ins.op2;
-
-  op1_type = vm_op_get_addresses(vm_ctx, op1, &op1_virt, &op1_real, &op1_size);
-  op2_type = vm_op_get_addresses(vm_ctx, op2, &op2_virt, &op2_real, &op2_size);
-
-
-  if ((op1_type == OPERAND_TYPE_REGISTER) || (op1_type == OPERAND_TYPE_MEMORY))
-  {
-    p1 = (dword *) op1_real;
-  }
-  else
+  /* xchg needs two operands... */
+  if (!(vm_ins_ctx->op0.flags & VM_OP_FLAG_PRESENT) ||
+      !(vm_ins_ctx->op1.flags & VM_OP_FLAG_PRESENT))
   {
-    vm_debug(0, "vm_ins_xchg: operand 1 type %s unsupported",
-             vm_op_type(op1_type));
+    vm_debug(0, "vm_ins_xchg: xchg needs two parameters");
     return 1;
   }
 
-  if ((op2_type == OPERAND_TYPE_REGISTER) || (op2_type == OPERAND_TYPE_MEMORY))
-  {
-    p2 = (dword *) op2_real;
-  }
-  else
+  /* we only need to check for one operand size here
+   * afaik xchg is not possible with different size operands
+   */
+  switch(vm_ins_ctx->op0.size)
   {
-    vm_debug(0, "vm_ins_xchg: operand 2 type %s unsupported",
-             vm_op_type(op2_type));
+    case 1:
+      tmp = (dword) *((byte *) vm_ins_ctx->op0.real_addr);
+      *((byte *) vm_ins_ctx->op0.real_addr) = 
+        *((byte *) vm_ins_ctx->op1.real_addr);
+      *((byte *) vm_ins_ctx->op1.real_addr) = (byte) tmp;
+    break;
+    
+    case 2:
+      tmp = (dword) *((word *) vm_ins_ctx->op0.real_addr);
+      *((word *) vm_ins_ctx->op0.real_addr) =
+        *((word *) vm_ins_ctx->op1.real_addr);
+      *((word *) vm_ins_ctx->op1.real_addr) = (word) tmp;
+    break;
+    
+    case 4:
+      tmp = *((dword *) vm_ins_ctx->op0.real_addr);
+      *((dword *) vm_ins_ctx->op0.real_addr) =
+        *((dword *) vm_ins_ctx->op1.real_addr);
+      *((dword *) vm_ins_ctx->op1.real_addr) = tmp;
+    break;
+    
+    default:
+      vm_debug(0, "vm_ins_xchg: op0 has unknown operand size %d",
+              vm_ins_ctx->op0.size);
     return 1;
+    break;
   }
   
-  tmp = *p1;
-  *p1 = *p2;
-  *p2 = tmp;
-  
   return 0;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]