能力值:
( LV2,RANK:10 )
2 楼
学习中
能力值:
( LV2,RANK:10 )
3 楼
回调?JMP XXX?
能力值:
( LV5,RANK:70 )
4 楼
具体怎么才是正确的我不知道,不过我的方法是,找到设置回调函数的Call,然后分析参数。
能力值:
( LV2,RANK:10 )
5 楼
TranslateMessage的作用是把接收过来的消息加工一下,比如说把WM_KEYDOWN和WM_KEYUP消息组合成一起称为WM_CHAR消息。DispatchMessage函数,这个函数非常的重要,首先,和上面2个函数一样,他们都存在于USER32.DLL中。此函数会分析得到的消息的结构从而得到此结构第一个参数值(窗口句柄),并且调用此按钮的默认回调函数。说要说明的是,由于按钮,文本框等控件对于程序开发人员来说都是很常用的并且这些控件的功能往往是固定,不会有特别稀奇古怪的附加功能,因此这些控件的回调函数也就可以固定下来,微软想法和我一样,同时,微软为了节约程序员的负担干脆把这些回调函数封装起来并固定存放在USER32.DLL中。需要注意的是,这些函数是非导出函数,除非你用OD跟踪,不然你还确实无法知道此回调函数在哪。这当然是后话。从上面的描述你可以发现,像按钮这样的控件,其对应的回调函数已经固化在USER32.DLL中,那么DispatchMessage函数就去调用这个函数。我们还知道,其实按钮这些东西都是作为资源存在于PE结构中,就某个按钮而言,你在写程序的时候也仅仅描述了以下几个信息,首先是明确表示你描述的东东的确是个按钮,其次就是按钮的坐标,其他几乎没有做任何描述,你并没有告诉系统此按钮的回调函数。系统是这样工作的:当程序运行的时候,系统要分析PE结构里所有的资源,通过资源里的描述得到具体的信息,拿按钮资源为例,当系统通过PE得到这个按钮的信息之后就会在内核中构建这个按钮的内核对象,此内核对象里的某个成员变量就会指向USER32.DLL里的某个地址,这个地址就是按钮的默认回调函数的首地址,以上这个步骤是系统自动完成的。当然,此按钮的内核对象里还会包含其他一些信息,比如坐标,资源号什么的。也就是因为按钮的内核对象里包含了回调函数的首地址,所以DispatchMessage函数才能调用!不然DispatchMessage函数压根不会知道从哪获取按钮回调函数的首地址!你可以发现,当你下鼠标断点之后按F9,再尝试按下某个按钮后都会中断在USER32领空的某个代码处。你反汇编USER32后会发现这段代码并没有导出函数与其对应。所以可以判断按钮的默认回调函数的确没有被导出且确实存在于USER32库里。按钮的回调函数要做的是获得WM_LBUTTONDOWN消息并且分析之,随后生成WM_COMMAND消息(带上BN_CLICKED参数和本按钮的句柄)发送给主窗口的线程消息列队中,之后GetMessage得到这个WM_COMMAND消息并通过DispatchMessage函数调用主窗口的默认回调函数来处理这样一个消息,处理好了之后生成WM_COMMAND(带上按钮资源号)的消息再次发到主窗口的消息列队中。接下来DispatchMessage函数调用的将会是用户定义好了的窗口过程函数。这样一来按钮和主窗口的联系就建立了。 顺便申请邀请码。。。
能力值:
( LV11,RANK:188 )
6 楼
user32!_fnINLPCREATESTRUCT还有USER32!__fnDWORD中, which eventually calls
USER32!DispatchClientMessage
USER32!UserCallWinProcCheckWow
USER32!InternalCallWinProc
刚好在看win32.sys对用户层的回调 /:^]! 可以在这儿断下来试试。这几个符号的地址,可以下载了对应的微软的PDB符号文件来得到。
能力值:
( LV4,RANK:50 )
7 楼
在消息处理函数中下断 看调用来自哪