Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› CPP и базово независимый код
Посл.ответ Сообщение


Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 20 апреля 2006 19:17
· Личное сообщение · #1

Как заставить CPP генерить базово-независмый код т.е. чтоб небыло релоков и т.д.? Может существует ключ компиляции или иные методы..

-----
have a nice day




Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 20 апреля 2006 19:44
· Личное сообщение · #2

базонезависимый - это как раз с релоками
указываешь линкеру
/FIXED:NO если они нужны
/FIXED если не нужны




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 20 апреля 2006 20:52
· Личное сообщение · #3

Я наверно неправильно выразил свою мысль, код должен быть базовонезависимым без релоков, без секции дата, без глобальных переменных. Словом бинарник загруженный в память должен работать.

-----
have a nice day





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 20 апреля 2006 21:00
· Личное сообщение · #4

Если не использовать глобальные переменные, то код будет базонезависимым.



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 20 апреля 2006 22:53
· Личное сообщение · #5

Думаю только воздержанием от использования глобальных переменных дело не обойдётся, нужно еще и стараться не использовать такие команды как goto, break и может еще парочка найдётся, ну и от компилятора тоже может зависеть...



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 21 апреля 2006 00:48
· Личное сообщение · #6

почитай у зомби статью на эту тему




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 21 апреля 2006 02:17
· Личное сообщение · #7

для этого код ф-ции должен быть не слишком большим (чтобы джампы были относительными), без вызовов внешних библиотек, всё должно вертеться на стеке
как таковой опции компилеру нет, т.к. если компилятор находит внешюю сслыку, то она автоматом попадает под релок (если длл) и т.к. она абсолютная, то базонезависиости не будет
если перед тобой стоит реальная задача, то я рекомендую скомпилить эту ф-цию с опцией генерации .асм листинга и уже в нём что надо почистить

-----
EnJoy!




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 21 апреля 2006 08:28 · Поправил: S_T_A_S_
· Личное сообщение · #8

goto, break и размеры функций никак не влияют, все переходы относительные. Переменные нельзя не только глобальные, но и вообще статические (в том числе С-строки).

switch может привести к базозависимому коду, если скомпилируется в переход по таблице.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 21 апреля 2006 17:59 · Поправил: Nimnul
· Личное сообщение · #9

Посмотрите бинарник в аттаче, точка входа 200h. Можно считать его базо независимым?
Меня сильно смущают команды типа:
895DA4 mov [ebp][-5C],ebx
8945BC mov [ebp][-44],eax

в ebp космос который взялся из ниоткуда, по идее в ebp ссылка на текущий фрем стека для локальных переменных, но ведь он должен быть инициализирован.

d4ed_21.04.2006_CRACKLAB.rU.tgz - File.bin

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 21 апреля 2006 18:01
· Личное сообщение · #10

и сорц как этот бинарник был составлен, мс-ремовский дизасм длинн в том виде в котором он мне нужен.

d8dc_21.04.2006_CRACKLAB.rU.tgz - LenDissam+Call.cpp

-----
have a nice day




Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 апреля 2006 07:17
· Личное сообщение · #11

arnix
>нужно еще и стараться не использовать такие команды как goto, break и
>может еще парочка найдётся, ну и от компилятора тоже может зависеть...

S_T_A_S_
>goto, break и размеры функций никак не влияют, все переходы относительные.
насчет goto, break - S_T_A_S_ прав

>switch может привести к базозависимому коду, если скомпилируется в переход по таблице.
угумс, на switch (iMod) VC++ 6.0 генерит такое(атач - папка shitty_vers):
.text:004014DC mov eax, [ebp+var_44] ; iMod
.text:004014DF jmp ds:off_40161E[eax*4]

.text:0040161E off_40161E dd offset loc_4014E6 ; DATA XREF: sub_401082+45Dr
.text:00401622 dd offset loc_40151C
.text:00401626 dd offset loc_401522
.text:0040162A dd offset loc_401536

Nimnul
>в ebp космос который взялся из ниоткуда, по идее в ebp ссылка на текущий фрем стека для локальных
>переменных, но ведь он должен быть инициализирован.
дык тебе ведь сказали в отдельную процедуру код кидай, таких проблем не будет

Сделал код базонезависимым - см. атач, с тебя пЫво =)

в атаче: shitty_vers - версия со свитчем,
work_vers - свитч переделан в цепочку if / else - стал базонезависимым
ready2use_vers - исходник на асме, вроде можно юзать )

нужно будет сохранять edi, esi, ebx - убери три последних команды из последнего асм блока в дизасме
пара лишних команд в конце присутствует(да и не только в конце) - правь сам, если нужно

ЗЫ посмотреть на оригинальный исходник дизасма можно?
ЗЗЫ а не проще(было ;) взять дизасм на асме? от z0mbie / sars'a?

c41f_22.04.2006_CRACKLAB.rU.tgz - disasm.rar




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 22 апреля 2006 09:43 · Поправил: Nimnul
· Личное сообщение · #12

dotblizz пишет:

а не проще(было ;) взять дизасм на асме? от z0mbie / sars'a?


не проще, еслиб мне нужен был только дизасм в таком виде, вопросов бы небыло, лень движет прогрессом, поэтому я хочу чтоб спп делал за меня всю нужную работу.

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

я уже понял что пропустил инициализацию фрейма стека. Пихать в отдельные функции неудобно в плане того, что нужно правильно расчитывать ее длинну. А так код между метками очень удобно и лениво
 

-----
have a nice day




Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 апреля 2006 12:32
· Личное сообщение · #13

Nimnul
>Пихать в отдельные функции неудобно в плане того, что нужно правильно расчитывать ее длинну.
кому как удобней, меня ((DWORD)&func2 - (DWORD)&func1) вполне устраивает, выравнивание особо не волнует(я не такой ленивый, надо будет - руками порежу...)


 eXeL@B —› Программирование —› CPP и базово независимый код
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати