-
Notifications
You must be signed in to change notification settings - Fork 0
/
MouseHook.asm
383 lines (316 loc) · 9.71 KB
/
MouseHook.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
; MouseHook
; 2011 (c) Nikolay Labinskiy aka e-moe
; e-mail: [email protected]
format PE GUI 4.0
entry start
include 'win32axp.inc'
struct MY_CONFIG
width dd ?
height dd ?
autorun dd ?
ends
section '.data' data readable writeable
_title db 'MouseHook',0
_class db 'MouseHook_class',0
_mutex db 'MouseHook#@#$$1377',0
_tskbarrcrt db 'TaskbarCreated',0
_msg_caption db 'MouseHook',0
_msg_about db 'MouseHook ver 0.1, Freeware edition.',13,10,\
'2011 ',0A9h,' Nikolay Labinskiy aka e-moe',13,10,\
'e-mail: [email protected]',0
default_width = 100
default_height = 100
hKey dd ?
KeyAutorunType dd REG_SZ
_opt_type dd REG_DWORD
_reg_autorun db 'Software\Microsoft\Windows\CurrentVersion\Run',0
_reg_MouseHook db 'Software\Áàëàëàéêà 3 ñòðóíû LTD.\MouseHook',0
_opt_height db 'height',0
_opt_width db 'width',0
_opt_size dd 4
translated dd ?
config MY_CONFIG
hInstance dd ?
menu_nhdl dd ?
wnd_hndl dd ?
mutex_hndl dd ?
WM_TASKBARCREATED dd ?
wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
ntf NOTIFYICONDATA sizeof.NOTIFYICONDATA,0,0,NIF_ICON+NIF_MESSAGE+NIF_TIP,WM_USER+1,0,"MouseHook"
pt POINT 0,0
msg MSG
RC_menu_id = 100
cmd_About = 101
cmd_Autorun = 102
cmd_Config = 103
cmd_Exit = 104
DataSize dd MAX_PATH
ProgrPath db MAX_PATH+3 dup (?)
ERROR_ALREADY_EXISTS = 183
ERROR_SUCCESS = 0
section '.code' code readable executable
start:
invoke CreateMutex,0,TRUE,_mutex
mov [mutex_hndl],eax
invoke GetLastError
.if eax = ERROR_ALREADY_EXISTS
jmp exit
.endif
invoke GetModuleHandle,0
mov [hInstance],eax
mov [wc.hInstance],eax
invoke LoadIcon,0,IDI_ASTERISK
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
.if eax = 0
jmp exit
.endif
invoke CreateWindowEx,0,_class,_title,0,0,0,0,0,NULL,NULL,[hInstance],NULL
.if eax = 0
jmp exit
.else
mov [wnd_hndl],eax
.endif
call LoadConfig
invoke ConfigHook,[config.height],[config.width]
invoke LoadMenu,[hInstance],RC_menu_id
invoke GetSubMenu,eax,0
mov [menu_nhdl],eax
.if [config.autorun] = TRUE
invoke CheckMenuItem,[menu_nhdl],cmd_Autorun,MF_BYCOMMAND + MF_CHECKED
.else
invoke CheckMenuItem,[menu_nhdl],cmd_Autorun,MF_BYCOMMAND + MF_UNCHECKED
.endif
mov eax,[wnd_hndl]
mov [ntf.hWnd],eax
mov eax,[wc.hIcon]
mov [ntf.hIcon],eax
invoke Shell_NotifyIcon,NIM_ADD,ntf
invoke RegisterWindowMessage,_tskbarrcrt
mov [WM_TASKBARCREATED],eax
invoke ClipCursor,NULL
invoke InstallHook
msg_loop:
invoke GetMessage,msg,NULL,0,0
.if eax <> 0
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
.endif
invoke Shell_NotifyIcon,NIM_DELETE,ntf
exit:
invoke ReleaseMutex,[mutex_hndl]
invoke UninstallHook
invoke ExitProcess,[msg.wParam]
proc WindowProc uses ebx, hwnd,wmsg,wparam,lparam
macro .ShowAboutBox
{
invoke MessageBox,0,_msg_about,_msg_caption,MB_OK+MB_ICONINFORMATION
}
mov eax,[wmsg]
.if eax = WM_DESTROY
invoke PostQuitMessage,0
xor eax,eax
.elseif eax = WM_CLOSE
invoke DestroyWindow,[wnd_hndl]
.elseif eax = WM_COMMAND
.if [wparam] = cmd_About
.ShowAboutBox
.elseif [wparam] = cmd_Exit
invoke PostMessage,[wnd_hndl],WM_CLOSE,0,0
.elseif [wparam] = cmd_Config
invoke DialogBoxParam,[hInstance],IDD_CONFIG,[wnd_hndl],ConfigDialog,0
.elseif [wparam] = cmd_Autorun
invoke GetMenuState,[menu_nhdl],cmd_Autorun,MF_BYCOMMAND
and eax,MF_CHECKED
.if eax <> 0
invoke CheckMenuItem,[menu_nhdl],cmd_Autorun,MF_BYCOMMAND + MF_UNCHECKED
stdcall UninstallAutorun
.else
invoke CheckMenuItem,[menu_nhdl],cmd_Autorun,MF_BYCOMMAND + MF_CHECKED
stdcall InstallAutorun
.endif
.endif
.elseif eax = WM_USER+1
.if [lparam] = WM_LBUTTONDBLCLK
.ShowAboutBox
.elseif [lparam] = WM_RBUTTONUP
invoke SetForegroundWindow,[wnd_hndl]
invoke GetCursorPos,pt
invoke TrackPopupMenuEx,[menu_nhdl],0,[pt.x],[pt.y],[wnd_hndl],NULL
invoke PostMessage,[wnd_hndl],WM_NULL,0,0
.endif
.elseif eax = [WM_TASKBARCREATED]
invoke Shell_NotifyIcon,NIM_ADD,ntf
.else
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
.endif
ret
endp
proc ConfigDialog hwnd_dlg,msg,wparam,lparam
locals
height dd ?
width dd ?
error dd FALSE
endl
.if [msg] = WM_INITDIALOG
call LoadConfig
invoke SetDlgItemInt,[hwnd_dlg],IDC_HEIGHT,[config.height],FALSE
invoke SetDlgItemInt,[hwnd_dlg],IDC_WIDTH,[config.width],FALSE
mov eax,TRUE
.elseif [msg] = WM_CLOSE
invoke EndDialog,[hwnd_dlg],0
mov eax,TRUE
.elseif [msg] = WM_COMMAND
.if [wparam] = IDCANCEL
invoke EndDialog,[hwnd_dlg],0
.elseif [wparam] = IDOK
;Height
invoke GetDlgItemInt,[hwnd_dlg],IDC_HEIGHT,translated,FALSE
.if [translated] = TRUE
mov [height], eax
.else
mov [error], TRUE
.endif
;Width
invoke GetDlgItemInt,[hwnd_dlg],IDC_WIDTH,translated,FALSE
.if [translated] = TRUE
mov [width], eax
.else
mov [error], TRUE
.endif
;Save
.if [error] = FALSE
;Save params to registry
mov eax, [height]
mov [config.height], eax
mov eax, [width]
mov [config.width], eax
call SaveConfig
invoke ConfigHook,[config.height],[config.width]
invoke EndDialog,[hwnd_dlg],0
.else
invoke MessageBox,0,'Incorrect Width and/or Heigth values.',_msg_caption,MB_OK+MB_ICONERROR
.endif
.endif
mov eax,TRUE
.else
mov eax,FALSE
.endif
ret
endp
proc InstallAutorun uses eax ebx
mov [config.autorun],TRUE
mov [ProgrPath],'"'
invoke GetModuleFileName,NULL,ProgrPath+1,MAX_PATH
mov ebx,eax
mov [ProgrPath+ebx+1],'"'
mov [ProgrPath+ebx+2],0
add ebx,3
invoke RegOpenKeyEx,HKEY_CURRENT_USER,_reg_autorun,0,KEY_ALL_ACCESS,hKey
invoke RegSetValueEx,[hKey],_title,0,REG_SZ,ProgrPath,ebx
invoke RegCloseKey,[hKey]
ret
endp
proc UninstallAutorun uses eax
mov [config.autorun],FALSE
invoke RegOpenKeyEx,HKEY_CURRENT_USER,_reg_autorun,0,KEY_ALL_ACCESS,hKey
invoke RegDeleteValue,[hKey],_title
invoke RegCloseKey,[hKey]
ret
endp
proc LoadConfig uses eax
invoke RegOpenKeyEx,HKEY_CURRENT_USER,_reg_autorun,0,KEY_ALL_ACCESS,hKey
invoke RegQueryValueEx,[hKey],_title,NULL,KeyAutorunType,ProgrPath,DataSize
.if eax = ERROR_SUCCESS
mov [config.autorun],TRUE
.else
mov [config.autorun],FALSE
.endif
invoke RegCloseKey,[hKey]
invoke RegCreateKeyEx,HKEY_CURRENT_USER,_reg_MouseHook,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,hKey,NULL
invoke RegQueryValueEx,[hKey],_opt_height,NULL,_opt_type,config.height,_opt_size
.if eax <> ERROR_SUCCESS
mov [config.height],default_height
.endif
invoke RegQueryValueEx,[hKey],_opt_width,NULL,_opt_type,config.width,_opt_size
.if eax <> ERROR_SUCCESS
mov [config.width],default_width
.endif
invoke RegCloseKey,[hKey]
ret
endp
proc SaveConfig uses eax
.if [config.autorun] = TRUE
stdcall InstallAutorun
.else
stdcall UninstallAutorun
.endif
invoke RegOpenKeyEx,HKEY_CURRENT_USER,_reg_MouseHook,0,KEY_ALL_ACCESS,hKey
invoke RegSetValueEx,[hKey],_opt_height,0,REG_DWORD,config.height,[_opt_size]
invoke RegSetValueEx,[hKey],_opt_width,0,REG_DWORD,config.width,[_opt_size]
invoke RegCloseKey,[hKey]
ret
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
shell32,'SHELL32.DLL',\
advapi32,'ADVAPI32.DLL',\
hook_dll,'HOOK_DLL.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\shell32.inc'
include 'api\advapi32.inc'
import hook_dll,\
InstallHook,'InstallHook',\
UninstallHook,'UninstallHook',\
ConfigHook,'ConfigHook'
section '.rsrc' resource data readable
IDD_CONFIG = 301
IDC_STATIC = -1
IDC_HEIGHT = 401
IDC_WIDTH = 402
; resource directory
directory RT_DIALOG,dialogs,\
RT_MENU,menus,\
RT_VERSION,versions,\
RT_MANIFEST,manifests
; resource subdirectories
resource dialogs,\
IDD_CONFIG,LANG_ENGLISH+SUBLANG_DEFAULT,config_dialog
resource menus,\
RC_menu_id,LANG_ENGLISH+SUBLANG_DEFAULT,popup_menu
resource versions,\
1,LANG_NEUTRAL,version
resource manifests,\
1,LANG_NEUTRAL,manifest
dialog config_dialog,<'MouseHook ',2014h,' Config'>, 0,0,171,54, DS_3DLOOK+DS_CENTER+DS_MODALFRAME+WS_CAPTION+WS_VISIBLE+WS_POPUP+WS_SYSMENU
dialogitem 'BUTTON', 'OK', IDOK, 110,10,50,14, WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON', 'C&ancel', IDCANCEL, 110,30,50,14, WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
dialogitem 'STATIC', 'Enter hookRect params:', IDC_STATIC, 5,5,78,8, WS_VISIBLE+SS_LEFT
dialogitem 'STATIC', 'Height:', IDC_STATIC, 5, 20,25,8, WS_VISIBLE+SS_RIGHT
dialogitem 'STATIC', 'Width:', IDC_STATIC, 5, 35,25,8, WS_VISIBLE+SS_RIGHT
dialogitem 'EDIT', '', IDC_HEIGHT, 35,20,40,10, WS_VISIBLE+WS_TABSTOP+ES_AUTOHSCROLL+ES_NUMBER
dialogitem 'EDIT', '', IDC_WIDTH, 35,35,40,10, WS_VISIBLE+WS_TABSTOP+ES_AUTOHSCROLL+ES_NUMBER
enddialog
menu popup_menu
menuitem '',0,MFR_POPUP+MFR_END
menuitem 'About',cmd_About
menuseparator
menuitem 'Autorun',cmd_Autorun
menuitem 'Config',cmd_Config
menuseparator
menuitem 'Exit',cmd_Exit,MFR_END
versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
'FileDescription',<'MouseHook ',2014h,' Multiple screen mouse helper'>,\
'ProductName',<'MouseHook ',2014h,' Multiple screen mouse helper'>,\
'LegalCopyright',<'2011 ',0A9h,' Nikolay Labinskiy aka e-moe.'>,\
'FileVersion','0.1',\
'ProductVersion','0.1',\
'OriginalFilename','MouseHook.exe'
resdata manifest
file 'manifest.xml'
endres