![]() |
Подмена адреса возврата с маскировкой
Имеется такой кусок кода:
Код:
void B()Код:
mov eax, offset Bhttp://www.insidepro.com/kk/199/199r.shtml смотрим "Маскировка указателей", Крис утверждает, что у него все ок, достаточно лишь установить флаг компиляции /Ox (-O2). У меня, как я уже сказал, не на мс, не на гцц компилерах не работает (перебрал хуеву тучу возможных комбинаций флагов и там и там) Кто сталкивался с такой штукой отпишитесь. И да, сделать надо чисто методами C, т.е. взять hiew и там вписать нужное значение, забив лишнее nop'ами не прокатит (хотя это и решение, но задание было дано так) Весь код, кому интересно: Код:
#include <stdio.h> |
Хоть кто-нибудь попробуйте покомпилить у себя на разных компилерах и системах, ибо имхо идея такой закщиты вполне интересна, если уж нигде не будет работать то придется все-таки хитрить через hiew, либо ещё как
|
на С не пишу, но может так можно
Код:
asm{ |
В том то и дело что так нельзя, ибо задание - сделать это только методами чистого с со стандартной библиотекой, без всяких ассемблерных вставок, в расчете на переносимость такого метода защиты. Во-вторых такая вставка не должна работать в принципе. Решение точно связано с работой компилятора, может какие-то директивы есть, чтоб компановка не происходила до тех пор пока не будут вычислены все адреса и выражения с ними
|
Цитата:
|
Код:
int B2 = (int)B^1234; |
Цитата:
Код:
void B()C:\Users\Vertex\Documents\test\main.c|12|error: initializer element is not constant| на строчке int B2 = (int)B^1234; Выходит, что gcc считает, что адреса имен неизвестны (хотя вполне очевидно, что адреса в готовом приложении вполне известны, так как обычно они делаются фиксированными в отличии от dll). В вижуал студии в настройках пробовал фиксировать адрес базы, но тоже не дало результата =( Вообщем у Касперски волшебные компиляторы =( |
попробуй отключить релоки (чето типа strip relocations).
>>хотя вполне очевидно, что адреса в готовом приложении вполне известны Это не очевидно, в соответствии с форматом PE, все отображения могут перемещаться (exe и dll с точки зрения формата не сильно отличаются). В exe можно отрубать релоки. Возможно тогда компилятор посчитает адрес константным. |
не, я и с динамичной базой включал и тд - все работает,
компилер из студии 2008 |
Цитата:
|
| Время: 10:57 |