Re: gdb и elf
On Sat, Nov 10, 2007 at 12:43:11AM +0300, Dmitry E. Oboukhov wrote: есть libconnect в портах freebsd - там перехватывается connect(2), дабы сделать bind(2) на локальную сторону сокета (bind адрес берется из переменной окружения CONN_ADDR). используется так: набросал такой тестик, но почему-то не раотает что-то я делаю не так? $ cat main.c #include stdio.h void foo(void) { printf(This is foo() from main\n); } int main(void) { foo(); return 0; } $ cat test_lib.c #include stdio.h void foo(void) { printf(This is foo() from library\n); } $ make clean all rm -f library.so program gcc -shared -o library.so test_lib.c gcc main.c -o program nb:[/home/dimka/test]$ LD_PRELOAD=/home/dimka/test/library.so ./program This is foo() from main или из простого бинарника функции не перехватить? похоже только библиотечную функцию -- сам не знал -- причем она должна иметь __attribute__((weak)). чтобы довести тему до конца проиллюстрируем примером. foo.c int foo() { printf(%s - %s()\n, __FILE__, __func__); return 0; } gcc -shared foo.c -o foo.so mainfoo.c int __attribute__((weak)) foo() { printf(%s - %s()\n, __FILE__, __func__); return 0; } gcc -shared mainfoo.c -o mainfoo.so main.c main() { foo(); return 0; } gcc main.c mainfoo.so -o main LD_LIBRARY_PATH=. ./main mainfoo.c - foo() LD_LIBRARY_PATH=. LD_PRELOAD=foo.so ./main foo.c - foo() если статически линковать - то уже не работает. т.е. gcc main.c mainfoo.c -o main LD_PRELOAD=./foo.so ./main mainfoo.c - foo() селяви... :( /swp -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: gdb и elf
На Sat, 10 Nov 2007 00:43:11 +0300 Dmitry E. Oboukhov [EMAIL PROTECTED] записано: или из простого бинарника функции не перехватить? Да, естественно, LD_PRELOAD - это хак на уровне shared библиотек. Обычно библиотека подгружается при первом использовании функции, а этот хак заставляет заранее загрузить функции. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: gdb и elf
В Птн, 09/11/2007 в 12:56 +0300, Dmitry E. Oboukhov пишет: как адрес функции который выдает gdb преобразовать в смещение от начала elf-файла? Судя по всему никак. То ж адрес в памяти, который зависим от состояния памяти на момент выделения. Может капнуть в сторону man dlopen: ... int dladdr(void *addr, Dl_info *info); The function dladdr() takes a function pointer and tries to resolve name and file where it is located. Information is stored in the Dl_info structure: typedef struct { const char *dli_fname;/* Filename of defining object */ void *dli_fbase; /* Load address of that object */ const char *dli_sname;/* Name of nearest lower symbol */ void *dli_saddr; /* Exact value of nearest symbol */ } Dl_info; ... Но, не уверен. Если чё получится, отпишитесь. -- Покотиленко Костик [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: gdb и elf
В Птн, 09/11/2007 в 16:38 +0300, Dmitry E. Oboukhov пишет: как адрес функции который выдает gdb преобразовать в смещение от начала elf-файла? Судя по всему никак. То ж адрес в памяти, который зависим от состояния памяти на момент выделения. Может капнуть в сторону man dlopen: насколько я понимаю все программы с одного адреса и грузятся? то есть если взять и сделать что-то вроде #include stdio.h void foo(void) { } void main(void) { printf(%d\n, (int)foo); } то как ни вызывай всегда вернет одно и тоже число На сколько я знаю это не правда. Тот эффект, который вы наблюдаете - это либо между вызовами Вашей программы состояние памяти не сильно меняется и Ваша программа грузится в одно и то же место, либо это результат работы файлового кэша. Попробуйте запомнить адрес, перегрузиться, запустить несколько ресурсоёмких программ и повторить попытку. соответственно существует прямая зависимость - смещение от начала elf и адрес в памяти. На сколько я знаю такой зависимости не существует. -- Покотиленко Костик [EMAIL PROTECTED] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: gdb и elf
09.11.07, Dmitry E. Oboukhov[EMAIL PROTECTED] написал(а): как адрес функции который выдает gdb преобразовать в смещение от начала elf-файла? Нет. Разбирать структуру elf-файла (bfd) и искать там функцию по имени. есть ли тулзы делающие что-то подобное? то есть зная имя функции получить ее смещение от начала elf? Готовых нет. Написать самому, используя libbfd. Но лучше переформулировать задачу.
Re: gdb и elf
задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? Вспоминая про российские и международные законы, лучше на самом деле переформулировать задачу. А то статья светит.
Re: gdb и elf
В сообщении от п'ятниця, 09-лис-2007 Dmitry E. Oboukhov написал(a): задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? Помучай readelf. А поиском кода по файлу не проще будет?
Re: gdb и elf
On Fri, Nov 09, 2007 at 05:42:08PM +0300, Dmitry E. Oboukhov wrote: Нет. Разбирать структуру elf-файла (bfd) и искать там функцию по имени. есть ли тулзы делающие что-то подобное? то есть зная имя функции получить ее смещение от начала elf? Готовых нет. Написать самому, используя libbfd. Но лучше переформулировать задачу. задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? возможно на это посмотреть иначе. это не совсем то, что вам хочется, но при определенных условиях может решить вашу проблему. RTLD(1) FreeBSD General Commands ManualRTLD(1) NAME ld-elf.so.1, ld.so, rtld -- run-time link-editor DESCRIPTION The ld-elf.so.1 utility is a self-contained shared object providing run- time support for loading and link-editing shared objects into a process' address space. It is also commonly known as the dynamic linker. It uses the data structures contained within dynamically linked programs to determine which shared libraries are needed and loads them using the mmap(2) system call. ... LD_PRELOAD A list of shared libraries, separated by colons and/or white space, to be linked in before any other shared libraries. If the directory is not specified then the directories specified by LD_LIBRARY_PATH will be searched first followed by the set of built-in stan- dard directories. This variable is unset for set- user-ID and set-group-ID programs. ... есть libconnect в портах freebsd - там перехватывается connect(2), дабы сделать bind(2) на локальную сторону сокета (bind адрес берется из переменной окружения CONN_ADDR). используется так: export LD_PRELOAD=/usr/local/lib/libconnect.so export CONN_ADDR=1.2.3.4 ./program --op1 --op2 попробуйте переписать и перегрузить нужную вам функцию по аналогии. ;) /swp -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: gdb и elf
На Fri, 9 Nov 2007 17:46:17 +0300 Alexey Pechnikov [EMAIL PROTECTED] записано: задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? Вспоминая про российские и международные законы, лучше на самом деле переформулировать задачу. А то статья светит. Если у тебя есть лицензия на использование этого бинарника, то как раз в том, чтобы пропатчить что-то ничего противозаконного нет. Именно с точки зрения российского законодательства. Да и с точки зрения американского - тоже (если это в рамках fair use). До тех пор, пока ты не нарушаешь DMCA. -- Best regards, Alexander GQ Gerasiov Contacts: e-mail: [EMAIL PROTECTED] Homepage: http://gq.net.ru signature.asc Description: PGP signature
Re: gdb и elf
В сообщении от Friday 09 November 2007 20:36:13 Alexander GQ Gerasiov написал(а): На Fri, 9 Nov 2007 17:46:17 +0300 Alexey Pechnikov [EMAIL PROTECTED] записано: задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? Вспоминая про российские и международные законы, лучше на самом деле переформулировать задачу. А то статья светит. Если у тебя есть лицензия на использование этого бинарника, то как раз в том, чтобы пропатчить что-то ничего противозаконного нет. Именно с точки зрения российского законодательства. Да и с точки зрения американского - тоже (если это в рамках fair use). До тех пор, пока ты не нарушаешь DMCA. Про лицензию ничего не упоминалось, да и понятия лицензии на ПО в законах я не встречал, только экземпляр программы для ЭВМ или базы данных. Потом, возникает вопрос намерений - входит ли требуемое изменение в понятие адаптация или нет. пропатчить что-то ничего противозаконного нет - в общем случае утверждение не верное. Например, пропатчить оффтопик для запуска на всех машиных организации дело как раз подсудное.
Re: gdb и elf
09.11.07, Dmitry E. Oboukhov[EMAIL PROTECTED] написал(а): задача стоит в том что надо пропатчить бинарник. исходника нет :) необходимая функция gdb находится а вот дальше как перейти к файлу elf? Помучай readelf. спасибо посмотрю А поиском кода по файлу не проще будет? поиском находится несколько мест, а функция одна objdump -x ./a.out 00400478 foo: 400478: 55 push %rbp 400479: 48 89 e5mov%rsp,%rbp 40047c: c9 leaveq 40047d: c3 retq В общем если посмотреть в файле по адресу 0x478, то там эти самые байтики и есть. -- Regards, Yuri Kozlov
Re: gdb и elf
тут никаких противозаконных действий: имеетс софтина которая писалась наемным программером, тот уволился, исходники потом потерялись т.к. были никому неинтересны Для меня это достаточное объяснение, а вот с точки зрения закона авторские права _всегда_ принадлежат разработчику (имущественные - работодателю, но это еще надо доказать). Это создает множество потенциальных проблем. Лицо, правомерно владеющее экземпляром программы для ЭВМ или базы данных, вправе без получения дополнительного разрешения правообладателя осуществлять любые действия, связанные с функционированием программы для ЭВМ или базы данных в соответствии с ее назначением, в том числе запись и хранение в памяти ЭВМ, а также исправление явных ошибок. Запись и хранение в памяти ЭВМ допускаются в отношении одной ЭВМ или одного пользователя в сети, если иное не предусмотрено договором с правообладателем. Вносимые вами изменения соответствуют ли назначению программы?.. Если где-то в сопроводительных доках или в интерфейсе программы что-то покажет, что это не так, ваши действия незаконны. Имущественные права на программу для ЭВМ или базу данных, созданные в порядке выполнения служебных обязанностей или по заданию работодателя, принадлежат работодателю, если в договоре между ним и автором не предусмотрено иное. Если запустите на двух компах, а оформленного договора нет, возможны коллизии. Ибо количество экземпляров, которые принадлежат работодателю, может зависеть от назначения программы и принципиально допустимо утверждать, что обладатель имущественных прав имеет их в отношении одного экземпляра. Прецедентов подобного рода я лично не встречал, но допускаю их существование. теперь вдруг стала задача: надо задизаблить одно обращение, а исходники утеряны типа (работодатель - балбес, что поделаешь придется ему по новой на разраотку программы раскошеливаться, раз исходники сохранить не может) Вообще здорово, а как же работодатель докажет свое право на программу? Если есть только бинарь, может, работодатель его у работника украл? Поскольку регистрация программы является делом добровольным и наверняка не проводилась, а так же скорее всего не было письменного приказа на создание данной программы, положение юридически шаткое. ну в общем враппер попробую с перехватом функции, либо просто целиком заново перепишу Ай-яй-яй, а как же информация, полученная в результате этого декомпилирования, может использоваться лишь для организации взаимодействия независимо разработанной данным лицом программы для ЭВМ с другими программами, а не для составления новой программы для ЭВМ, по своему виду существенно схожей с декомпилируемой программой для ЭВМ или для осуществления любого другого действия, нарушающего авторское право; Если поковыряете эту программу, то создавать по виду существенно схожую уже не имеете права. Почитайте ЗАКОН от 23 сентября 1992 г. N 3523-I О правовой охране программ для электронных вычислительных машин и баз данных http://www.relcom.ru/Archive/1997/ComputerLaw/RussiaLaws/Zak_soft.htm
Re: gdb и elf
Интересный вы вопрос подняли. С юридической точки зрения, разумеется. В результате халатности работодателя и работника потеряны исходные коды программы, закон такую ситуацию ну никак не предусматривает. Собственно, программу следует ставить на баланс предприятия, тогда и вопросов не будет, вот бы услышать success story об этом. Отечественные юристы являются специалистами по промышленному праву, но не по авторскому, посему вопрос не тривиален.
Re: gdb и elf
09.11.07, Dmitry E. Oboukhov[EMAIL PROTECTED] написал(а): чтоб это все потребовалось доказывать нужна пострадавшая сторона которая иски учинять будет :) По слухам из интернета (ссылку потерял, найти не смог :) в этой области это уже не так - пострадавшая сторона не нужна.
Re: gdb и elf
Dmitry E. Oboukhov [EMAIL PROTECTED] writes: чтоб это все потребовалось доказывать нужна пострадавшая сторона которая иски учинять будет :) Российские госструктуры взяли на себя расширенные и углубленные обязательства: покарать виновного, не дожидаясь заявления пострадавшей стороны. Видать, IT-рэкет оказался прибыльным делом. -- JID: [EMAIL PROTECTED]