Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Exception внутри IsBadReadPtr (kernel32)   Найти похожие ветки 

 
ZeroDivide ©   (2005-12-08 12:42) [0]

Бага проявляется на некоторых машинах с 2000, XP.
Это из за чего? И что делать?


 
Digitman ©   (2005-12-08 12:48) [1]


> Это из за чего?


сложно сказать ... возможно даже и из-за сервиспаков ...


> что делать?


пройтись в отладчике пошагово по "потрохам" ф-ции

а что за Exception, кстати ?


 
ZeroDivide ©   (2005-12-08 13:40) [2]

IsBadReadPtr используется в функции трассировки стека для отображения истории вызовов процедур.


> а что за Exception, кстати ?

AV :)


> пройтись в отладчике пошагово по "потрохам" ф-ции
>

Сложно. Exception возникает не всегда, к сожалению, а только (очевидно) при определенных аргументах. К тому же, на своем компе ни разу не получал его.

Вот кусок кода

   SAddr := DWORD(Ptr(StackPtr)^);
   Dec(SAddr, 5);
   CallPtr := Ptr(SAddr);
   if IsBadReadPtr(CallPtr,5) = False then // AV здесь
   begin
     CallData := BYTE(CallPtr^);
     if CallData = $E8 then
     begin
       ComStr := "Near Address Call";
       ...............
       Result := True;
     end;
   end;


 
Digitman ©   (2005-12-08 14:03) [3]


> ZeroDivide ©   (08.12.05 13:40) [2]



> только (очевидно) при определенных аргументах


ну так заключи ф-цию в Try..Except да протоколируй (с целью последующего анализа) аргументы, при которых управление в рез-те искл-я передается в except-блок !

куда уж проще решение)..

а в целом - не посмотреть ли тебе, как та же самая задача решается (с успехом) в JEDI ?


 
Игорь Шевченко ©   (2005-12-08 14:10) [4]


> К тому же, на своем компе ни разу не получал его.


А тот комп, где AV происходит, часом не ADM64 и не XP SP2 там ?
Таким образом DEP срабатывать не может ?

Могу порекомендовать использовать IsBadCodePtr


 
ZeroDivide ©   (2005-12-08 15:53) [5]


> а в целом - не посмотреть ли тебе, как та же самая задача
> решается (с успехом) в JEDI ?


Из JCL

function TJclStackInfoList.ValidCallSite(CodeAddr: DWORD; var CallInstructionSize: Cardinal): Boolean;
var
 CodeDWORD4: DWORD;
 CodeDWORD8: DWORD;
 C4P, C8P: PDWORD;
begin
// First check that the address is within range of our code segment!
 C8P := PDWORD(CodeAddr - 8);
 C4P := PDWORD(CodeAddr - 4);
 Result := (CodeAddr > 8) and ValidCodeAddr(DWORD(C8P), FModuleInfoList) and not IsBadReadPtr(C8P, 8);
......


Как видно, IsBadReadPtr будет вызываться для любого CodeAddr, по идее проблема должна быть и здесь.

А вот еще интересная строчка из JCL
if not IsWinNT and not IsBadReadPtr(Pointer(ADR_BIOSCOPYRIGHT), 2) then


> Могу порекомендовать использовать IsBadCodePtr

Угу, и вызвать ее 5 раз :) В IsBadReadPtr указывается число байт (вторым параметром), если к части из них нет доступа, то она вернет True.

А тот комп, где AV происходит, часом не ADM64 и не XP SP2 там ?
На одном XP SP2, на другом w2k.... :(

Таким образом DEP срабатывать не может ?
Без понятия, может быть.


 
Digitman ©   (2005-12-08 16:14) [6]


> IsBadReadPtr будет вызываться для любого CodeAddr


как видно из кода, как раз НЕ для любого - только для (CodeAddr > 8) + только для (ValidCodeAddr) = True ..

причем состояние опции Complete Boolean Eval  проекта JEDI-пакета при его сборке тоже будет играть в этой строчке немаловажную роль


 
ZeroDivide ©   (2005-12-08 16:35) [7]

Правельнее было бы, ИМХО
if ValidCodeAddr then
 if not IsBadReadPtr then

Если дело действительно в этом. В хелпе ни какого ограничения на
CONST VOID *lp, // address of memory block - нет.


 
ZeroDivide ©   (2005-12-08 16:44) [8]

Частота попадания проверок не на сегмент кода, при обычном последовательном сканировании стека большая, так что баг вылез бы сразу.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.039 c
15-1138982087
Loginov Dmitry
2006-02-03 18:54
2006.02.26
Зацените страничку :)


15-1138999015
Nic
2006-02-03 23:36
2006.02.26
Сижу, антивирусник обновляю


4-1133898889
Svit
2005-12-06 22:54
2006.02.26
Имитация нажатия мыши в флеш приложение


15-1139270635
pargo
2006-02-07 03:03
2006.02.26
Расширение .djvu. С чем его едят ?


2-1139833368
Делфёст
2006-02-13 15:22
2006.02.26
Шифровка поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский