Здраствуйте. столкнулся с проблемой. пишу программу которая будет ставить простые пароли на РЕ файлы (программа создает в файле новую секцию и пишет туда код из себя), вот что получилось (в атаче все что нужно) столкнулся с проблемой: програма вылетает с критом, кидаю её в ольку оказалось программа виснет в момент создания окна (CreateWindowExA), а именно в оконной процедуре, код: Код (Text): PUSH DWORD PTR [ebp+14H] PUSH DWORD PTR [ebp+10H] PUSH DWORD PTR [ebp+0CH] PUSH DWORD PTR [ebp+08H] CALL [b][Base+_defwnd][/b] ;DefWindowProcA в ольке оно немного по другому: Код (Text): 004E34AB FF75 14 PUSH DWORD PTR SS:[EBP+14] 004E34AE FF75 10 PUSH DWORD PTR SS:[EBP+10] 004E34B1 FF75 0C PUSH DWORD PTR SS:[EBP+C] 004E34B4 FF75 08 PUSH DWORD PTR SS:[EBP+8] 004E34B7 FF95 AF1B4000 CALL DWORD PTR SS:[b][EBP+401BAF][/b] ошибка: Access violation when reading... Base - локальная переменная в WNDPROC Код (Text): WNDPROC PROC LOCAL Base:DWORD .... WNDPROC ENDP использую её как дельту, хранить её в ebp нету возможности так как этот регистр занят (пробовал поменять не получилось) может кто cможет найти то, что я пропустил, или другое решение.
Acrobat А почему вы считаете что ошибки быть не должно ? Это ведь переход вникуда, если бы в Ebp было загружено дельта-смещение, то мб корректно работало. зы: код отвратительный, впрочем как и идея/реализация
ну изначально там у меня и дельта, но ebp внутри меняется, и нужно использовать что то другое как изменить ? мне просто нужно показать наглядный пример
Acrobat o Не используйте регистр Ebp для хранения каких либо значений. Он должен адресовать стековые фреймы и только, вам должно быть достаточно Ebx, Esi или Edi. o Дельта-смещение это разность двух адресов, поэтому нет смысла хранить её в переменных, посчитайте есчо раз. o Процедуры оформляйте должным образом, незачем вручную вычислять смещения. Код (Text): WNDPROC proc uses ebx esi edi hWnd:HWND, uMsg:ULONG, wParam:DWORD, lParam:DWORD Call Dt Dt: pop ebx sub ebx,offset Dt cmp uMsg,WM_COMMAND je BTN ... Call dword ptr [ebx + _getwndtextl] ... Нормально оформляются структуры, через которые производится обращение к переменным, например: Код (Text): APILIST struct pGetWindowText PVOID ? pDefWndProc PVOID ? ... APILIST ends PAPILIST typedef ptr APILIST ApiList APILIST <> ... Call APILIST.pGetWindowText[ebx + offset ApiList] либо так: Код (Text): Call Dt Dt: pop ebx sub ebx,[offset Dt - offset ApiList] assume ebx:PAPILIST ... Call [ebx].pGetWindowText