本帖最后由 类人猿 于 2017-8-28 14:16 编辑
<<<<<<<<技术探讨,欢迎大神指导!<<<<技术Q:578052137 技术群:128262077 | 百度概念和关键字:什么叫回调函数呢,回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
钩子进程使用函数HookProc;其实HookProc仅仅只是应用程序定义的符号。比如你可以写成KeyBoardHook.但是参数是不变的。Win32 API提供了诸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函数。其中TC直接进行支持的有9中,已经足够满足我们写辅助了。
本节课我用od 工具对EnumWindows参数里面回调函数申请进行一个简单的分析。大家可以按照我下面的步骤进行分析,懂得回调函数内在函数分析有助于我们理解回调函数的机制。
下面是EnumWindows的函数声明,这个函数响度比较简单,我们从简单开始吧! 我们能看到第一个参数就是个回调函数的指针,也就是函数开头地址。
lpEnumFunc:指向一个应用程序定义的回调函数指针,请参看EnumWindowsProc。
lPararm:指定一个传递给回调函数的应用程序定义值。
回调函数原型
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
参数:
hwnd:顶层窗口的句柄
lparam:应用程序定义的一个值(即EnumWindows中lParam)
1.如果觉得C声明纠结的话,我们还是直接看TC版本的吧,首先我们先新建一个工程添加三个按钮。
2.我们添加一下代码,不懂的可以直接复制TC里面的源码修改即可。
- var h
- function MyEnumProc(hWnd,lParam)
- var title = windowgetcaption(hWnd)
- traceprint("句柄"&hWnd&"|"&title)
- return true
- end
- function 按钮0_点击()
- //这里添加你要执行的代码
- h = callbackmalloc("MyEnumProc","enumwindowsproc")
- traceprint(h)
- messagebox(strformat("%x",h))
- end
- function 按钮1_点击()
- dllcall("user32.dll","long","EnumWindows","callback",h,"long",0)
- traceprint(getlasterror(1))
- end
- function 按钮2_点击()
- callbackfree(h)
- end
3.我们点击按钮-申请回调函数,我们得到TC回调函数的地址,也就是汇编里面函数头部地址。
4.od附加启动,按下ctr+g输入地址调到函数地址,发现里面有两个call,其实这些都可以忽略的,我们只是作为研究用,了解TC内部机制
我们分析到第一个call应该是获取字符长度(回调函数名字可以自己修改的)
第二个call蚕食TC自带库函数回调函数
5.我们在od回调函数地址开头下一个断点,我们按下F2.点击按钮-遍历窗口(执行EnumWindows函数),获取窗口的同时会自动的执行回调函数EnumWindowsProc
新手看这个可能是感觉没有什么用,但是在后期我们了解TC内部和一些回调函数原理,我们可以做不少高级的东西的。后面我会跟大家说明其他的回调函数,比如SetWindowsHookEx的使用。觉得不明白可以留言给我,谢谢!
|