• 标 题:为winhlp32增加支持鼠标滚轮功能 (3千字)
  • 作 者:cobra1111
  • 时 间:2003-08-10 20:52:54
  • 链 接:http://bbs.pediy.com

为winhlp32增加支持鼠标滚轮功能

主要工具是OllyDbg9.0中文版

查看OllyDbg的帮助文件,可以知道对消息下断点的方法
1. 选择“查看”\“窗口”,弹出“窗口”界面。
   如果此时你的窗口中为空的,则请先F9,运行程序,然后右击窗口,选“实行”即可。
2。双击你需要下断点的窗口,在弹出的对话框中,在“信息”框中选择你所要拦截的消息。
   在这里我下的断点是  20A  WM_MOUSEWHEEL 
3. 回到程序,随意滚动一下滚轮,OD便会中断在此:(是不是很方便哦^_^)

(上面还有一点代码,省略了)
。。。。。。
00429889  |> 81F9 11010000         CMP ECX,111                                Switch (cases 100..706D)
0042988F  |. 77 47                 JA SHORT WINHLP32.004298D8
00429891  |. 0F84 62090000         JE WINHLP32.0042A1F9
00429897  |. 81F9 00010000         CMP ECX,100
0042989D  |. 0F84 E9060000         JE WINHLP32.00429F8C ;处理 WM_KEYDOWN 的程序
004298A3  |. 81F9 01010000         CMP ECX,101
004298A9  |. 0F84 DE100000         JE WINHLP32.0042A98D
004298AF  |. 81F9 04010000         CMP ECX,104
004298B5  |. 0F84 67080000         JE WINHLP32.0042A122
004298BB  |. 81F9 05010000         CMP ECX,105
004298C1  |. 0F84 C3080000         JE WINHLP32.0042A18A
004298C7  |. 81F9 06010000         CMP ECX,106
004298CD  |. 0F84 05090000         JE WINHLP32.0042A1D8
004298D3  |. E9 1E120000           JMP WINHLP32.0042AAF6
004298D8  |> 81F9 16010000         CMP ECX,116
004298DE  |. 77 17                 JA SHORT WINHLP32.004298F7
004298E0  |. 0F84 49090000         JE WINHLP32.0042A22F
004298E6  |. 81F9 13010000         CMP ECX,113
004298EC  |. 0F84 1A090000         JE WINHLP32.0042A20C
004298F2  |. E9 FF110000           JMP WINHLP32.0042AAF6
004298F7  |> 81F9 0F030000         CMP ECX,30F
004298FD  |. 77 17                 JA SHORT WINHLP32.00429916
004298FF  |. 0F84 2D100000         JE WINHLP32.0042A932
00429905  |. 81F9 17010000         CMP ECX,117
0042990B  |. 0F84 D3090000         JE WINHLP32.0042A2E4
00429911  |. E9 E0110000           JMP WINHLP32.0042AAF6 ==> jmp 437C40
跳转到自己添加的代码,用来增加判断是否是 20A
00429916  |> 81F9 02040000         CMP ECX,402
0042991C  |. 77 17                 JA SHORT WINHLP32.00429935
0042991E  |. 0F84 1D0A0000         JE WINHLP32.0042A341


一看就知道这是消息比较(很明显的,呵呵)


我添加的代码如下:

00437C40   > 81FE 0A020000  CMP ESI,20A ;比较是否是20A
00437C46   .^0F85 AA2EFFFF  JNZ WINHLP32.0042AAF6 ;如果不是,则返回程序原来代码
00437C4C   . BE 00010000    MOV ESI,100 ;100为WM_KEYDOWN=》ESI
;我把滚轮消息转化为程序原有的KEYDOWN消息
00437C51   . 8B45 10        MOV EAX,DWORD PTR SS:[EBP+10] ;WM_MOUSEWHEEL消息的参数,可查win32手册, ;这个参数是判断向上滚,还是向下的
00437C54   . 3D 00007800    CMP EAX,780000 ;如果EAX=780000,则向上滚轮
00437C59     74 0C          JE SHORT WINHLP32.00437C67
00437C5B   . C745 10 280000>MOV DWORD PTR SS:[EBP+10],28 ;28为WM_KEYDOWN的参数,表示方向键的“下”
00437C62   >^E9 2523FFFF    JMP WINHLP32.00429F8C ;转去程序处理WM_KEYDOWN的程序
00437C67   . C745 10 260000>MOV DWORD PTR SS:[EBP+10],26 ;26为WM_KEYDOWN的参数,表示方向键的“上”
00437C6E   .^E9 1923FFFF    JMP WINHLP32.00429F8C ;转去程序处理WM_KEYDOWN键的程序

就这样完成了,是不是很简单!

利用 WM_KEYDOWN 参数,我们还可以定义自己的“快捷键”,这样如果在你的游戏中设这样一个键,那么在“弹尽粮绝”的时候,按一下自己的快捷键,就“复活”了(不用修改器的“原版+修改版”)。呵呵,这样是不是很爽!

OllyDbg的功能确实非常的强大,还有很多功能等待我们去发现,有很多问题在OD的帮助文件中都有说明,大家遇到问题应该先去看看帮助,会有收获的!

参考pll261的文章,在此表示感谢!
文中涉及的API知识,请大家自己查找手册!

收工!

今天成为 OCN 的一员,好高兴的,^_^。。。。。。。