CreateWindowExA, оконная процедура

Тема в разделе "WASM.BEGINNERS", создана пользователем Acrobat, 3 май 2010.

  1. Acrobat

    Acrobat New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2010
    Сообщения:
    23
    Здраствуйте.
    столкнулся с проблемой.
    пишу программу которая будет ставить простые пароли на РЕ файлы (программа создает в файле новую секцию и пишет туда код из себя), вот что получилось (в атаче все что нужно)
    столкнулся с проблемой:
    програма вылетает с критом, кидаю её в ольку
    оказалось программа виснет в момент создания окна (CreateWindowExA), а именно в оконной процедуре, код:
    Код (Text):
    1.     PUSH    DWORD PTR [ebp+14H]
    2.     PUSH    DWORD PTR [ebp+10H]
    3.     PUSH    DWORD PTR [ebp+0CH]
    4.     PUSH    DWORD PTR [ebp+08H]
    5.     CALL    [b][Base+_defwnd][/b] ;DefWindowProcA
    в ольке оно немного по другому:
    Код (Text):
    1. 004E34AB   FF75 14              PUSH DWORD PTR SS:[EBP+14]
    2. 004E34AE   FF75 10              PUSH DWORD PTR SS:[EBP+10]
    3. 004E34B1   FF75 0C              PUSH DWORD PTR SS:[EBP+C]
    4. 004E34B4   FF75 08              PUSH DWORD PTR SS:[EBP+8]
    5. 004E34B7   FF95 AF1B4000    CALL DWORD PTR SS:[b][EBP+401BAF][/b]
    ошибка: Access violation when reading...
    Base - локальная переменная в WNDPROC
    Код (Text):
    1. WNDPROC PROC
    2. LOCAL Base:DWORD
    3. ....
    4. WNDPROC         ENDP
    использую её как дельту, хранить её в ebp нету возможности так как этот регистр занят (пробовал поменять не получилось)
    может кто cможет найти то, что я пропустил, или другое решение.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Acrobat
    А почему вы считаете что ошибки быть не должно ?
    Это ведь переход вникуда, если бы в Ebp было загружено дельта-смещение, то мб корректно работало.
    зы: код отвратительный, впрочем как и идея/реализация :)
     
  3. Acrobat

    Acrobat New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2010
    Сообщения:
    23
    ну изначально там у меня и дельта, но ebp внутри меняется, и нужно использовать что то другое
    как изменить ?
    мне просто нужно показать наглядный пример :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Acrobat
    o Не используйте регистр Ebp для хранения каких либо значений. Он должен адресовать стековые фреймы и только, вам должно быть достаточно Ebx, Esi или Edi.
    o Дельта-смещение это разность двух адресов, поэтому нет смысла хранить её в переменных, посчитайте есчо раз.
    o Процедуры оформляйте должным образом, незачем вручную вычислять смещения.
    Код (Text):
    1. WNDPROC proc uses ebx esi edi hWnd:HWND, uMsg:ULONG, wParam:DWORD, lParam:DWORD
    2.     Call Dt
    3. Dt:
    4.     pop ebx
    5.     sub ebx,offset Dt
    6.    
    7.     cmp uMsg,WM_COMMAND
    8.     je BTN
    9.     ...
    10.     Call dword ptr [ebx + _getwndtextl]
    11.     ...
    Нормально оформляются структуры, через которые производится обращение к переменным, например:
    Код (Text):
    1. APILIST struct
    2. pGetWindowText      PVOID ?
    3. pDefWndProc     PVOID ?
    4. ...
    5. APILIST ends
    6. PAPILIST typedef ptr APILIST
    7.  
    8. ApiList APILIST <>
    9.     ...
    10.     Call APILIST.pGetWindowText[ebx + offset ApiList]
    либо так:
    Код (Text):
    1.     Call Dt
    2. Dt:
    3.     pop ebx
    4.     sub ebx,[offset Dt - offset ApiList]
    5.     assume ebx:PAPILIST
    6.     ...
    7.     Call [ebx].pGetWindowText
     
  5. Acrobat

    Acrobat New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2010
    Сообщения:
    23
    Клерк как всегда на высоте), перелапачу код отпишу