как между процессами разделить секцию неинициализированных данных?

Предыдущая тема Следующая тема Перейти вниз

как между процессами разделить секцию неинициализированных данных?

Сообщение  electrik в Вт Июн 16, 2009 9:50 pm

вот столкнулся с проблемой в fb, надо сделать чтоб секция неинициализированных данных .bss, разделялась между процессами. надо это сотворить в dll. короче, что надо передать линкеру? на асме это просто. суть. надо написать перехватчик, он работает как dll.
попробую написать иначе, надо в dll, сделать так, чтоб переменная была доступна всем процессам, тоесть, когда к dll обращаются 5 прог, чтоб они видели значение переменной. просто поумолчанию в dll, секция неинициализированных данных не разделяется.
соответственно, если изменять какую-нибудь переменную в dll, и когда я вызову другую программу но с той-же dll, код будет общий, а значения переменных разные.
в моем случае, мне нужно открыть секцию для всех процессов.
я смотрел ld.exe --help, но там как-то неразобрался, если кто знает все параметры, плиз, опишите.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как между процессами разделить секцию неинициализированных данных?

Сообщение  electrik в Пт Июн 19, 2009 10:22 pm

ну вот, мною найдено решение. тупой патчинг dll.
только предупреждаю, ни каких проверок нет. патчить только fb'шные dll.
у каждого компилятора свое количество секций. короче типа тупо патчим определенный адрес.
код:
#include "file.bi"
dim a as uinteger
a=&h00000080+&h10000000+&h40000000+&h80000000
if fileexists(command) then
open command for binary as #1
put #1,&h214+1,a ' патчим флаг в таблице .bss
close
print"patched"
else
print "file not found"
end if

если интересно, как узнать адрес флага в .bss без знания ассемблера, ставим программу exescope, открываем dll, лезем:
header/Section Header/.bss
и смотрим самый последний элемент в списке. там будет смещение флага в файле, и сам флаг.
впринципе, можно peexplorer, но это на ваш выбор.
пока так и не откопал опцию в линкере, подозреваю, что в ld, этого вообще нет. почитал старенький русский ман, там ни слухом ни духом.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как между процессами разделить секцию неинициализированных данных?

Сообщение  electrik в Чт Июн 25, 2009 5:56 pm

ну и еще простой метод открыть секцию .bss. качаем:
http://alchemister777.narod.ru/exetools/petools156002005.rar
запускаем программу
выбираем в меню "Tools/Pe Editor",
появится окно открытия файла, открываем нужную dll,
жмем кнопку "Sections",
в списке жмем правой кнопкой мыши по секции .bss,
выбираем "Edit Section Header",
жмем ...,
ставим флажок "Shareable in memory",
секция расшарена для всех процессов.
я пробовал другой линкер, но там заблокированы нужные флаги для секции .bss. скорее всего, это сделано в целях безопасности, чтоб в секции не записывали вредоносный код.
есть еще такая секция .text, или в ассемблере называется .code. в ней можно поставить флаг "writeable", вот так можно писать самомодифицирующиеся програмки.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как между процессами разделить секцию неинициализированных данных?

Сообщение  electrik в Сб Июл 04, 2009 11:38 am

вот переписанный вариант. не проверяется весь заголовок pe, но пытается найти секцию .bss. покрайней мере теперь непропатчится то, что не надо. пока потходит ко всем бинарникам от fbc, но в следующих версиях будет ли работать, незнаю. если они не переставят секции местами, не воткнут между какие-нибудь новые, тогда будет.
вообще, здесь уже выложена часть туториалов iczelion'а, но только по winApi. буду ли я оптимизировать pe туториал, пока незнаю. если возьмусь, тогда можно будет написать любой патчер заголовка pe. и не будет зависеть, какая версия бинарника и сколько там секций. в данном случае, патчится конкретный фиксированный адрес, и если он изменится, патч не сработает.

Код:

  #include "windows.bi"
    #include "file.bi"
  dim rFlags as uinteger ' сюда будем читать флаги из файла
  dim wFlags  as uinteger ' флаги для патчинга файла
dim sName as Zstring * 8 ' ну а сюда будем читать имя секции
dim cmd as string ' командная строка
' заполним флаги для патчинга, доступен в памяти для всех процессов, чтение, запись, неинициализированные данные
wFlags = IMAGE_SCN_CNT_UNINITIALIZED_DATA  or IMAGE_SCN_MEM_SHARED or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
cmd=command()
if fileexists(cmd) then
    open cmd for binary as #1
    print "Find Section .bss"
    get #1,&h1F0+1,sName
    if not sname = ".bss" then
        print "Section .bss not found"
    ELSE
        print "Getting flags"
    get #1,&h214+1,rFlags
if rFlags = wFlags then
    print "Section .bss alriady patched"
else
        print "Patching section .bss"
        put #1,&h214+1,wFlags
close
print"patched"
end if
end if
else
    if cmd = "" then
        print "Usage: bsspatch fileName"
    else
        print "file not found"
end if
end if

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как между процессами разделить секцию неинициализированных данных?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения