首页
社区
课程
招聘
[分享]为程序添加拖放功能
发表于: 2007-9-27 13:50 9037

[分享]为程序添加拖放功能

2007-9-27 13:50
9037

【文章标题】: 为程序添加拖放功能
【文章作者】: Suyana
【作者邮箱】: [EMAIL="suyasha@163.com"]suyasha@163.com[/EMAIL]
【参考信息】: pll621写的为W32dasm添加拖放文件功能

==========添加函数================
用PE编辑工具加入下面这3个函数(位于SHELL32.DLL):
DragAcceptFiles、DragFinish、DragQueryFile。记下它们的RVA。
在00401A08写入:
00401A08        jmp     [405074]        ;  SHELL32.DragAcceptFiles
00401A0E        jmp     [405078]        ;  SHELL32.DragFinish
00401A14        jmp     [40507C]        ;  SHELL32.DragQueryFileA
以后call 00401A08就是调用SHELL32.DragAcceptFiles函数了

DragAcceptFiles是设置窗口能否接受拖放消息,即能否发送WM_DROPFILES消息给这个窗口

=========设置窗口能否接受拖放消息=====================
1.设置窗口能否发送拖放消息。  查找CreateWindowExA"。有两个,一个是创建窗口,
  另一个是创建RichEdit。来到创建窗口的那条:

  004018BA	mov     [40302C], eax		     ;主窗口的句柄
  004018BF	push    1			             ;改成jmp     00401A9B
  004018C1	push    dword ptr [40302C]	;被覆盖
  00401A9B	push    1				     ; /Accept = TRUE
  00401A9D	push    dword ptr [40302C]	; |hWnd = NULL
  00401AA3	call    00401A08			; \DragAcceptFiles
  00401AA8	push    1
  00401AAA	push    dword ptr [40302C]
  00401AB0	jmp     004018C7
  004014D1	push    200                                ; |ExtStyle = WS_EX_CLIENTEDGE
  004014D6	call    <jmp.&user32.CreateWindowExA>    ; \CreateWindowExA
  004014DB	mov     [403034], eax		     ;RichEdit的句柄
  ...
  00401547	call    00401990                         ; \SendMessageA=>jmp 00401A20
  0040154C	leave
  0040154D	retn
 00401A20	pushad
  00401A21	push    1
  00401A23	push    dword ptr [403034]
  00401A29	call    00401A08		;SHELL32.DragAcceptFiles
  00401A2E	popad
  00401A2F	call    00401990		;user32.SendMessageA
  00401A34	jmp     0040154C
00401A3D	jnz     short 00401A49
  00401A3F	call    0040154E
  00401A44	jmp     004017B1
  00401A49	cmp     eax, 233
  00401A4E	je      short 00401A55	;是拖放消息跳
  00401A50	jmp     004017B3	 ;转到默认的处理函数

  00401A55	nop			         ;拖放消息,这只是临时的代码,以后会替换
  00401A56	jmp     004017B3	 ;成打开文件的代码,现在运行才不会出错

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 50121
活跃值: (20750)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
Suyana进步很快,鼓励一下
2007-9-27 19:37
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
我来支持了`````
2007-9-27 19:41
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
支持一下,发觉破解这个东东,还是要求对编程有一定的程序的。学习中。
2009-10-18 03:23
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
来支持下,谢楼主分享。
2009-10-18 09:29
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,学习一下
2009-10-18 14:32
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
7
自己写了个仿记事本程序,MFC的,就是没有拖放功能,在LZ的启发下,准备弄弄,添加函数简单,郁闷的是找窗口

句柄,MFC功能全是封装的,找到相关函数后就老在MFC42D.dll,以及系统dll里转,怎么才能在程序空间里找到窗口句

柄参数呢,我不可能去改动MFC42D.dll啊,后来发现用VC调试时,能够清楚的显示函数名称,如
00401E15   push        5
00401E17   mov         eax,dword ptr [ebp-10h]
00401E1A   mov         ecx,dword ptr [eax+20h]
00401E1D   call        CWnd::ShowWindow (004033bc)

而在OD里却显示为
00401E15  |> \6A 05                 PUSH 5
00401E17  |.  8B45 F0              MOV EAX,DWORD PTR SS:[EBP-10]
00401E1A  |.  8B48 20              MOV ECX,DWORD PTR DS:[EAX+20]
00401E1D  |.  E8 9A150000    CALL <JMP.&MFC42D.#4951>

怎么才能显示出函数名称呢,搞了半天,后来发现是OD里没有添加导入库,汗,添加了MFCD42.lib后,重载程序,

结果如下
00401E15  |> \6A 05         PUSH 5
00401E17  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
00401E1A  |.  8B48 20       MOV ECX,DWORD PTR DS:[EAX+20]
00401E1D  |.  E8 9A150000   CALL <JMP.&MFC42D.#?ShowWindow@CWnd@@QAEHH@Z_4951>

现在好办了,跟进call,来到如下代码
5F436C5F >  55              PUSH EBP
5F436C60    8BEC            MOV EBP,ESP
5F436C62    51              PUSH ECX
5F436C63    53              PUSH EBX
5F436C64    56              PUSH ESI
5F436C65    57              PUSH EDI
5F436C66    894D FC         MOV DWORD PTR SS:[EBP-4],ECX
5F436C69    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
5F436C6C    8B48 20         MOV ECX,DWORD PTR DS:[EAX+20]
5F436C6F    51              PUSH ECX
5F436C70    FF15 6CB64A5F   CALL DWORD PTR DS:[<&USER32.IsWindow>]                               ; 

user32.IsWindow
5F436C76    85C0            TEST EAX,EAX
5F436C78    75 14           JNZ SHORT MFC42D.5F436C8E
5F436C7A    68 2D010000     PUSH 12D
5F436C7F    68 DCD64C5F     PUSH OFFSET MFC42D.THIS_FILE                                         ; ASCII "winocc.cpp"
5F436C84    E8 27FF0300     CALL MFC42D.#?AfxAssertFailedLine@@YGHPBDH@Z_1041
5F436C89    85C0            TEST EAX,EAX
5F436C8B    74 01           JE SHORT MFC42D.5F436C8E
5F436C8D    CC              INT3
5F436C8E    33D2            XOR EDX,EDX
5F436C90    85D2            TEST EDX,EDX
5F436C92  ^ 75 D5           JNZ SHORT MFC42D.5F436C69
5F436C94    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
5F436C97    8378 3C 00      CMP DWORD PTR DS:[EAX+3C],0
5F436C9B    75 13           JNZ SHORT MFC42D.5F436CB0
5F436C9D    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
5F436CA0    51              PUSH ECX
5F436CA1    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
5F436CA4    8B42 20         MOV EAX,DWORD PTR DS:[EDX+20]
5F436CA7    50              PUSH EAX
5F436CA8    FF15 70B94A5F   CALL DWORD PTR DS:[<&USER32.ShowWindow>]                             ; 

user32.ShowWindow

仔细看call showwindow的参数hwnd是[[ebp-4]+20],而[EBP-4]是由5F436C66处的ECX赋值,这样我们就知道在

00401E1D前如何得到窗口句柄了,也就是 [ecx+20],最后更改如下
00401E15   > \6A 05         PUSH 5
00401E17   .  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
00401E1A   .  8B48 20       MOV ECX,DWORD PTR DS:[EAX+20]
00401E1D   .  EB 45         JMP SHORT pad1.00401E64
00401E1F      90            NOP
00401E20      90            NOP
00401E21      90            NOP
00401E22   >  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
..........
00401E64   > \51            PUSH ECX
00401E65   .  50            PUSH EAX
00401E66   .  8B51 20       MOV EDX,DWORD PTR DS:[ECX+20]
00401E69   .  6A 01         PUSH 1                                                               ; /Accept = TRUE
00401E6B   .  52            PUSH EDX                                                             ; |hWnd
00401E6C      FF15 96D04100 CALL DWORD PTR DS:[<&SHELL32.DragAcceptFiles>]                       ;  

shell32.DragAcceptFiles
00401E72   .  58            POP EAX
00401E73   .  59            POP ECX
00401E74   .  E8 43150000   CALL <JMP.&MFC42D.#?ShowWindow@CWnd@@QAEHH@Z_4951>
00401E79   .^ EB A7         JMP SHORT pad1.00401E22


后来发现VB的程序也不好分析,在网上也没找到msvbvm60.lib文件,用其他工具转出来的lib文件,分析程序时还是有好多函数分析不出名称,以序号方式显示,郁闷
2009-11-12 07:53
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码