herm1t LIVE!ng room - [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

[May. 7th, 2008|03:59 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
Тэк-с, чей-то я тут нагенерил из таблиц qemu:
00000008 /* 00 add  C_MODRM */
00000008 /* 01 add  C_MODRM */
00000008 /* 02 add  C_MODRM */
00000008 /* 03 add  C_MODRM */
00000080 /* 04 add  C_DATA1 */
00000040 /* 05 add  C_DATA66 */
00000000 /* 06 push  */
00000000 /* 07 pop  */
...
Может быть даже получится взлететь Ж-)))

UPD А от чего бы и не получится?

 8048480:       31 ed
 8048482:       5e
 8048483:       89 e1
 8048485:       83 e4 f0 
 8048488:       50
 8048489:       54
 804848a:       52
 804848b:       68 64 8c 04 08
 8048490:       68 1c 8c 04 08
 8048495:       51
 8048496:       56
 8048497:       68 09 89 04 08
 804849c:       e8 7f ff ff ff
 ...
И так далее. А вот что плохо, так это то, что всю эту х-ню придется тестировать. Тщательно, бля. На залупастых всяких опкодах. Ненавижу.

UPD теперь с FPU

uint8_t yad_float_mem[8] = { 0x58, 0x2a, 0xe0, 0xfe, 0xb2, 0xf2, 0x04, 0x0a, }; 

uint8_t yad_float_reg[8][8] = {
0x00, /* d8 XX fadd */
0x00, /* d8 XX fmul */
0x00, /* d8 XX fcom */
0x00, /* d8 XX fcomp */
0x00, /* d8 XX fsub */
0x00, /* d8 XX fsubr */
0x00, /* d8 XX fdiv */
0x00, /* d8 XX fdivr */
0x00, /* d9 XX fld */
0x00, /* d9 XX fxch */
0xfe, /* d9 XX reg=02, RM (0-7):  fnop (bad) (bad) (bad) (bad) (bad) (bad) (bad)*/
....................................
        /* parse ModRM and SIB */
        if (flags & (C_MODRM|C_GROUP)) {
....................................
                if ((c = diza->opcode) >= 0xd8 && c <= 0xdf) {
                        c -= 0xd8;
                        if (mod != 3) {
                                if (yad_float_mem[c] & (1 << reg))
                                        return 0;
                        } else {
                                c = yad_float_reg[c][reg];
                                if (c & (1 << rm))
                                        return 0;
                        }
                }
$ gcc test2.c 
$ ./a.out 
Invalid instruction
А вот HDE:
$ gcc example.c hde32.o 
$ ./a.out 
d9 0c 00 
  length of command:  0x03
  immediate32:        0x00000000
  displacement8:      0x00
LinkLeave a comment

Comments:
From:[info]500mhz@lj
Date:May 8th, 2008 - 01:09 am
(Link)
ахуенно! но что это?
From:[info]cqwerty@lj
Date:May 8th, 2008 - 05:04 am
(Link)
Подозреваю, что очередной lde, возможно с учетом ошибок других авторов и большой уже истории дизасмо-движко-строения (с 97 года вроде как) не самый худший ;-)
From:[info]t1mreh@lj
Date:May 8th, 2008 - 05:15 am
(Link)
В точку. Ж-) Это сильно похаканый XDE. Выкинул разбор операндов (это нужно делать по другому) и сделал новую таблицу. Пока еще не тестил, но вирус с новым двиглом работает. Если интересно, то вот ссылка: http://vx.org.ua/herm1t/lj/yad01.zip