FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

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

Перейти вниз

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

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

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

electrik

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

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

как между процессами разделить секцию неинициализированных данных? Empty 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

как между процессами разделить секцию неинициализированных данных? Empty 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

как между процессами разделить секцию неинициализированных данных? Empty 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

Вернуться к началу

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

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