статья незакончена благо был утерян доступ к спарку. ну и хуй с ним
Краткое описание ассемблера было в поршлом номере. Теперь пару слов пора
сказать о выделении фриспейса в коде, для размещения нашего злобного кода.
Посмотрим простой дамп:
$ /usr/ccs/bin/dis -F getdents64 /kernel/genunix
**** DISASSEMBLER ****
disassembly for /kernel/genunix
section .text
getdents64()
34b28: 9d e3 bf 68 save %sp, -0x98, %sp
34b2c: 80 a6 a0 18 cmp %i2, 0x18
34b30: 1a 80 00 06 bgeu 0x34b48
# nop и на в Африке nop +4
34b34: 01 00 00 00 nop
# та же тема, call 0 естессна нахуй не надо ) +8
34b38: 40 00 00 00 call 0x34b38
34b3c: 90 10 20 16 mov 0x16, %o0
34b40: 81 c7 e0 08 ret
34b44: 91 e8 00 08 restore %g0, %o0, %o0
# 0x18 + 0x1a = 0x32
34b48: 40 00 00 00 call 0x34b48
# это вырезаем +12
34b4c: 90 10 00 18 mov %i0, %o0
# меняем на orcc %g0, %i0, %l4
34b50: a8 90 00 08 orcc %g0, %o0, %l4
34b54: 32 80 00 06 bne,a 0x34b6c
# вырезаем нах??
34b58: e6 02 20 0c ld [%o0 + 0xc], %l3
# call 0 +16
34b5c: 40 00 00 00 call 0x34b5c
34b60: 90 10 20 09 mov 0x9, %o0
34b64: 81 c7 e0 08 ret
34b68: 91 e8 00 08 restore %g0, %o0, %o0
# 0x14 + 0x32
34b6c: c4 04 e0 2c ld [%l3 + 0x2c], %g2
34b70: 80 a0 a0 02 cmp %g2, 0x2
34b74: 02 80 00 08 be 0x34b94
34b78: 05 00 00 40 sethi %hi(0x10000), %g2
34b7c: 40 00 00 00 call 0x34b7c
34b80: 90 10 00 18 mov %i0, %o0
34b84: 40 00 00 00 call 0x34b84
34b88: 90 10 20 14 mov 0x14, %o0
34b8c: 81 c7 e0 08 ret
34b90: 91 e8 00 08 restore %g0, %o0, %o0
# 0x20 + 0x02
34b94: 84 a0 80 1a subcc %g2, %i2, %g2
# 2 инструкции нахуй
34b98: 86 60 00 00 subx %g0, %g0, %g3
34b9c: 84 08 c0 02 and %g3, %g2, %g2
# меняем на add %g0, %i2, %l5
34ba0: aa 00 80 1a add %g2, %i2, %l5
34ba4: 84 07 bf f8 add %fp, -0x8, %g2
34ba8: f2 27 bf f8 st %i1, [%fp - 0x8]
34bac: c4 27 bf d0 st %g2, [%fp - 0x30]
34bb0: 84 10 20 01 mov 0x1, %g2
34bb4: ea 27 bf fc st %l5, [%fp - 0x4]
34bb8: c4 27 bf d4 st %g2, [%fp - 0x2c]
34bbc: 84 10 20 00 clr %g2
34bc0: e0 02 20 10 ld [%o0 + 0x10], %l0
34bc4: e2 02 20 14 ld [%o0 + 0x14], %l1
34bc8: 90 10 00 13 mov %l3, %o0
34bcc: e0 27 bf d8 st %l0, [%fp - 0x28]
34bd0: e2 27 bf dc st %l1, [%fp - 0x24]
34bd4: c0 27 bf e0 clr [%fp - 0x20]
34bd8: ea 27 bf f0 st %l5, [%fp - 0x10]
34bdc: c4 37 bf e4 sth %g2, [%fp - 0x1c]
34be0: c4 04 e0 14 ld [%l3 + 0x14], %g2
34be4: e0 00 a0 58 ld [%g2 + 0x58], %l0
34be8: 9f c4 00 00 jmpl %l0, %o7
34bec: 92 10 20 00 clr %o1
34bf0: c4 04 e0 14 ld [%l3 + 0x14], %g2
34bf4: 90 10 00 13 mov %l3, %o0
34bf8: 92 07 bf d0 add %fp, -0x30, %o1
34bfc: 96 07 bf cc add %fp, -0x34, %o3
34c00: e0 00 a0 40 ld [%g2 + 0x40], %l0
34c04: 9f c4 00 00 jmpl %l0, %o7
34c08: d4 05 20 18 ld [%l4 + 0x18], %o2
34c0c: c4 04 e0 14 ld [%l3 + 0x14], %g2
34c10: a2 10 00 08 mov %o0, %l1
34c14: 90 10 00 13 mov %l3, %o0
34c18: e0 00 a0 5c ld [%g2 + 0x5c], %l0
34c1c: 9f c4 00 00 jmpl %l0, %o7
34c20: 92 10 20 00 clr %o1
34c24: 80 a4 60 00 cmp %l1, 0x0
34c28: 22 80 00 08 be,a 0x34c48
34c2c: c4 07 bf f0 ld [%fp - 0x10], %g2
34c30: 40 00 00 00 call 0x34c30
34c34: 90 10 00 18 mov %i0, %o0
34c38: 40 00 00 00 call 0x34c38
34c3c: 90 10 00 11 mov %l1, %o0
34c40: 81 c7 e0 08 ret
34c44: 91 e8 00 08 restore %g0, %o0, %o0
34c48: e2 07 bf dc ld [%fp - 0x24], %l1
34c4c: a6 25 40 02 sub %l5, %g2, %l3
34c50: e0 07 bf d8 ld [%fp - 0x28], %l0
34c54: 90 10 00 18 mov %i0, %o0
34c58: e0 25 20 10 st %l0, [%l4 + 0x10]
34c5c: 40 00 00 00 call 0x34c5c
34c60: e2 25 20 14 st %l1, [%l4 + 0x14]
34c64: 81 c7 e0 08 ret
34c68: 91 e8 00 13 restore %g0, %l3, %o0
$
Словом можно много чего повырезать, главное не забыть об обновлении
оффсетов если имеются джампы.
Вот список того, что можно резать сразу:
0x40 0x00 0x00 0x00
0x01 0x00 0x00 0x00
Иногда попадается такой вот ахтунг:
104f4: 90 10 00 10 mov %l0, %o0
104f8: 92 10 00 11 mov %l1, %o1