首页
社区
课程
招聘
[求助]汇编dll注入一个对话框到记事本,为什么dll一卸载记事本也会退出?下面是代码
发表于: 2015-1-14 21:50 6560

[求助]汇编dll注入一个对话框到记事本,为什么dll一卸载记事本也会退出?下面是代码

2015-1-14 21:50
6560
;==============dlltab.asm=====================================
  .386
  .model flat,stdcall
  option casemap:none
  
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc

includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
  
include dlltab.Inc
  
  .code
  
  WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

        LOCAL msg:MSG

        invoke InitCommonControls               
        invoke CreateDialogParam,hInst,IDD_TABTEST,NULL,addr DlgProc,NULL
        mov hDlg,eax
        invoke ShowWindow,hDlg,SW_SHOWDEFAULT
        invoke UpdateWindow,hDlg
       
        ;------设置输入焦点
        ;invoke GetDlgItem,hDlg,IDC_BUTTON_ADD
        ;invoke SetFocus,eax
       
        ;------非模式对话框的消息循环
        .WHILE TRUE
                 invoke GetMessage,ADDR msg,NULL,0,0
                .BREAK .IF(!eax)
                invoke IsDialogMessage,hDlg,ADDR msg
                .IF eax==FALSE
                        invoke TranslateMessage,ADDR msg
                        invoke DispatchMessage,ADDR msg
                .endif
        .endw
        mov eax,msg.wParam
ret
WinMain endp
  
_WinMain        proc
                invoke        WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
                ret
_WinMain        endp
  
  
DllEntry          proc       _hInstance,_dwReason,_dwReserved
                 local        @dwThreadID

                mov eax,_dwReason  
                .if eax == DLL_PROCESS_ATTACH  
                    ;保存hInstDll 和初始化操作
                   
                   
                            invoke        MessageBox,NULL,offset szText,offset szCaption,MB_OK
                           
                            ;invoke GetModuleHandle, NULL
                        ;mov                hInstance, eax
                        push        _hInstance
                        pop        hInstance
                       
                        invoke        CreateThread,NULL,0,offset _WinMain,NULL,\
                                NULL,addr @dwThreadID
                        invoke        CloseHandle,eax

                        ;invoke ExitProcess,eax
                               mov eax,TRUE  
                .elseif eax == DLL_THREAD_ATTACH  
                    ;为新线程分配资源  
                        mov        eax,TRUE
                        ret
                .elseif eax == DLL_THREAD_DETACH  
                    ;线程释放资源  
                        mov        eax,TRUE
                        ret
                .elseif eax == DLL_PROCESS_DETACH  
                    ;释放库使用的资源  
                        mov        eax,TRUE
                        ret
                .endif  
                ret  
DllEntry          endp
  
  
  HookProc          proc        _dwCode,_wParam,_lParam
                    local       @szKeyState[256]:byte
            
            invoke      CallNextHookEx,hHook,_dwCode,_wParam,_lParam
            invoke      GetKeyboardState,addr @szKeyState
            invoke      GetKeyState,VK_SHIFT
            mov         @szKeyState + VK_SHIFT,al          ;   不太清楚这句是什么意思
            mov         ecx,_lParam
            shr         ecx,16
            invoke      ToAscii,_wParam,ecx,addr @szKeyState,addr szAscii,0
            mov         byte ptr szAscii [eax],0
            invoke      SendMessage,hWnd,dwMessage,dword ptr szAscii,NULL
            xor         eax,eax
            ret
  HookProc          endp
  
  
  InstallHook       proc        _hWnd,_dwMessage
                    push        _hWnd
                    pop         hWnd
                    push        _dwMessage
                    pop         dwMessage
                    invoke      SetWindowsHookEx,WH_KEYBOARD,addr HookProc,hInstance,NULL
            mov         hHook,eax
            ret
  InstallHook       endp
  
  UninstallHook     proc
                    invoke       UnhookWindowsHookEx,hHook
                    ret
  UninstallHook     endp
  
  Tab1Proc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

        .if uMsg==WM_INITDIALOG
        .else
                mov                eax,FALSE
                ret
        .endif
        mov                eax,TRUE
        ret

Tab1Proc endp

Tab2Proc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

        .if uMsg==WM_INITDIALOG
        .else
                mov                eax,FALSE
                ret
        .endif
        mov                eax,TRUE
        ret

Tab2Proc endp

Tab3Proc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

        .if uMsg==WM_INITDIALOG
        .else
                mov                eax,FALSE
                ret
        .endif
        mov                eax,TRUE
        ret

Tab3Proc endp

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL        ts:TC_ITEM
       
        mov                eax,uMsg
        .if eax==WM_COMMAND
                mov                eax,wParam
                mov                edx,eax
                and                eax,0FFFFh
                shr                edx,16
                .if edx==BN_CLICKED
                        .if eax==IDCANCEL
                                invoke SendMessage,hWin,WM_CLOSE,0,0
                        .elseif eax==IDOK
                                invoke SendMessage,hWin,WM_CLOSE,0,0
                        .endif
                .endif
        .elseif eax==WM_NOTIFY
                mov                eax,lParam
                mov                eax,[eax].NMHDR.code
                .if eax==TCN_SELCHANGE
                        ;Tab selection
                        invoke SendMessage,hTab,TCM_GETCURSEL,0,0
                        .if eax!=SelTab
                                push        eax
                                mov                eax,SelTab
                                invoke ShowWindow,[hTabDlg+eax*4],SW_HIDE
                                pop                eax
                                mov                SelTab,eax
                                invoke ShowWindow,[hTabDlg+eax*4],SW_SHOWDEFAULT
                        .endif
                .endif
        .elseif eax==WM_INITDIALOG
                ;Create the tabs
                invoke GetDlgItem,hWin,IDC_TAB1
                mov                hTab,eax
                mov                ts.imask,TCIF_TEXT
                mov                ts.lpReserved1,0
                mov                ts.lpReserved2,0
                mov                ts.iImage,-1
                mov                ts.lParam,0
                mov                ts.pszText,offset TabTitle1
                mov                ts.cchTextMax,sizeof TabTitle1
                invoke SendMessage,hTab,TCM_INSERTITEM,0,addr ts
                mov                ts.pszText,offset TabTitle2
                mov                ts.cchTextMax,sizeof TabTitle2
                invoke SendMessage,hTab,TCM_INSERTITEM,1,addr ts
                mov                ts.pszText,offset TabTitle3
                mov                ts.cchTextMax,sizeof TabTitle3
                invoke SendMessage,hTab,TCM_INSERTITEM,2,addr ts
                ;Create the tab dialogs
                invoke CreateDialogParam,hInstance,IDD_TAB1,hTab,addr Tab1Proc,0
                mov hTabDlg,eax
                invoke CreateDialogParam,hInstance,IDD_TAB2,hTab,addr Tab2Proc,0
                mov hTabDlg[4],eax
                invoke CreateDialogParam,hInstance,IDD_TAB3,hTab,addr Tab3Proc,0
                mov hTabDlg[8],eax
        .elseif eax==WM_CLOSE
                ;invoke DestroyWindow,hWnd
                invoke EndDialog,hWin,NULL
        .else
                mov                eax,FALSE
                ret
        .endif
        mov                eax,TRUE
        ret

DlgProc endp
  
  end DllEntry         
  ;============================================================================================

;----dlltab.inc

DlgProc                        PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const

IDD_TABTEST                equ 1000
IDC_TAB1                equ 1001

IDD_TAB1                equ 2000

IDD_TAB2                equ 3000

IDD_TAB3                equ 4000

szCaption        db        '恭喜',0
szText                db        '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0

.data

TabTitle1       db "Tab1",0
TabTitle2       db "Tab2",0
TabTitle3       db "Tab3",0

.data?

hInstance                dd ?
hTab                        dd ?
hTabDlg                        dd 3 dup(?)
SelTab                        dd ?
hDlg                         dd ?

.data?
hWnd             dd          ?
hHook            dd          ?
dwMessage        dd          ?
szAscii          db          4 dup (?)

#define IDD_TABTEST 1000
#define IDC_TAB1 1001
#define IDC_GRP1 1002
IDD_TABTEST DIALOGEX 6,0,197,121
FONT 9,"宋体",400,0,134
STYLE 0x10CC0000
EXSTYLE 0x00000080
BEGIN
  CONTROL "",IDC_TAB1,"SysTabControl32",0x50018000,0,0,200,124,0x00000000
  CONTROL "IDC_GRP",IDC_GRP1,"Button",0x50000007,80,-14,18,14,0x00000000
END

#define IDD_TAB1 2000
#define IDC_EDT1 2001
IDD_TAB1 DIALOGEX 1,14,200,110
FONT 9,"宋体",400,0,134
STYLE 0x50000000
EXSTYLE 0x00000000
BEGIN
  CONTROL "",IDC_EDT1,"Edit",0x50010000,24,20,54,26,0x00000200
END

#define IDD_TAB2 3000
#define IDC_EDT1 3001
IDD_TAB2 DIALOGEX 0,14,196,106
FONT 9,"宋体",400,0,134
STYLE 0x500D0000
EXSTYLE 0x00000000
BEGIN
  CONTROL "",IDC_EDT1,"Edit",0x50010000,50,18,78,28,0x00000200
END

#define IDD_TAB3 4000
#define IDC_EDT1 4001
IDD_TAB3 DIALOGEX 0,14,196,106
FONT 9,"宋体",400,0,134
STYLE 0x500F0000
EXSTYLE 0x00000000
BEGIN
  CONTROL "",IDC_EDT1,"Edit",0x50010000,28,54,62,26,0x00000200
END

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 398
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你这不是注入,你这是全局键盘HOOK,当HOOK成功后,系统会自动向所有窗口注入你这个DLL模块,但当你的主程序退出后(或你自己uninstallhook),系统会自动卸截HOOK,并将注入到其他窗口的DLL也卸截,但由于你HOOK后,记事本调用了DLL里的资源,这个DLL被系统卸载后,这个资源的调用就出错了,所以记事本自动退出了..
2015-1-14 22:30
0
雪    币: 275
活跃值: (423)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
谢谢,记事本调用了dll里的资源,我在卸载的时候关闭了调用资源的窗口啊,为什么还是记事本会退出,那怎么解决能不退出呢
2015-1-14 22:54
0
雪    币: 1392
活跃值: (5207)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
钩子程序退出后,以前加载了的DLL应该是不会被卸载的。如果我没记错
2015-1-15 08:53
0
雪    币: 398
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
回3楼,你这个是非模态窗口,在你点击这个窗口右上角的关闭的时候,其实只是隐藏了这个窗口,并非真的关闭了窗口释放了资源的.

回4楼,刚开始的时候我也以为加载了的DLL,在卸载HOOK后,不会卸载DLL的,但最近刚试了一下,DLL会被从系统里卸载掉,我的系统是WIN7 64位的.
2015-1-15 10:44
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
开线程自己freelibraryandexitthread,一般dll都能卸载

但是dll自身带窗体编译,我自己测试窗体没创建,卸载都会报错,问题都要自己去做增减测试了。
2015-3-10 14:21
0
雪    币: 5467
活跃值: (1435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用汇编的都是大牛呀。。
2015-3-10 17:05
0
游客
登录 | 注册 方可回帖
返回
//