Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   asm help (https://forum.antichat.xyz/showthread.php?t=34624)

genom-- 04.03.2007 00:21

asm help
 
вообщем под ос калашникова учебник освоил и внял так сказать
сечас выдалась свободная минутка слил с wasm.ru изеслона туториал под win32 как кодить

второй урок почемуто не компилится

сам код
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0

.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?

.CODE ; Здесь начинается наш код
start:
invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
; Под Win32, hmodule==hinstance mov
; hInstance,eax
mov hInstance,eax
invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны
; вызывать эту функцию если ваша
; пpогpамма не обpабатывает командную стpоку.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess, eax ; Выйти из пpогpаммы.
; Возвpащаемое значение, помещаемое в eax,
; беpется из WinMain.
WinMain proc

Inst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,C mdShow:DWORD

LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; pегистpация нашего класса окна
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL

mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе
invoke UpdateWindow, hwnd ; обновить клиентскую область
.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; сохpанение возвpащаемого значения в
; eax
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.IF uMsg==WM_DESTROY ; если пользователь закpывает окно
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция
; обpаботки окна
ret
.ENDIF
xor eax,eax
ret

WndProc endp
end start



вот что выдает компилятор

Assembling: C:\test.asm
C:\test.asm(35) : error A2111: conflicting parameter definition
C:\test.asm(37) : error A2008: syntax error : HINSTANCE
C:\test.asm(39) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
C:\test.asm(40) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
C:\test.asm(41) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
C:\test.asm(58) : error A2006: undefined symbol : wc
C:\test.asm(58) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(59) : error A2006: undefined symbol : hInst
C:\test.asm(59) : error A2114: INVOKE argument type mismatch : argument : 11
C:\test.asm(73) : error A2006: undefined symbol : CmdShow
C:\test.asm(73) : error A2114: INVOKE argument type mismatch : argument : 2
C:\test.asm(73) : error A2006: undefined symbol : hwnd
C:\test.asm(73) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(74) : error A2006: undefined symbol : hwnd
C:\test.asm(74) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(76) : error A2006: undefined symbol : msg
C:\test.asm(76) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(78) : error A2006: undefined symbol : msg
C:\test.asm(78) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(79) : error A2006: undefined symbol : msg
C:\test.asm(79) : error A2114: INVOKE argument type mismatch : argument : 1
C:\test.asm(43) : error A2006: undefined symbol : wc
C:\test.asm(44) : error A2006: undefined symbol : wc
C:\test.asm(45) : error A2006: undefined symbol : wc
C:\test.asm(46) : error A2006: undefined symbol : wc
C:\test.asm(47) : error A2006: undefined symbol : wc
C:\test.asm(49) : error A2006: undefined symbol : wc
C:\test.asm(50) : error A2006: undefined symbol : wc
C:\test.asm(51) : error A2006: undefined symbol : wc
C:\test.asm(52) : error A2006: undefined symbol : wc
C:\test.asm(54) : error A2006: undefined symbol : wc
C:\test.asm(55) : error A2006: undefined symbol : wc
C:\test.asm(57) : error A2006: undefined symbol : wc
C:\test.asm(72) : error A2006: undefined symbol : hwnd
C:\test.asm(82) : error A2006: undefined symbol : msg
’®¬ ў гбва®©б⢥ C *Ґ Ё¬ҐҐв ¬ҐвЄЁ.
‘ҐаЁ©*л© *®¬Ґа ⮬*: 3438-BA06

‘®¤Ґа¦Ё¬®Ґ Ї*ЇЄЁ C:\

03.03.2007 21:43 2я667 test.asm
1 д*©«®ў 2я667 Ў*©в
0 Ї*Ї®Є 437я686я272 Ў*©в бў®Ў®¤*®

какя то лажа при вызове winmain

что не так у него пока сам понять еще не в состоянии

hidden 04.03.2007 02:13

Там допущена всего одна ошибка, произащедшая скорее всего во время того как ты копипастил код ;)
Ты её найдёшь без проблем, если сравнишь этот сорец с практически любым другим из примеров ;)

taha 04.03.2007 03:01

В след раз, ставь тег "CODE" (у меня стоко ошибок было)
а опечатка то всего одна

Код:

.386
.model flat, stdcall
option casemap:none

include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0

.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?

.CODE ; Здесь начинается наш код
start:
invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
; Под Win32, hmodule==hinstance mov
; hInstance,eax
mov hInstance,eax
invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны
; вызывать эту функцию если ваша
; пpогpамма не обpабатывает командную стpоку.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess, eax ; Выйти из пpогpаммы.
; Возвpащаемое значение, помещаемое в eax,
; беpется из WinMain.
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; pегистpация нашего класса окна
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL

mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе
invoke UpdateWindow, hwnd ; обновить клиентскую область
.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; сохpанение возвpащаемого значения в
; eax
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.IF uMsg==WM_DESTROY ; если пользователь закpывает окно
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция
; обpаботки окна
ret
.ENDIF
xor eax,eax
ret

WndProc endp
end start


KEZ 04.03.2007 04:38

незнаю... я не читаю посты я просто так пишу

а вот упрёк masm
Цитата:

Inst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,C mdShow:DWORD
нахуя они придумали "типы" HINSTANCE, LPSTR, DWORD ?
помоему смысл понимания ассемблерного кода - достучаться до задней точки мозга дабы обьяснить что все это dd, dword - 4байта (в 32-б с-мах)

ну пусть ещё сделают LPCTSTR2 которая будет dword
и SUPERPUPERTYPE который будет значит также dword
и MY_KAK_BI_DWORD который тоже dword


upd ваш хэк форум смайлики не в тему ставит ...

taha 04.03.2007 04:47

Цитата:

нахуя они придумали "типы" Hinstance, Lpstr, Dword ?
сам не знаю))) может максимально к си хотели приблизить, там еще больше, мне не понятных типов, и звёздочек, рюшечек всяких

скорее всего для простоты понимания, чтоб сразу было видно, hInstance - хэндл

hidden 04.03.2007 04:59

Цитата:

Сообщение от KEZ
нахуя они придумали "типы" HINSTANCE, LPSTR, DWORD ?
помоему смысл понимания ассемблерного кода - достучаться до задней точки мозга дабы обьяснить что все это dd, dword - 4байта (в 32-б с-мах)

ну пусть ещё сделают LPCTSTR2 которая будет dword
и SUPERPUPERTYPE который будет значит также dword
и MY_KAK_BI_DWORD который тоже dword

Поэтому я и нелюблю masm'ом и С++, помимо этих типов ещё это обьявление функций зараннее, тоже чушь ИМХО, но если человеку нравится мучить себя этой дрянью, почему бы и не помочь :) Пусть сам сделает свой выбор.

KEZ 04.03.2007 05:58

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

hidden 04.03.2007 06:07

Тот же самый пример, зачем в c++ HINSTANCE, LPSTR, DWORD они ведь всё-равно значат одно и тоже, но не дают подставить одно в другое без изменения типа, в чём тогда смысл?
Вот Perl вот это язык, никаких типов и никакой сути.

KEZ 04.03.2007 06:15

Дело как раз в том что там они не значат одно и тоже.
С-код - это схема. Схема приложения. Части этой схема работают с разными данными, соответственно разных типов. Тип LPSTR - указатель на строку, а DWORD - положительное 4-байтное значение. Хоть указатель тоже четырехбайтный, нужно знать где передать указатель, где хенлд, а где просто число. Если кодер начинает использовать для разработки "напрямую" ассемблер - он соглашается использовать один тип (реальный, настоящий, тут у нас dword) для описания того что раньше делал кучей других, описаных в Win SDK. Так нафига же ему обратно впихивать то что он только что согласился забыть, чтобы успешно кодить на асм?

genom-- 04.03.2007 21:19

всем спасибо ------- с++ я не знаю и знать нихочу а вот асм иногда накатывает пытаюсь учить =)


Время: 13:54