информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеПортрет посетителяСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 ФБР нашла русский след в атаках... 
 Массовый взлом SharePoint 
 Microsoft Authenticator прекращает... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Функция в области данных. 21.08.02 23:48  Число просмотров: 1051
Автор: :-) <:-)> Статус: 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");
<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