Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[ASM]Вызов процедур в VC(_chkstk) 27.08.01 15:44 Число просмотров: 1365
Автор: Red Plait Статус: Незарегистрированный пользователь
|
А в release mode не судьба была перекомпилить ?
Дело все в том, что ты пытаешься вызвать debug version (содержащей кстати сказать еще и принудительную инициализацию всех неинициализированных переменных в 0xCC и еще кучу всякого мусора)
|
|
<programming>
|
[ASM]Вызов процедур в VC(_chkstk) 25.08.01 00:20
Автор: Heromantor Статус: Незарегистрированный пользователь
|
Тут проблема такая: надо вызвать ф-цию которая была предварительно вырезана из уже скомпилированного exe. Так вот проблема такова: в начале каждой ф-ции существует некий CALL который вызывает какую-то процедуру с именем(предположительно) _chkstk, без нее моя экспортированная ф-ция не работает :(. Кто нибудь может сказаьб что-нить по этому поводу? И как бороться с этим
Начало моей ф-ции
004036A0 55 push ebp
004036A1 8B EC mov ebp,esp
004036A3 B8 68 20 00 00 mov eax,2068h
004036A8 E8 E3 98 00 00 call $$$00001 (0040cf90) <--- Что это?
А вот та ф-ция:
--- intel\chkstk.asm ----------------------------------------------------------
_chkstk:
0040CF90 51 push ecx
0040CF91 3D 00 10 00 00 cmp eax,1000h
0040CF96 8D 4C 24 08 lea ecx,[esp+8]
0040CF9A 72 14 jb lastpage (0040cfb0)
probepages:
0040CF9C 81 E9 00 10 00 00 sub ecx,1000h
0040CFA2 2D 00 10 00 00 sub eax,1000h
0040CFA7 85 01 test dword ptr [ecx],eax
0040CFA9 3D 00 10 00 00 cmp eax,1000h
0040CFAE 73 EC jae probepages (0040cf9c)
lastpage:
0040CFB0 2B C8 sub ecx,eax
0040CFB2 8B C4 mov eax,esp
0040CFB4 85 01 test dword ptr [ecx],eax
0040CFB6 8B E1 mov esp,ecx
0040CFB8 8B 08 mov ecx,dword ptr [eax]
0040CFBA 8B 40 04 mov eax,dword ptr [eax+4]
0040CFBD 50 push eax
0040CFBE C3 ret
|
 |
[Win32] [ASM]Вызов процедур в VC(_chkstk) 27.08.01 17:16
Автор: cb <cb> Статус: Member
|
в WinNt/2k физическая память стеку передается не сразу а по мере надобности. вершина стека находится в committed page (т.е. физ. память уже передана этой странице), следующая за вершиной стека страница помечена как страница committed page with guard flag. еще дальше идет зарезервированная страница, при попытке писать или читать из такой страницы происходит исключение EXCEPTION_STACK_ OVERFLOW и процесс просто уничтожается. когда стек растет маленькима блоками (меньше PAGE_SIZE) то сначала мы попадаем в страницу помеченную как committed page with guard flag, в этом случае данная страница становится committed page, а следующая резервная - committed page with guard flag. если же мы резервируем на стеке для локальных переменных блок больше PAGE_SIZE то мы попадаем на зарезервированную страницу (reserved page) и благополучно уничтожаем собственный процесс. для того чтобы этого не происходило, надо последовательно осуществить доступ к каждой странице от вершины стека до нужного нам размера. в этом случае все будет ок. вот этим и занимается _chkstack.
вот ее код для х86
extern "C" void __declspec(naked) __cdecl _chkesp()
{
#ifndefPAGESIZE #definePAGESIZE1000h
#endif /PAGESIZE
__asm
{
push ecx // save ecx
cmp eax,PAGESIZE // more than one page requested?
lea ecx, [esp] + 8 // compute new stack pointer in ecx
// correct for return address and
// saved ecx
jb short lastpage // no
probepages:
sub ecx,PAGESIZE // yes, move down a page
sub eax,PAGESIZE // adjust request and...
test dword ptr [ecx], eax // ...probe it
cmp eax,PAGESIZE // more than one page requested?
jae short probepages // no
lastpage:
sub ecx, eax // move stack down by eax
mov eax, esp // save current tos and do a...
test dword ptr [ecx], eax // ...probe in case a page was crossed
mov esp, ecx // set the new stack pointer
mov ecx, dword ptr [eax] // recover ecx
mov eax, dword ptr [eax + 4]// recover return address
push eax // prepare return address
// ...probe in case a page was crossed
ret
}
}
---
|
 |  |
[Win32] [ASM]Вызов процедур в VC(_chkstk) 28.08.01 18:19
Автор: z0 <z0> Статус: Member
|
> в WinNt/2k физическая память стеку передается не сразу а по > мере надобности. вершина стека находится в committed page
[skipped]
небольшое дополнение
стек проге WIN32 дается 2х типов распределения памяти
1) commited
его размер = столько сколько программа просит если меньше 64k или 64к если просит больше
2) ну назовем его real_stack
его размер = почти 1Mb если просит меньше или столько сколько просит, например 16Mb дает легко
это все естественно регулируется ключами линкеру или руками в PE-хедере екзешника
пока твой адрес живет в commited-районе все в порядке - читай-пиши по любому адресу
как только ты пытаешься выйти за его пределы - там действительно все как ты рассказал - guard page и прочее
таким образом, допустив что сишный линкер стека запросит как минимум 64k (ну не жадные они до чужой памяти) и допустив что в функиях проги локальные переменные небольшие (что не факт, но часто бывает) получаем, что _chkstk не нужен вообще
пусть автор проги признается - есть там у него локалы огромные или нету и какой у него стек запрошен при линковке (в hiew это видно хорошо)
если нету - ну значит у него в другом месте дыра
если есть - например ОДИН массивчик int[0x10000] то можно прямо в C-процедуре его проинициализировать СВЕРХУ ВНИЗ
вот теперь пожалуй будет полная картина
|
 |
[ASM]Вызов процедур в VC(_chkstk) 27.08.01 15:44
Автор: Red Plait Статус: Незарегистрированный пользователь
|
А в release mode не судьба была перекомпилить ?
Дело все в том, что ты пытаешься вызвать debug version (содержащей кстати сказать еще и принудительную инициализацию всех неинициализированных переменных в 0xCC и еще кучу всякого мусора)
|
 |
[ASM]Вызов процедур в VC(_chkstk) 27.08.01 09:37
Автор: Chingachguk Статус: Незарегистрированный пользователь
|
> Тут проблема такая: надо вызвать ф-цию которая была > предварительно вырезана из уже скомпилированного exe. Так > вот проблема такова: в начале каждой ф-ции существует некий > CALL который вызывает какую-то процедуру с > именем(предположительно) _chkstk, без нее моя > экспортированная ф-ция не работает :(. Кто нибудь может > сказаьб что-нить по этому поводу? И как бороться с этим > > Начало моей ф-ции > 004036A0 55 push ebp > 004036A1 8B EC mov ebp,esp > 004036A3 B8 68 20 00 00 mov eax,2068h > 004036A8 E8 E3 98 00 00 call $$$00001 > (0040cf90) <--- Что это?
Сразу скажу, что могу быть не прав, так как с VC дела не имел.
По моему мнению, это вызов подпрограммы проверки достаточности размера стека. В eax ( mov eax,2068h) передается размер стека, который будет отведен под локальные переменные (можно посмотреть на их размер и сравнить ?).
По крайней мере все выглядит идентично tp7.0 for Dos ;) - если скомпилить прогу с ключом "Stack OverFlow Checking" - там тоже втыкаются такие call-ы.
|
|
|