информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Win32] Функция в области данных. 22.08.02 01:15  Число просмотров: 1039
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> (int)(&some_function) - получается адрес на jmp на функцию

как понять "адрес на jmp на функцию" ?
вызов должен быть примерно таким
push 1 (6a 01) ;допустим
push 2 (6a 02) ;допустим
call FUNCTION (E8 (offset FUNCTION)-(offset RETURN_ADDRESS))
RETURN_ADDRESS:
...
FUNCTION:
где тут jmp ???
приведи машинный код чтобы я понял
а вообще-то похоже на лишнюю оптимизацию
главное тут - в функции живущей в области данных не должно быть ни одного прямого вызова другой функции, иначе тебе придется самому корректировать REL32 компоненту
<programming>
[Win32] Функция в области данных. 21.08.02 10:06  
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
Тут припёрло сделать сабж. Вспомнился код, который приводил z0:

------------------------------------ test.c -------------------------------------
#include <stdio.h>

#define ONE_FUNCTION_FITS_HERE 0x1000

char code_in_data_section[ONE_FUNCTION_FITS_HERE];

#pragma push (check_stack)
#pragma off (check_stack)
void some_function(void)
{
int (*printf_indirect)(const char*,...)=&printf;
printf_indirect ("hello from data section!\n");
return;
}
#pragma pop (check_stack)
void some_next_function(void) {}

void main(void)
{
int size_of_function = (int)(&some_next_function) - (int)(&some_function);
int i;
void (*this_we_call)(void) = (void (*)(void)) code_in_data_section;

for(i=0; i<size_of_function; i++)
{
code_in_data_section[i] = ((char*) some_function)[i];
}

this_we_call(); // !
}
---------------------------------------------------------------------------------

Вышло следующее (под W2k):

(int)(&some_function) - получается адрес на jmp на функцию
(int)(&some_next_function) - то же

соответственно
int size_of_function = (int)(&some_next_function) - (int)(&some_function);
выдаёт размер между jmp-ами, а не размер функции.

следовательно
for(i=0; i<size_of_function; i++) {
code_in_data_section[i] = ((char*) some_function)[i]; }
копирует все эти jmp-ы

итого
this_we_call();
выполняет jmp на реальную функцию. Потому, возможно, и работает.

Что я делаю не так?
[Win32] Функция в области данных. 22.08.02 01:15  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> (int)(&some_function) - получается адрес на jmp на функцию

как понять "адрес на jmp на функцию" ?
вызов должен быть примерно таким
push 1 (6a 01) ;допустим
push 2 (6a 02) ;допустим
call FUNCTION (E8 (offset FUNCTION)-(offset RETURN_ADDRESS))
RETURN_ADDRESS:
...
FUNCTION:
где тут jmp ???
приведи машинный код чтобы я понял
а вообще-то похоже на лишнюю оптимизацию
главное тут - в функции живущей в области данных не должно быть ни одного прямого вызова другой функции, иначе тебе придется самому корректировать REL32 компоненту
[Win32] Функция в области данных. 21.08.02 22:36  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Da potomuchto na VC compilere eta baida ne rabotaet.

P.S.
I kstati pisal ob etom v tom obsuzhdenii.
[Win32] Функция в области данных. 21.08.02 23:48  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> Da potomuchto na VC compilere eta baida ne rabotaet.
>
> P.S.
> I kstati pisal ob etom v tom obsuzhdenii.

У меня в MSVC 6.0 все работает.
Просто надо выкинуть прагмы и компилить в Release с отключенной оптимизацией. Потому что в Debug-версии проекта появляются jmp-ы, про которые писал IgorR, а оптимизатор превращает
int (*printf_indirect)(const char*,...)=&printf;
printf_indirect ("hello from data section!\n");
в
printf("hello from data section!\n");
[Win32] Функция в области данных. 22.08.02 03:23  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Thx,
Chto zhe ty tak redko na forum zahodish gliadish togda by tozhe podskazal. :-)
[оффтопик] Функция в области данных. 22.08.02 12:48  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> Thx,
> Chto zhe ty tak redko na forum zahodish gliadish togda by
> tozhe podskazal. :-)

Да причина банальная - посканировал сеть на работе, бздительные админы и среагировали. Впрочем, надо отдать им должное, терпели они это довольно долго. А потом вдруг пришли к моему начальнику и сказали, что " ваш сотрудник - хакер-факер, занимается @#$ней в рабочее время (вот логи) и всех нас уже зае$ал"
Вот и захожу теперь сюда редко :(
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach