Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 | 3 |

 

  Вопрос: Нужна помощь с хуком Добавлено: 25.11.08 15:46  

Автор вопроса:  Lapex

Ответить

  Ответы Всего ответов: 42  

Номер ответа: 31
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #31 Добавлено: 30.11.08 21:22
По поводу кода из ollydbg - я допустил оплошность :( Вот реальный код:
  1.  
  2. 7C901203   0F84 CDEC0000    JE ntdll.7C90FED6
  3. 7C901209   5E               POP ESI
  4. 7C90120A   C9               LEAVE
  5. 7C90120B   C2 0400          RETN 4
  6. 7C90120E > CC               INT3
  7.  
  8. 7C90120F   C3               RETN
  9.  
  10. 7C901210   8BFF             MOV EDI,EDI
  11. 7C901212 > CC               INT3
  12. 7C901213   C3               RETN
  13. 7C901214   8BFF             MOV EDI,EDI
  14. 7C901216   8B4424 04        MOV EAX,DWORD PTR SS:[ESP+4]

Ответить

Номер ответа: 32
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #32
Добавлено: 30.11.08 21:57
код должен быть вида mov eax, [reg]
mov ecx, [addr]
вобщем любая команда, которая читает операнд из памяти. этот код не может дать ошибки доступа к памяти при чтении, ибо чтения тут нету =) хотя, если учесть, что данные берутся со стека, то возможен вариант порчи регистра esp. может как то связано с переполнением буфера какого нить. хз. тут нада все таки гораздо внимательнее смотреть выполнение в олли.

Ответить

Номер ответа: 33
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #33
Добавлено: 30.11.08 21:58
покажи содержимое регистра esp, для полноты картины.

Ответить

Номер ответа: 34
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #34 Добавлено: 30.11.08 23:15
Я с ollydbg не работал, поэтому не уверен, что это оно:
  1.  
  2. ESP-18   > 7C96C642  ASCII "Invalid Address specified to %s( %p, %p ) <br>
  3. " <br>
  4. ESP-14   > 0012F778
  5. ESP-10   > 0012F794
  6. ESP-C    > 7C96C625  ntdll.7C96C625
  7. ESP-8    > 7C96C642  ASCII "Invalid Address specified to %s( %p, %p ) <br>
  8. " <br>
  9. ESP-4    > 7C96D9CC  ASCII "RtlFreeHeap"
  10. ESP ==>  > 7C96C1F1  RETURN to ntdll.7C96C1F1 from ntdll.DbgBreakPoint
  11. ESP+4    >/0012F794
  12. ESP+8    >|7C96C62E  RETURN to ntdll.7C96C62E from ntdll.7C96C1C9
  13. ESP+C    >|00336A50
  14. ESP+10   >|00150000
  15. ESP+14   >|00336A58
  16. ESP+18   >]0012F808

Ответить

Номер ответа: 35
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #35
Добавлено: 01.12.08 07:05
Ясна. стек в норме, есп тож в норме. Такая бага бывает в программах, написанных на плюсах, когда ты плохо работаешь с памятью - пишешь больше, чем выделил. Тем самым запарываешь сосдений блок в heap'e. Нада плясать в сторону детальной проверки записи данных. Или ты где то портишь память, или хз. Больше ничего с этих данных не выжать, экспериментируй =)

Ответить

Номер ответа: 36
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #36 Добавлено: 01.12.08 10:37
ASCII "Invalid Address specified to %s( %p, %p )

А я подумал, что причина в этом.

Такая бага бывает в программах, написанных на плюсах...

Да, похоже на то, а разработчики приложения футболят и говорят, что плагины нужно писать только на Си и притензии принимают только от лиц официально купивших их продукт (это их право), но к сожалению я не отношусь к таким лицам.
На форуме разработчиков приложения, изредка проскакивают жалобы на похожую ошибку в плагинах, написанных как на Си так и на PB, но разработчики отмахиваются, мол эта ваша ошибка.

Или ты где то портишь память

Проверял на плагине "пустышке".

Большое спасибо за уделенное внимание - буду эксперементировать.

Ответить

Номер ответа: 37
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #37
Добавлено: 01.12.08 17:23
хм. вот одна из возможных причин

  1. int nLength = lstrlen(szObjectName);
  2. if(*pnBufferSize < nLength){
  3.   *pnBufferSize = nLength;
  4.   return -1;
  5. }
  6. else{
  7.   memset(szBuffer,0,*pnBufferSize);
  8.   lstrcpy(szBuffer,szObjectName);
  9.   return nLength;
  10. }


тема в чем - strlen возвращает длину строки, не считая завершающий ноль. а вот strcpy копирует с завершающим нулем. это главная ошибка начинающего си кодера. именно на такой код при завершении работы программы я тоже получал в начале изучения плюсов ошибку, ибо система чистит память кучи процесса при завершении, и все косяки с работой выясняются только в конце.

Ответить

Номер ответа: 38
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #38 Добавлено: 01.12.08 18:46
strlen возвращает длину строки, не считая завершающий ноль. а вот strcpy копирует с завершающим нулем

Размер буфера изначально равен 100, а длина строки - гораздо меньше (8 байт). Следовательно исходя из услоаия я не меняю размер буфера и строка должна поместиться в буфере.

Пробовал добавить в свой код альтернативу memset:
  1. FillMemory (VARPTR(szBuffer), pnBufferSize, 0)

На ошибку нм как не повлияло.

Ответить

Номер ответа: 39
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #39 Добавлено: 01.12.08 21:09
Вообщем удалось избавиться от ошибки поместив удаление Subclassing'а в сообщение %WM_CLOSE вместо %WM_DESTROY:
  1. FUNCTION SubClassProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _
  2.                   BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
  3.     SELECT CASE wMsg
  4.         CASE %WM_CLOSE
  5.             SetWindowLong(hWnd, %GWL_WNDPROC, OldProc) ' Remove subclassing
  6.         CASE %WM_DESTROY
  7.             'SetWindowLong(hWnd, %GWL_WNDPROC, OldProc) ' Remove subclassing
  8.     END SELECT
  9.  
  10.     FUNCTION = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
  11. END FUNCTION

Но это не хорошо, т.к. в приложении по сообщению %WM_CLOSE может быть вызвано диалоговое окно с вопросом о закрытии приложения и в случае отказа от закрытия я остаюсь без Subclassing'а.

Есть идеи?

Ответить

Номер ответа: 40
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #40
Добавлено: 01.12.08 21:47
Когда ты вызовешь CallWindowProc, то тебе вернется ответ от программы, решила она закрыть окно или нет.

  1. FUNCTION = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)

Тут иф впаиваешь. Вот что пишет мсдн

Return Value

If an application processes this message, it should return zero.

Сталобыть если пришел 0 - закрывать окно отказались. Хотя с учетом всех чудес, возможно и тут всплывут магические подводные камни, юзер брейкпойнты, полузакрытые окна и прочие полтергейсты =\

Ответить

Номер ответа: 41
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #41 Добавлено: 01.12.08 22:56
Чесно говоря не очень соображу с условием :( Если можно на примере.

Ответить

Номер ответа: 42
Автор ответа:
 Lapex



Вопросов: 6
Ответов: 56
 Профиль | | #42 Добавлено: 02.12.08 08:57
Вообщем вернулся к SetWindowsHookEx с WH_CBT - ситуация нормализовалась! :)

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму





© Copyright 2002-2011 VBNet.RU | Пишите нам