Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |
[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. :-)
Да причина банальная - посканировал сеть на работе, бздительные админы и среагировали. Впрочем, надо отдать им должное, терпели они это довольно долго. А потом вдруг пришли к моему начальнику и сказали, что " ваш сотрудник - хакер-факер, занимается @#$ней в рабочее время (вот логи) и всех нас уже зае$ал"
Вот и захожу теперь сюда редко :(
|
|
|