首页
社区
课程
招聘
[求助]dll中创建一个模态对话框
发表于: 2014-7-18 10:42 7143

[求助]dll中创建一个模态对话框

2014-7-18 10:42
7143
给记事本远线程注入一个DLL,DLL创建线程建立一个模态对话框,成功注入了DLL,但是返回的却是无效的资源文件,无法弹出对话框,请大牛帮忙解答下如何解决,使用MASM32 V10编译

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12372
活跃值: (5133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
介个问题偶也在找答案呢
2014-7-18 14:17
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
3
不上源码,怎么给你解释?
HINSTANCE hInstance,这个要传dll模块的基址
2014-7-18 16:12
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,过电时间在解决吧啊
2014-7-18 19:09
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
发现不把这个问题弄明白我是睡不着觉的了,请高人指点下

传DLL模块的基址,1000000吗,传的是正确的啊,用OD跟的

_WinMain proc uses ebx esi edi,_LPRARM

        invoke LoadLibrary,offset szdll                                ;获得DLL模块句柄
        mov hdll,eax
        invoke InitCommonControls                               
        invoke DialogBoxParam,hdll,IDD_DLG1,NULL,offset _WndProc,0                ;创建对话框
        invoke GetLastError                                                        ;这里就返回的错误,无效资源文件,1812
        ret
_WinMain endp

DllEntry proc _hInstance,_dwReason,_dwReserved
        LOCAL @dwthreadid       
       
        mov eax,_dwReason                       
        .if eax == DLL_PROCESS_ATTACH                                               

        push _hInstance
        pop hInstance
        invoke CreateThread,0,0,offset _WinMain,0,0,addr @dwthreadid
        mov eax,TRUE

        .endif
        ret
DllEntry Endp

头文件

include windows.inc
        include kernel32.inc
        include user32.inc
        include Comctl32.inc
        include shell32.inc
        include ComDlg32.inc
        include Gdi32.inc

;#########################################################################
;                Libraries

        includelib kernel32.lib
        includelib user32.lib
        includelib Comctl32.lib
        includelib shell32.lib
        includelib ComDlg32.lib
        includelib Gdi32.lib

_WndProc                                        PROTO :DWORD, :DWORD, :DWORD, :DWORD

.DATA?
dwcount DD ?
hInstance DD ?
hdll                dd ?
.data
   ClassName db "MainWinClass",0
   AppName   db "Main Window",0
   szdll     db "DLL.dll",0
   szsusse        db '调用成功',0
   
.const
IDD_DLG1                        equ 2010
IDC_OK                                equ 1001

DLL的RC文件

#include "Res/DLGDlg.rc"

请大神帮忙解决下啊
2014-7-19 09:26
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
6
在dllmain里_hInstance都给你了,不能弄个全局么。非要用LoadLibrary增加引用计数。。
你用OD跟一下,看看IDD_DLG1的值,不知道masm是不是以DWORD方式入栈的。
IDD_DLG1的值不能大于0xFFFF的,否则DialogBoxParam会认为你传的是字符串地址。
还不行的话,用exescope打开dll,看看资源ID对不对得上。
2014-7-19 10:19
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,这问题解决了,还有如果如我这个对话框 是远线程注入到其它程序中运行的,注入后显示的对话框无法移动,调试时还经常自动被挂起,当单击按钮弹出信息框时,信息框无法关闭,但能移动。是不是在DLL中创建的模态对话框无法维护内部的消息导致的? 如果要创建对话框,是不是要采用非模态的创建,有内部创建的维护消息体制。

下面是创建模态对话框后的过程代码,点击按后弹出一个信息框
_WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

       
        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_CREATE
       
        .ELSEIF        uMsg==WM_COMMAND
                mov eax,wParam
                .if eax==IDC_BTN1
                invoke MessageBox,NULL,offset szsusse,NULL,MB_OK
                .endif
       
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam               
                ret
        .ENDIF
       
        xor eax,eax
        ret
_WndProc endp
2014-7-19 11:23
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
8
首先,对话框DlgProc里不要调用DefWindowProc(或者DefDlgProc)。这个函数是给WndProc用的。
你是用DialogBoxParam创建的对话框,所以是DlgProc。
DlgProc不是真正的窗口过程,你可以理解为Dlgproc被封装了。
其次,DlgProc只需要返回TRUE和FALSE,要想返回真正的值。
使用SetWindowLong,第二个参数设置DWL_MSGRESULT,第三个参数设置你要返回的值。
然后马上返回TRUE。
而且看你的函数,你好像还没响应WM_INITDIALOG吧。
具体的MSDN:
DialogProc callback function
Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.
If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.
The following messages are exceptions to the general rules stated above. Consult the documentation for the specific message for details on the semantics of the return value.


You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted messages are processed internally by the dialog box window procedure.
2014-7-19 12:29
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢啊,看了你的回答明白错在哪了,自己粗心,随便找了段代码贴过来了,原来是默认处理消息没有处理
2014-7-19 14:19
0
雪    币: 12372
活跃值: (5133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主,问题搞定了
请把源码分享吧
让偶也来学习,多谢了
2014-7-23 23:11
0
游客
登录 | 注册 方可回帖
返回
//