Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› окна своими руками (ERROR_INVALID_WINDOW_HANDLE)
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 октября 2009 02:43 · Поправил: Yuki Makoto
· Личное сообщение · #1

Перед огромным желанием тврорить чудеса на асме и писать оконные интерфейсы (в том числе оконные) мало кто устоит xD неплохо бы разобраться как же оно там все фунциклирует изнутри.. Я приведу простейший пример оконного приложения с кнопкой и полем редактирования на асме..
Проблема: функция CreateWindowExA@48 из user32.dll возвращает нулевой результат, а должна, как вы все знаете, возвращать хэндл созданного окна. Может кто-нибудь подскажет в чем здесь дело? С какими параметрами накосячил? стандартные includ'ы не подключаю намеренно.

Code:
  1. .486P
  2. .MODEL FLAT, STDCALL
  3. OPTION CASEMAP: NONE
  4. INCLUDE 02.INC
  5. INCLUDELIB  d:\masm32\lib\user32.lib
  6. INCLUDELIB  d:\masm32\lib\kernel32.lib
  7.  
  8. .DATA
  9.     NEWHWND DD  0 ; здесь будет храниться дескриптор окна
  10.     MSG MSGSTRUC    <?> ; 24 байта описывающих сообщение
  11.     WC  WNDSTRUC    <?> ; 40 байт описывающих "класс" окна
  12.     HINST   DD  0 ; здесь будет храниться дескриптор приложения
  13.     TITLENAME   DB  "my window",0
  14.     CLASSNAME   DB  "win32", 0
  15.     BTNTEXT DB  "Кнопка", 0
  16.     EDTTEXT DB  " ", 0
  17.     CLSBTN  DB  "BUTTON", 0
  18.     CLSEDT  DB  "EDIT", 0
  19.     HWNDBTN DD  0
  20.     HWNDEDT DD  0
  21.     CAP DB  "Сообщение", 0
  22.     MES DB  "Конец работы программы", 0
  23.     TEXT    DB  "Строка редактирования", 0
  24.     ;DB 50 DUP (0)
  25.  
  26. .CODE
  27.     START:
  28.         PUSH    0
  29.         CALL    GetModuleHandleA@4
  30.         MOV [HINST], EAX
  31.  
  32.         ; заполняем структуру окна
  33.  
  34.         MOV DWORD PTR [WC.CLSTYLE], CS_STYLE
  35.         MOV [WC.CLWNDPROC], OFFSET WNDPROC
  36.         MOV DWORD PTR [WC.CLEXTRA], 0
  37.         MOV DWORD PTR [WC.CLWNDEXTRA], 0
  38.         ...
  39.         ...
  40.         ...
  41.         PUSH    0
  42.         PUSH    HINST
  43.         PUSH    0
  44.         PUSH    0
  45.         PUSH    150
  46.         PUSH    400
  47.         PUSH    100
  48.         PUSH    100
  49.         PUSH    000CF000h ;WS_OVERLAPPEDWINDOW
  50.         PUSH    OFFSET  TITLENAME
  51.         PUSH    OFFSET  CLASSNAME
  52.         PUSH    0
  53.         CALL    CreateWindowExA@48                                     ;здесь ERROR_INVALID_WINDOW_HANDLE
  54.    
  55.         TEST    EAX, EAX
  56.         JZ      END_LOOP
  57.         MOV     NEWHWND, EAX
  58.         ...
  59.         ...
  60.         ...


0ca6_06.10.2009_CRACKLAB.rU.tgz - dlg.rar



Ранг: 39.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 октября 2009 06:22
· Личное сообщение · #2

Yuki Makoto
Так проги на ассемблере никто не пишет (если я не ошибаюсь). Возможно вы использовали какой-нибудь рипер (типа TMG Ripper Studio).

Пример нормально написаной проги: canterwood.online.fr/shared/tools/MASM32.keygen.template.v1.incl.example-Canterwood.zip

Надо использовать декларированные структуры не с 02.inc, с windows.inc.
Структуры MSGSTRUC и WNDSTRUC замените на MSG и WNDCLASSEX. Ну и соответсвенно имена переменных в нем замените. Пример: wasm.ru/pub/1/files/tut03.zip



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 07 октября 2009 10:46
· Личное сообщение · #3

Если функция завершилась ошибкой, возвращаемое значение - ПУСТО (NULL).
NULL - это и есть 0.
Чтобы получить дополнительную информацию об ошибке, вызовите функцию GetLastError.
Но там явно у тебя часть параметров неверные.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 октября 2009 14:43
· Личное сообщение · #4

Bonez92 пишет:
Так проги на ассемблере никто не пишет (если я не ошибаюсь). Возможно вы использовали какой-нибудь рипер (типа TMG Ripper Studio).Пример нормально написаной проги: --> Link <--

Спасибо за примеры Я согласен с вами (что так, в основном, не пишут проги xD). Ваш "пример нормально написаной проги" это уже Hi-level. С таким же успехом можно было бы написать и на С. Названия структур и переменных не имеют значения для ОС, имеет значение лишь - резмер в байтах и четкое понимание того, где что хранится(в этом и есть вся прелесть low-level ). Риперами не пользовался.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 октября 2009 14:53
· Личное сообщение · #5

tundra37 пишет:
Чтобы получить дополнительную информацию об ошибке, вызовите функцию GetLastError. Но там явно у тебя часть параметров неверные.

Спасибо В названии темы есть "ERROR_INVALID_WINDOW_HANDLE" - это и есть код последней ошибки.
Я думаю, что истина уже где-то рядом xD




Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

Создано: 07 октября 2009 15:38
· Личное сообщение · #6

Yuki Makoto
чем windows.inc то не угодил?

-----
zzz




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 октября 2009 20:02
· Личное сообщение · #7

zeppe1in
Мне это сложно объяснить.. боюсь что меня не поймут xD
Ну вот гляньте вот этот пример: (он еще проще предыдущего. окно без элементов управления. все отлично работает)

Code:
  1. .486P
  2. .MODEL FLAT, STDCALL
  3. OPTION CASEMAP: NONE
  4.  
  5. WM_DESTROY            EQU     2
  6. WM_CREATE             EQU     1
  7. WM_LBUTTONDOWN        EQU     201h ; сообщение приходит при щелчке левой кнопки мыши в области окна
  8. WM_RBUTTONDOWN        EQU     204h ; при щелчке правой
  9. ; свойства окна
  10. CS_VREDRAW            EQU     1
  11. CS_HREDRAW            EQU     2
  12. CS_GLOBALCLASS        EQU     4000h
  13. style                 EQU     CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
  14.  
  15. WS_OVERLAPPEDWINDOW   EQU     000CF000h
  16. IDI_APPLICATION       EQU     32512 ; идентификатор стандартной иконки
  17. IDC_CROSS             EQU     32512 ; идентификатор стандартного курсора
  18. SW_SHOWNORMAL         EQU     1 ; режим показа окна
  19.  
  20. EXTERN  MessageBoxA@16          : NEAR
  21. EXTERN  CreateWindowExA@48      : NEAR
  22. EXTERN  DefWindowProcA@16       : NEAR
  23. EXTERN  DispatchMessageA@4      : NEAR
  24. EXTERN  ExitProcess@4           : NEAR
  25. EXTERN  GetMessageA@16          : NEAR
  26. EXTERN  GetModuleHandleA@4      : NEAR
  27. EXTERN  LoadCursorA@8           : NEAR
  28. EXTERN  LoadIconA@8             : NEAR
  29. EXTERN  PostQuitMessage@4       : NEAR
  30. EXTERN  RegisterClassA@4        : NEAR
  31. EXTERN  ShowWindow@8            : NEAR
  32. EXTERN  TranslateMessage@4      : NEAR
  33. EXTERN  UpdateWindow@4          : NEAR
  34.  
  35. INCLUDELIB ..\..\lib\kernel32.lib
  36. INCLUDELIB ..\..\lib\user32.lib
  37.  
  38. ; структура сообщения
  39. MSGSTRUC   STRUC
  40.         MSHWND        DD      ? ; идентификатор окна
  41.         MSMESSAGE     DD      ? ; идентификатор сообщения
  42.         MSWPARAM      DD      ? ;
  43.         MSLPARAM      DD      ? ;
  44.         MSTIME        DD      ? ; время посылки сообщения
  45.         MSPT          DD      ? ; положение курсора во время посылки сообщения
  46. MSGSTRUC   ENDS
  47.  
  48. ; структура-класс окна
  49. WNDCLASS    STRUC
  50.         CLSSTYLE    DD  ? ; стиль окна
  51.         CLWNDPROC   DD  ? ; указатель на процедуру окна
  52.         CLSEXTRA    DD  ? ; инф. о дополнительных байтах для данной структуры
  53.         CLWNDEXTRA  DD  ? ; инф. о дополнительных байтах для окна
  54.         CLSHINST    DD  ? ; дескриптор приложения
  55.         CLSHICON    DD  ? ; идент. иконки окна
  56.         CLSHCURSOR  DD  ? ; идент. курсора окна
  57.         CLSBKGR     DD  ? ; идент. кисти окна
  58.         CLMENUNAME  DD  ? ; идент. меню
  59.         CLNAME      DD  ? ; специф. имя класса
  60. WNDCLASS    ENDS
  61.  
  62. .DATA
  63.         NEWHWND DD  0
  64.         MSG     MSGSTRUC  <?>
  65.         WC      WNDCLASS    <?>
  66.         HINST   DD  0 ; здесь хранится дескриптор приложения
  67.         TITLENAME   DB  "Простой пример",0
  68.         CLASSNAME   DB  "itsmywindow", 0
  69.         CAP         DB  "Сообщение", 0
  70.         MES1        DB  "Вы нажали на левую кнопку мыши", 0
  71.         MES2        DB  "Выход из программы!", 0
  72. .CODE
  73.         START:
  74.             PUSH    0
  75.             CALL    GetModuleHandleA@4
  76.             MOV     HINST, EAX ; запоминаем полученный дескриптор приложения
  77.  
  78.        ; заполняем структуру окна
  79.             MOV     WC.CLSSTYLE, style
  80.             MOV     WC.CLWNDPROC, OFFSET WNDPROC
  81.             MOV     WC.CLSEXTRA, 0
  82.             MOV     WC.CLWNDEXTRA, 0
  83.             MOV     WC.CLSHINST, EAX
  84.       ;------------ иконка окна
  85.             PUSH    IDI_APPLICATION
  86.             PUSH    0
  87.             CALL    LoadIconA@8
  88.             MOV     WC.CLSHICON, EAX
  89.       ;------------ курсор окна
  90.             PUSH    IDC_CROSS
  91.             PUSH    0
  92.             CALL    LoadCursorA@8
  93.             MOV     WC.CLSHCURSOR, EAX
  94.             MOV     WC.CLSBKGR, 17H
  95.             MOV     DWORD PTR [WC.CLMENUNAME], 0
  96.             MOV     DWORD PTR [WC.CLNAME], OFFSET CLASSNAME 
  97.       ; регистрируем класс окна
  98.             PUSH    OFFSET WC
  99.             CALL    RegisterClassA@4
  100.       ; создаем окно зарегиного класса
  101.             PUSH 0
  102.             PUSH HINST
  103.             PUSH 0
  104.             PUSH 0
  105.             PUSH 400
  106.             PUSH 400
  107.             PUSH 100
  108.             PUSH 100
  109.             PUSH WS_OVERLAPPEDWINDOW
  110.             PUSH OFFSET TITLENAME
  111.             PUSH OFFSET CLASSNAME
  112.             PUSH 0
  113.             CALL CreateWindowExA@48
  114.             TEST    EAX, EAX
  115.             JZ _ERR
  116.             MOV NEWHWND, EAX ; и наконец-то получаем дескриптор окна
  117.         ;-------- показываем окно
  118.             PUSH SW_SHOWNORMAL
  119.             PUSH EAX
  120.             CALL ShowWindow@8
  121.         ;--------- перерисовываем видимую часть окна
  122.             PUSH NEWHWND
  123.             CALL UpdateWindow@4
  124.  
  125.  
  126. ;--------------------------------------------------------------------- ---------------------
  127. ;цикл обработки сообщений
  128.             MSGLOOP:
  129.                 PUSH 0
  130.                 PUSH 0
  131.                 PUSH 0
  132.                 PUSH OFFSET MSG
  133.                 CALL GetMessageA@16
  134.                 TEST EAX, EAX
  135.                 JZ END_LOOP
  136.                 PUSH OFFSET MSG
  137.                 CALL TranslateMessage@4
  138.                 PUSH OFFSET MSG
  139.                 CALL DispatchMessageA@4
  140.                 JMP MSGLOOP
  141.             END_LOOP:
  142.                 PUSH MSG.MSWPARAM
  143.                 CALL ExitProcess@4
  144.             _ERR:
  145.                 JMP END_LOOP
  146.  
  147. ;--------------------------------------------------------------------- ----------------------
  148. ; процедура окна
  149. ; расположение параметров в стеке
  150. ; [ebp + 14h] lparam
  151. ; [ebp + 10h] wparam
  152. ; [ebp + 0ch] mes
  153. ; [ebp + 08h] hwnd
  154. WNDPROC PROC
  155.     PUSH EBP
  156.     MOV EBP, ESP
  157.     PUSH EBX
  158.     PUSH ESI
  159.     PUSH EDI
  160.     CMP DWORD PTR [EBP + 0CH], WM_DESTROY
  161.     JE WMDESTROY
  162.     CMP DWORD PTR [EBP + 0CH], WM_CREATE
  163.     JE WMCREATE
  164.     CMP DWORD PTR [EBP + 0CH], WM_LBUTTONDOWN
  165.     JE WMLBUTTONDOWN
  166.     CMP DWORD PTR [EBP + 0CH], WM_RBUTTONDOWN
  167.     JE WMRBUTTONDOWN
  168.     JMP DEFWNDPROC
  169.     
  170. ; нажатие правой кнопки приводит к закрытию окна
  171.     WMRBUTTONDOWN:
  172.         JMP WMDESTROY
  173.         
  174.     WMLBUTTONDOWN: 
  175.         PUSH 0
  176.         PUSH OFFSET CAP
  177.         PUSH OFFSET MES1
  178.         PUSH DWORD PTR [EBP + 08H]
  179.         CALL MessageBoxA@16
  180.         XOR EAX, EAX
  181.         JMP FINISH
  182.         
  183.     WMCREATE:
  184.         XOR EAX, EAX
  185.         JMP FINISH
  186.         
  187.     DEFWNDPROC:
  188.         PUSH DWORD PTR [EBP + 14H]
  189.         PUSH DWORD PTR [EBP + 10H]
  190.         PUSH DWORD PTR [EBP + 0CH]
  191.         PUSH DWORD PTR [EBP + 08H]
  192.         CALL DefWindowProcA@16
  193.         JMP FINISH
  194.         
  195.     WMDESTROY:
  196.         PUSH 0
  197.         PUSH OFFSET CAP
  198.         PUSH OFFSET MES2
  199.         PUSH DWORD PTR [EBP + 08H]
  200.         CALL MessageBoxA@16
  201.         PUSH 0
  202.         CALL PostQuitMessage@4
  203.         XOR EAX, EAX
  204.         
  205.     FINISH:
  206.         POP EDI
  207.         POP ESI
  208.         POP EBX
  209.         POP EBP
  210.         RET 16
  211.      
  212. WNDPROC ENDP
  213.         
  214.        END START




Ранг: 17.3 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 08 октября 2009 12:55
· Личное сообщение · #8

Похоже на примеры из книги Пирогова
Code:
  1. ; [EBP+14H] ; lParam
  2. ; [EBP+10H] ; wParam
  3. ; [EBP+0CH] ; Msg
  4. ; [EBP+8] ; hWnd
  5.  
  6. ---------------------------------------
  7.  
  8. PUSH    DWORD PTR [EBP+14H] ;lParam
  9. PUSH    DWORD PTR [EBP+10H] ;wParam
  10. PUSH    DWORD PTR [EBP+08] ; тут должно быть Msg
  11. PUSH    DWORD PTR [EBP+04] ; а тут hWnd
  12. CALL    DefWindowProcA@16   

ИМХО лучше так проги не писать



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 08 октября 2009 13:08
· Личное сообщение · #9

At0m2k пишет:
ИМХО лучше так проги не писать

И что тебе здесь не нравится?
То что вместо макроса invoke по человечески передают параметры в стек?
Так на вкус и цвет сам знаешь...
Я например invoke вообще никогда не пользуюсь, так же как и стековый фрейм руками формирую, а не всякими LOCAL.



Ранг: 52.2 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 08 октября 2009 14:47 · Поправил: Vitek
· Личное сообщение · #10

у тебя в WM_DEFAULT косяк. вот как должно быть
Code:
  1.         DEFWNDPROC:
  2.             PUSH    DWORD PTR [EBP+14H]
  3.             PUSH    DWORD PTR [EBP+10H]
  4.             PUSH    DWORD PTR [EBP+0CH]
  5.             PUSH    DWORD PTR [EBP+08H]
  6.             CALL    DefWindowProcA@16
  7.             JMP     FINISH




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 08 октября 2009 16:39
· Личное сообщение · #11

Yuki Makoto пишет:
Мне это сложно объяснить.. боюсь что меня не поймут xD


Я понял, т.к. при обучении раньше любил по...пать себе мозг и специально не пользовался invoke'ами, макросредствами, ифами, и вручную писал свой Windows.inc (без шлюх и блэкджека).

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 08 октября 2009 18:14
· Личное сообщение · #12

AlexZ у меня вот вопрос.
Если так прут IF/ELSE, LOCAL и другие макрокоманды - зачем писать на ASM?
Пиши на Си и будут тебе IF-ы с ELSE-ами...
Это не наезд, просто интересно.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 октября 2009 20:25 · Поправил: Yuki Makoto
· Личное сообщение · #13

Vitek
Да.. как так можно было ступить..!? Спасибо



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 08 октября 2009 20:26 · Поправил: AlexZ
· Личное сообщение · #14

cppasm

Ну, если хочется посмотреть как всё выглядит изнутри, то обычно начинаешь заучивать биты флагов, условия переходов, смещения в байтах, и т.п. и чувствуешь absolute power.

Потом это несколько позда...бывает и хочется скоротать время, обойтись инвоком или макросредством, чем десять раз переписывать одно и то же.

Хотя МАСМ - он и есть Асм + Макросредства. А значит, зачем-то это нужно.

Зачем для себя - я ответил, а как и зачем это в реальных проектах - не знаю, но в реале точно не попишешь по принципу "хочу так и на том потому что хоцца."

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 39.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 08 октября 2009 21:26
· Личное сообщение · #15

Yuki Makoto пишет:
Мне это сложно объяснить.. боюсь что меня не поймут xD

Может быть все-таки попробуете объяснить. Можно в ЛС.


 eXeL@B —› Программирование —› окна своими руками (ERROR_INVALID_WINDOW_HANDLE)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати