看到kanxun发布的这个搜索版,我测试了一下,所有补丁的动作都在w32dsm.dll里面,更改了程序的入口使其一开始就loadlibary w32dsm.dll,然后w32dsm.dll
会修改原程序相关的指令,主要与弹出搜索dialog的api是createdialogparam,加载w32dsm.dll和没有加载,其消息函数的地址,和显示的资源都不一样,这个有搜索edit,和button的dialog资源在w32dsm.dll里面,当而且w32dsm.dll还有专门处理搜索的消息函数,其他处理函数和原来程序函数功能一致没有什么变化,
我现在将这个搜索消息函数分析一下,给有兴趣把killer版10的w32asm也加上这个功能的朋友做参考,希望大家迎难而上,多多实践
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002298(C)
|
:100022AD 3D11010000
cmp eax, 00000111==>比较消息是否是wm_command
:100022B2 7525
jne 100022D9===>不是完蛋
:100022B4 8B4510
mov eax, dword ptr [ebp+10]
:100022B7 663D6318
cmp ax, 1863==>比较子参量是否点击search按钮
:100022BB 7518
jne 100022D5
:100022BD 6860180000 push 00001860
:100022C2 68FF550000 push
000055FF
:100022C7 FF7508
push [ebp+08]
:100022CA E89F020000
call 1000256E==>做search的功能
:100022CF C9
leave
:100022D0
C21000 ret 0010
call到这里
:1000256E 55
push ebp
:1000256F 8BEC
mov ebp, esp
:10002571 FF750C
push [ebp+0C]===>identifier
of control
:10002574 FF7508
push [ebp+08]==> handle of dialog box
* Reference To:
USER32.GetDlgItem, Ord:0100h
|
:10002577
E838050000 Call 10002AB4
:1000257C A310660010 mov dword
ptr [10006610], eax==>这样会得到search文本框的handle
:10002581 6800020000
push 00000200==>最大字符支持512个
:10002586 68EC680010
push 100068EC===>拷贝你要搜索的字符到这个buffer
:1000258B FF7510
push [ebp+10]==>identifier of control
:1000258E FF7508
push [ebp+08]==>handle of dialog box
* Reference To: USER32.GetDlgItemTextA, Ord:0102h
|
:10002591 E824050000
Call 10002ABA==》这个函数大家都知道干什么
:10002596 0BC0
or eax, eax
:10002598 7506
jne 100025A0==>判断是否有字符拷贝,没有就不搜索了
:1000259A 33C0
xor eax, eax
:1000259C C9
leave
:1000259D C20C00
ret 000C
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:10002598(C)
|
:100025A0 6A00
push 00000000
:100025A2 6A00
push 00000000
:100025A4 688B010000
push 0000018B===>发送一个LB_GETCOUNT消息给下面的list框,需要得到有多少个需要比较
:100025A9 FF3510660010 push dword
ptr [10006610]
* Reference To: USER32.SendMessageA, Ord:0210h
|
:100025AF E830050000
Call 10002AE4
:100025B4 A30C660010
mov dword ptr [1000660C], eax==>返回list列表的个数到这个地址
:100025B9 6A00
push 00000000
:100025BB 6A00
push 00000000
:100025BD 6888010000
push 00000188==>发送LB_GETCURSEL消息给list筐,目的是得到现在选中字串的index
:100025C2 FF3510660010 push dword
ptr [10006610]
* Reference To: USER32.SendMessageA, Ord:0210h
|
:100025C8 E817050000
Call 10002AE4
:100025CD 83F8FF
cmp eax, FFFFFFFF==》比较是否有没有选中list框中的某个字串,如果有的话返回的是选中的字串index,没有选中返回ffffffff(-1)
:100025D0 7502
jne 100025D4==>有字窜选中,跳到100025D4
:100025D2 33C0
xor eax, eax
*
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100025D0(C)
|
:100025D4 A308660010
mov dword ptr [10006608], eax==>给这个变量清零,这个变量是代表搜索的次数
:100025D9 A3F8650010
mov dword ptr [100065F8], eax==>给这个变量清零,这个变量其实是表示你需要搜索字串的实际index
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002664(U)
|
:100025DE FF0508660010
inc dword ptr [10006608]==》搜索的index加1
:100025E4 A108660010
mov eax, dword ptr [10006608]
:100025E9
3B050C660010 cmp eax, dword ptr [1000660C]==>和listist列表的个数比较,看是否已经全部搜索晚所有的列出的字串
:100025EF 7507
jne 100025F8==>没有搜索完,继续搜索
:100025F1 33C0
xor eax, eax
:100025F3 A308660010
mov dword ptr [10006608], eax==>已经搜索到最后的list了,把搜索的index清空,准备重头搜索
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100025EF(C)
|
:100025F8 3B05F8650010
cmp eax, dword ptr [100065F8]==>比较是否和实际搜索到的index相等
:100025FE
7519 jne
10002619==>不等跳到10002619
:10002600 6A00
push 00000000
:10002602 50
push eax====>相等,搜索到字传的index
:10002603 6886010000 push
00000186==>发一个LB_SETCURSEL消息给list框,然后返回,这样那条蓝条就会停在搜索到的字串上
:10002608 FF3510660010
push dword ptr [10006610]
* Reference
To: USER32.SendMessageA, Ord:0210h
|
:1000260E E8D1040000 Call
10002AE4
:10002613 33C0
xor eax, eax
:10002615 C9
leave
:10002616 C20C00
ret 000C===>已经搜索到需要找得字串,返回,
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100025FE(C)比较是否和实际搜索到的index不相等,跳过来的
|
:10002619 68EC6A0010
push 10006AEC==》得到的字串放到这个变量里面
:1000261E
50
push eax==>这里是现在搜索到那个字串的index了
:1000261F 6889010000
push 00000189==>发送LB_GETTEXT 消息给list框,告诉它我们现在搜索到eax值的index,list把这个index对应的字串
放到10006AEC这个地址里去,我们等下好比较是否GetDlgItemTextA得到搜索框的字串和这个地址的是否相等
:10002624
FF3510660010 push dword ptr [10006610]
* Reference To: USER32.SendMessageA, Ord:0210h
|
:1000262A E8B5040000
Call 10002AE4
:1000262F 0BC0
or eax, eax==如果成功的话eax是拷贝字串的数目
:10002631 7431
je 10002664==》失败就跳到比较下一条index
:10002633 68EC680010 push
100068EC===>这个是我们现在index字串的地址
:10002638 68EC6A0010
push 10006AEC==>这个是GetDlgItemTextA得到字串保存的地址
:1000263D
E821030000 call 10002963===>想都不要想就知道这个call是比较上面两个字窜是否相等
:10002642 0BC0
or eax, eax
:10002644 741E
je 10002664==》不相等跳到比较下一条index
:10002646 6A00
push 00000000
:10002648 FF3508660010 push dword ptr
[10006608]===>现在index和GetDlgItemTextA得到字串相等,把那个蓝条放到这个index上
:1000264E 6886010000
push 00000186==》LB_SETCURSEL
:10002653
FF3510660010 push dword ptr [10006610]
* Reference To: USER32.SendMessageA, Ord:0210h
|
:10002659 E886040000
Call 10002AE4
:1000265E 33C0
xor eax, eax
:10002660 C9
leave
:10002661 C20C00
ret 000C==>找到一个,比较完成,返回
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10002631(C), :10002644(C)
|
:10002664 E975FFFFFF
jmp 100025DE===>跳到把[10006608]的值加1,比较下一个index是否相等
好了,怎么搜索的原理我已经分析玩了,怎么diy 这个pe,我还有有些想法的,到了killer的10版以后creatdialog这些功能都在w32path这个dll里面了,如果
补丁的话,需要做的事情很多,首先更改资源,增加一个edit控件,一个button,增加捕获这个事件的功能,然后参照上面的程序,做相应的动作,需要的工作量太大了(如果有毅力有横心还是能完成的:)),我现在没有足够的时间来干这个工作,那个朋友有兴趣,可以试试,做不下去的话可以email质询我,我尽力帮忙,造福大家的事情就靠你们了,:)
- 标 题:关于W32Dasm 8.93 Patch 1.0的搜索功能,和diy W32Dasm10加上这个功能的一点想法 (7千字)
- 作 者:pll621
- 时 间:2002-8-24 2:59:31
- 链 接:http://bbs.pediy.com