Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] функции в сегменте кода 18.11.02 22:36 Число просмотров: 1273
Автор: + <Mikhail> Статус: Elderman
|
> киньте плиз исходник по сабжу. Помню, пару месяцев назад > проходил он по форуму, вроде =)) поискал в history, но не > нашел ... > спасиб! dlia VC:
tolko v Release build optimizaciu vykluchi ( ili poigraisia s nei )
void* alloc_foo(void *pFoo,void *pFooNext)
{
long *p1, *p2;
#ifdef _DEBUG
p2 = (long*)(long*)&((charpFooNext)[1] + (long)pFooNext + 5);
p1 = (long*)(long*)&((charpFoo)[1] + (long)pFoo + 5);
#else
p2 = (long*)pFooNext;
p1 = (long*)pFoo;
#endif
int size_of_function;
size_of_function = (int)p2 - (int)p1;
char *p = new char[size_of_function];
memcpy(p, p1, size_of_function);
return p;
};
void free_foo(void *pFoo)
{
delete []pFoo;
}
void FooInDataSec(void *p)
{
void* pmemcpy)(voidconst void*, size_t) = &memcpy;
pmemcpy(p, "test\0", 5);
}
void FooInDataSec_0(void *p){}
void main()
{
void pFooInDataSec)(void;
pFooInDataSec = alloc_foo(FooInDataSec, FooInDataSec_0);
char sz[5];
pFooInDataSec(sz);
free_foo( pFooInDataSec );
printf("%s", sz);
}
---
|
<programming>
|
[Win32] функции в сегменте кода 18.11.02 19:02
Автор: fuckyoudude Статус: Незарегистрированный пользователь
|
киньте плиз исходник по сабжу. Помню, пару месяцев назад проходил он по форуму, вроде =)) поискал в history, но не нашел ...
спасиб!
|
|
[Win32] А они все там и есть 19.11.02 13:33
Автор: amirul <Serge> Статус: The Elderman
|
Если в сегменте данных, то главное не компиль Debug-версию, в ней все вызовы сопровождаются _chkesp() - а если ты переместишь функцию с таким вызовом куда нить в кучу или в переменную, или на стек - вызов останется, но будет указывать незнамо куда
|
| |
[Win32] А они все там и есть 19.11.02 22:25
Автор: + <Mikhail> Статус: Elderman
|
> Если в сегменте данных, то главное не компиль Debug-версию, > в ней все вызовы сопровождаются _chkesp() - а если ты > переместишь функцию с таким вызовом куда нить в кучу или в > переменную, или на стек - вызов останется, но будет > указывать незнамо куда
_chkesp() mozhno otkluchit` v _DEBUG
|
| |
опечатался =) , конечно я про сенгмент данных спрашивал)))... 19.11.02 22:13
Автор: fuckyoudude Статус: Незарегистрированный пользователь
|
|
| | |
опечатался =) , конечно я про сенгмент данных спрашивал)))... 20.11.02 13:59
Автор: Green Статус: Незарегистрированный пользователь
|
Я делаю так:
#pragma comment(linker,"/MERGE:.text2=.data")
#pragma comment(linker,"/SECTION:.data,EWRX")
#pragma code_seg(".text2")
void func(...)
{
..........
}
|
| | | |
Это действительно компильнет функцию в data_seg, но 20.11.02 16:32
Автор: amirul <Serge> Статус: The Elderman
|
Хотя компилер и матюкнется на несоответствие флагов секций
Насколько я понял, запустить нужно именно уже созданную функцию (шеллкод например), которая находится в переменной например. В общем то запустить - не проблема: и code_seg и data_seg - flat сегменты. Проблема как раз в том, чтоб эта самая функция была правильно написана: об chkesp я уже говорил - ее быть не должно любыми путями, кроме того если нужно использовать вызовы C-шной RTL, следует иметь в виду, что call на них генерится с относительной адресацией (относительно текущей инструкции - переместится call - все вызовы пойдут по левым адресам), код должен быть релоцируемым (если фиксапы нужны - их нужно выполнить самому до вызова функции), а так далее
|
|
[Win32] функции в сегменте кода 18.11.02 22:36
Автор: + <Mikhail> Статус: Elderman
|
> киньте плиз исходник по сабжу. Помню, пару месяцев назад > проходил он по форуму, вроде =)) поискал в history, но не > нашел ... > спасиб! dlia VC:
tolko v Release build optimizaciu vykluchi ( ili poigraisia s nei )
void* alloc_foo(void *pFoo,void *pFooNext)
{
long *p1, *p2;
#ifdef _DEBUG
p2 = (long*)(long*)&((charpFooNext)[1] + (long)pFooNext + 5);
p1 = (long*)(long*)&((charpFoo)[1] + (long)pFoo + 5);
#else
p2 = (long*)pFooNext;
p1 = (long*)pFoo;
#endif
int size_of_function;
size_of_function = (int)p2 - (int)p1;
char *p = new char[size_of_function];
memcpy(p, p1, size_of_function);
return p;
};
void free_foo(void *pFoo)
{
delete []pFoo;
}
void FooInDataSec(void *p)
{
void* pmemcpy)(voidconst void*, size_t) = &memcpy;
pmemcpy(p, "test\0", 5);
}
void FooInDataSec_0(void *p){}
void main()
{
void pFooInDataSec)(void;
pFooInDataSec = alloc_foo(FooInDataSec, FooInDataSec_0);
char sz[5];
pFooInDataSec(sz);
free_foo( pFooInDataSec );
printf("%s", sz);
}
---
|
| |
[Win32] сенк, есть над чем подумать! есть еще неясность! 18.11.02 23:22
Автор: fuckyoudude Статус: Незарегистрированный пользователь
|
а нельзя так:
/*
* тут собсно-функция
*/
char func="\xZZ\xZZ...\xZZZ";
void (*f)(void);
int main(void)
{
f = (void*)func;
(*f)();
return 0;
}
я слышал, что можно так, но MSVC не компилит ( f = (void*)func; ) , говорит мол '=' can't convert (void*) to void (__cdecl * )(void)
:(
|
| | |
[Win32] сенк, есть над чем подумать! есть еще неясность! 19.11.02 01:20
Автор: + <Mikhail> Статус: Elderman
|
> а нельзя так: > /* > * тут собсно-функция > */ > char func="\xZZ\xZZ...\xZZZ";
char *func = "...";
> > void (*f)(void); > > int main(void) > { > f = (void*)func;
f = (void (__cdecl *)(void))func;
> (*f)();
f();
> return 0; > } > > я слышал, что можно так, но MSVC не компилит ( f = > (void*)func; ) , говорит мол '=' can't convert (void*) to > void (__cdecl * )(void) > :(
|
| | | |
[Win32] сенк, есть над чем подумать! есть еще неясность! 19.11.02 22:20
Автор: fuckyoudude Статус: Незарегистрированный пользователь
|
> > void (*f)(void); ....
> > (*f)(); > > f(); здесь все-таки (*f)();
т.к определен указатель на функцию =)
Cенк за помощь.
Всего!
|
|
|