全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3304
推到 Plurk!
推到 Facebook!

[masm] 組合語言高手請進

尚未結案
vlad dracula
一般會員


發表:13
回覆:9
積分:4
註冊:2006-07-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-13 18:23:19 IP:218.190.xxx.xxx 訂閱
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 檔定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
sizes equ 80
ICO_MAIN equ 1000
DLG_MAIN equ 1000
IDC_TEXT equ 1001
WM_HOOK equ WM_USER 100h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 資料段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
titlename db 1024 dup (?)
hInstance dd ?
hWinMain dd ?
hHook dd ?
szAscii db 32 dup (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程式碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 鉤子回呼函數
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HookProc proc _dwCode,_wParam,_lParam
local @szKeyState[256]:byte

invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN
invoke GetKeyboardState,addr @szKeyState
invoke GetKeyState,VK_SHIFT
mov @szKeyState VK_SHIFT,al
mov ecx,[ebx].paramH
shr ecx,16
invoke ToAscii,[ebx].paramL,ecx,addr @szKeyState,addr szAscii,0
mov byte ptr szAscii [eax],0
.if szAscii == 0dh
mov word ptr szAscii 1,0ah
.endif

invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_REPLACESEL,0,addr szAscii
.endif
assume ebx:nothing
.endif
popad
xor eax,eax
ret

HookProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
;********************************************************************
.if eax == WM_CLOSE
invoke UnhookWindowsHookEx,hHook
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
.if eax
mov hHook,eax
.else

invoke EndDialog,hWnd,NULL
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start


我這樣設定了一個日誌記錄鉤子 但接受到鍵盤訊後 不知道是那個程序發出的 請問如何得到發出訊息的程序標題?
完整的請見附件
附加檔案:rehook.rar
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-14 11:35:55 IP:61.229.xxx.xxx 未訂閱
看了一下你的程式碼,應該是如你附加上的那一句
GetWindowText eax,addr S, 1024
改成
GetWindowText [ebx].hwnd,addr S, 1024

很久沒寫asm,但應該是這樣子! 參考看看~~
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
vlad dracula
一般會員


發表:13
回覆:9
積分:4
註冊:2006-07-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-14 12:05:58 IP:218.190.xxx.xxx 訂閱
大大不行呀 我寫了個vc的 請大大幫幫忙 如何得到發出訊息的程序視窗標題

#define _WIN32_WINNT 0x0400
#define STRICT
#define WIN32_LEAN_AND_MEAN

#include
#include
#include


DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;
BOOL CALLBACK con_handler (DWORD)
{
PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
return TRUE;
};

LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
{




PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
const char *info = NULL;




if (w == WM_KEYDOWN)
info = "key dn";
else if (w == WM_KEYUP)
info = "key up";
else if (w == WM_SYSKEYDOWN)
info = "sys key dn";
else if (w == WM_SYSKEYUP)
info = "sys key up";
printf ("vkCode [%c], scanCode [x] \n", info, p->vkCode, p->scanCode);

// always call next hook
return CallNextHookEx (g_kb_hook, code, w, l);
};

int main (void)
{
g_main_tid = GetCurrentThreadId ();
SetConsoleCtrlHandler(&con_handler, TRUE);
g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL, &kb_proc,GetModuleHandle (NULL),0);
if (g_kb_hook == NULL)
{
fprintf (stderr, "SetWindowsHookEx failed with error %d\n",::GetLastError());
return 0;
};
// I"u^I"?N~??·E^C,±??e"?A"??I"e"O"^(a)?A`O^?O`o`?E'O`O^^(2)e'msdn
MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
};
UnhookWindowsHookEx (g_kb_hook);
return 0;
};
===================引 用 文 章===================
看了一下你的程式碼,應該是如你附加上的那一句
GetWindowText eax,addr S, 1024
改成
GetWindowText [ebx].hwnd,addr S, 1024

很久沒寫asm,但應該是這樣子! 參考看看~~
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-14 16:29:47 IP:61.229.xxx.xxx 未訂閱

原程式碼裡用的hook type是WH_JOURNALRECORD,而當其callback function的code是HC_ACTION時lParam 是指向一個EVENTMSG Structure,而這個結構體中才有posted window的handle欄位。

typedef struct {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} EVENTMSG, *PEVENTMSG;

而你所用的HOOK TYPE,應該是沒辦法得知是哪個WINDOWS POST…
有了這個HANDLE的資訊,才方便用GetWindowText找出來。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
vlad dracula
一般會員


發表:13
回覆:9
積分:4
註冊:2006-07-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-14 16:47:20 IP:218.190.xxx.xxx 訂閱
即是怎樣呀?
大大可否改良代碼然後post出來呀
vc那個會否簡單一些.
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-08-15 14:35:33 IP:61.229.xxx.xxx 未訂閱

關於我之前提的用EVENTMSG->hwnd得知是哪個window post的,經我自己測式發現,當WM_KEYDOWN時是無效的,但若是WM_LBUTTONDOWN時就有效。也不知是為何…可用下面的程式測看看。

#define _WIN32_WINNT 0x0400
#define STRICT
#define WIN32_LEAN_AND_MEAN


#include
#include
#include

DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;


BOOL CALLBACK con_handler(DWORD dwCtrlType)
{
PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
return TRUE;
}


LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
{
BYTE szKeyState[256];
UINT uScanCode;
unsigned short szAscii[32] = {0};
char szTitle[256] = {0};

/*
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
const char *info = NULL;

if (w == WM_KEYDOWN)
info = "key dn";
else if (w == WM_KEYUP)
info = "key up";
else if (w == WM_SYSKEYDOWN)
info = "sys key dn";
else if (w == WM_SYSKEYUP)
info = "sys key up";
printf ("%s, vkCode [%c], scanCode [x] \n", info, p->vkCode, p->scanCode);
*/

if(code == HC_ACTION)
{
EVENTMSG *emsg = (EVENTMSG*)l;
if(emsg->message == WM_KEYDOWN)
// if(emsg->message == WM_LBUTTONDOWN) EVENTMSG->hwnd only work here
{

char szTitle[256] = {0};
GetWindowText(GetForegroundWindow(),szTitle,255);

GetKeyboardState(szKeyState);
GetKeyState(VK_SHIFT);
__asm
{
//mov szKeyState[VK_SHIFT*TYPE BYTE], al ; scaled
mov szKeyState[VK_SHIFT], al //not scaled but the type is BYTE so it's OK here
mov eax, emsg
mov ecx, [eax].paramH
shr ecx, 16
mov uScanCode, ecx
}
ToAscii(emsg->paramL,uScanCode,szKeyState,szAscii,0);
//GetWindowText(emsg->hwnd,szTitle,255);
printf("vkCode = %s from title = %s \n",szAscii,szTitle);
// printf("vkCode = %s from title = %d \n",szAscii,emsg->hwnd);

}
}
// always call next hook
return CallNextHookEx (g_kb_hook, code, w, l);
}

int main (void)
{
MSG msg;
g_main_tid = GetCurrentThreadId ();
SetConsoleCtrlHandler(&con_handler, TRUE);

// g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL, &kb_proc,GetModuleHandle (NULL),0);
g_kb_hook = SetWindowsHookEx (WH_JOURNALRECORD, &kb_proc,GetModuleHandle (NULL),0);
if (g_kb_hook == NULL)
{
fprintf (stderr, "SetWindowsHookEx failed with error %d\n",::GetLastError());
return 0;
}

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
UnhookWindowsHookEx (g_kb_hook);
return 0;
}

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-08-15 14:38:59 IP:61.229.xxx.xxx 未訂閱

我最後用了你的hook type =WH_KEYBOARD_LL,加裝了GetForegroundWindow()來模擬你要的結果,但應該不完善。不過我也沒有其他的辦法了…

#define _WIN32_WINNT 0x0400
#define STRICT
#define WIN32_LEAN_AND_MEAN

#include
#include
#include


DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;
BOOL CALLBACK con_handler (DWORD)
{
PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
return TRUE;
};

LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
{

PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
const char *info = NULL;

/************************************************************************/
/* Below is add by Xiao Chong */
/************************************************************************/

char szTitle[256] = {0};

GetWindowText(GetForegroundWindow(),szTitle,255);

/************************************************************************/
/* End Modify */
/************************************************************************/

if (w == WM_KEYDOWN)
info = "key dn";
else if (w == WM_KEYUP)
info = "key up";
else if (w == WM_SYSKEYDOWN)
info = "sys key dn";
else if (w == WM_SYSKEYUP)
info = "sys key up";
printf ("%s, vkCode [%c], scanCode [x],title = %s \n", info, p->vkCode, p->scanCode,szTitle); //modified by Xiao Chong

// always call next hook
return CallNextHookEx (g_kb_hook, code, w, l);
}

int main (void)
{
g_main_tid = GetCurrentThreadId ();
SetConsoleCtrlHandler(&con_handler, TRUE);
g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL, &kb_proc,GetModuleHandle (NULL),0);
if (g_kb_hook == NULL)
{
fprintf (stderr, "SetWindowsHookEx failed with error %d\n",::GetLastError());
return 0;
}

MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
UnhookWindowsHookEx (g_kb_hook);
return 0;
}

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
vlad dracula
一般會員


發表:13
回覆:9
積分:4
註冊:2006-07-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-08-15 15:17:43 IP:218.190.xxx.xxx 訂閱
大大真了不起呀
我這幾天真是完全沒有辨法做完這個程序
我會好好地努力學習了學習
謝謝!
系統時間:2024-04-30 2:43:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!