как между процессами разделить секцию неинициализированных данных?
FreeBasic :: Программирование :: Общее
Страница 1 из 1
как между процессами разделить секцию неинициализированных данных?
вот столкнулся с проблемой в fb, надо сделать чтоб секция неинициализированных данных .bss, разделялась между процессами. надо это сотворить в dll. короче, что надо передать линкеру? на асме это просто. суть. надо написать перехватчик, он работает как dll.
попробую написать иначе, надо в dll, сделать так, чтоб переменная была доступна всем процессам, тоесть, когда к dll обращаются 5 прог, чтоб они видели значение переменной. просто поумолчанию в dll, секция неинициализированных данных не разделяется.
соответственно, если изменять какую-нибудь переменную в dll, и когда я вызову другую программу но с той-же dll, код будет общий, а значения переменных разные.
в моем случае, мне нужно открыть секцию для всех процессов.
я смотрел ld.exe --help, но там как-то неразобрался, если кто знает все параметры, плиз, опишите.
попробую написать иначе, надо в dll, сделать так, чтоб переменная была доступна всем процессам, тоесть, когда к dll обращаются 5 прог, чтоб они видели значение переменной. просто поумолчанию в dll, секция неинициализированных данных не разделяется.
соответственно, если изменять какую-нибудь переменную в dll, и когда я вызову другую программу но с той-же dll, код будет общий, а значения переменных разные.
в моем случае, мне нужно открыть секцию для всех процессов.
я смотрел ld.exe --help, но там как-то неразобрался, если кто знает все параметры, плиз, опишите.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как между процессами разделить секцию неинициализированных данных?
ну вот, мною найдено решение. тупой патчинг 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, этого вообще нет. почитал старенький русский ман, там ни слухом ни духом.
только предупреждаю, ни каких проверок нет. патчить только 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
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как между процессами разделить секцию неинициализированных данных?
ну и еще простой метод открыть секцию .bss. качаем:
http://alchemister777.narod.ru/exetools/petools156002005.rar
запускаем программу
выбираем в меню "Tools/Pe Editor",
появится окно открытия файла, открываем нужную dll,
жмем кнопку "Sections",
в списке жмем правой кнопкой мыши по секции .bss,
выбираем "Edit Section Header",
жмем ...,
ставим флажок "Shareable in memory",
секция расшарена для всех процессов.
я пробовал другой линкер, но там заблокированы нужные флаги для секции .bss. скорее всего, это сделано в целях безопасности, чтоб в секции не записывали вредоносный код.
есть еще такая секция .text, или в ассемблере называется .code. в ней можно поставить флаг "writeable", вот так можно писать самомодифицирующиеся програмки.
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
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как между процессами разделить секцию неинициализированных данных?
вот переписанный вариант. не проверяется весь заголовок pe, но пытается найти секцию .bss. покрайней мере теперь непропатчится то, что не надо. пока потходит ко всем бинарникам от fbc, но в следующих версиях будет ли работать, незнаю. если они не переставят секции местами, не воткнут между какие-нибудь новые, тогда будет.
вообще, здесь уже выложена часть туториалов iczelion'а, но только по winApi. буду ли я оптимизировать pe туториал, пока незнаю. если возьмусь, тогда можно будет написать любой патчер заголовка pe. и не будет зависеть, какая версия бинарника и сколько там секций. в данном случае, патчится конкретный фиксированный адрес, и если он изменится, патч не сработает.
вообще, здесь уже выложена часть туториалов 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
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|