.dynamic |
[Oct. 9th, 2008|07:27 pm] |
К 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;
}
Где-то так. Ж-) |
|
|