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

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

.dynamic [Oct. 9th, 2008|07:27 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|, , ]

К 32-м нулям в .dynamic зарезервированым для prelink можно ещё добавить DT_INIT/DT_FINI (в экзешках линкер игнорирует эти таги, а в библиотеках их можно использовать, как точку входа). А можно не убивать, а заменить на DT_FLAGS со значением DF_BIND_NOW, после чего можно грохнуть команды (push .../jmp _plt) в .plt и получить 16 + <number of .plt entries>*10 байт. Можно связать освобождённое таким образом место при помощи «EB 06». И следить за тем, чтобы в собственном коде не было инструкций длинее 8 байт.
        for (i = 1; i < ehdr->e_shnum; i++)
                if (! strcmp(strtab + shdr[i].sh_name, ".plt")) {
                        for (j = 16; j < shdr[i].sh_size; j += 16) {
                                memset(m + shdr[i].sh_offset + 6 + j, 0x90, 10);
                                m[shdr[i].sh_offset + j + 14] = 0xeb;
                                m[shdr[i].sh_offset + j + 15] = 0x06;
                        }
                }
......
        for (i = 0; dyn[i].d_tag != DT_NULL; i++)
                if (dyn[i].d_tag == DT_INIT || dyn[i].d_tag == DT_FINI) {
                        dyn[i].d_tag = DT_FLAGS;
                        dyn[i].d_un.d_val = DF_BIND_NOW;
                        break;
                }

Где-то так. Ж-)
LinkLeave a comment