[Top][All Lists]
[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Penalyze2-commit] penalyze2 ChangeLog src/vm.c src/vm_ins/vm_ins_...,
Stephan Peijnik <=