首页
社区
课程
招聘
[分享]为PE Optimizer添加拖放功能
发表于: 2012-10-23 15:59 6599

[分享]为PE Optimizer添加拖放功能

2012-10-23 15:59
6599

本人菜鸟一个,写的不好,如有错误请指正,刚学了pll621的diy pe 教学3--w32Dasm加滚轮拖放。
今天来练习下,给程序添加拖拽功能,练手软件PE Optimizer1.4英文原版脱壳文件,用工具脱壳后汉化了界面,添加了XP样式,发现不支持拖拽,就拿来练手了,不好意思了。

我们需要给程序添加函数使之支持拖放,用到的函数有DragAcceptFiles、DragQueryFileA、DragFinish,其中分别为支持拖放、获得拖放文件路径、结束拖放。

首先我们用工具LordPE给软件添加所需的三个函数,这三个函数在SHELL32.DLL内记下四个函数的ThunkRVA值0001403C,00014040,00014044,下面添加FirstThunk以便以后调用。
用16进制工具查看资源段末尾有点空间可以存放代码,用OD加载来到C710对应位置处修改如下:
00413F10  - FF25 3C404100   JMP DWORD PTR DS:[<&SHELL32.DragAcceptFi>; shell32.DragAcceptFiles ----JMP DWORD PTR DS:[41403C]
00413F16  - FF25 40404100   JMP DWORD PTR DS:[<&SHELL32.DragQueryFil>; shell32.DragQueryFileA  ----JMP DWORD PTR DS:[414040]
00413F1C  - FF25 44404100   JMP DWORD PTR DS:[<&SHELL32.DragFinish>] ; shell32.DragFinish      ----JMP DWORD PTR DS:[414044]

保存,DragAcceptFiles是实现拖放功能的函数,此函数有两个参数,一个是是否接受拖放,一个是对象的句柄,接受设置为1即可,现在来找句柄HWND,右键查找所有模块间的调用--在所有SendMessageA上下断点,运行,系统断下
00406506  |.  53            PUSH EBX                                 ; /lParam
00406507  |.  6A 00         PUSH 0                                   ; |wParam = 0
00406509  |.  68 80000000   PUSH 80                                  ; |Message = WM_SETICON
0040650E  |.  A1 E0844000   MOV EAX,DWORD PTR DS:[4084E0]            ; |
00406513  |.  50            PUSH EAX                                 ; |hWnd => 60340
00406514  |.  E8 4FE1FFFF   CALL <JMP.&user32.SendMessageA>          ; \SendMessageA
向上来到段首,发现调用来自004066E6,我们来到4066E6向上看,发现了系统判断消息的地方,好啊正好待会我们获得拖放地址的时候会用到。程序把句柄存到了4084E0这里然后调用的,我们以后可以调用这个地址,就选择把4066E6修改
了转到我们自己的代码处,添加接受拖放。修改为:JMP 413F2A ,来到413F2A修改如下:
00413F2A    6A 01           PUSH 1
00413F2C    50              PUSH EAX
00413F2D    E8 DEFFFFFF     CALL 00413F10
00413F32    E8 A925FFFF     CALL 004064E0
00413F37  - E9 B627FFFF     JMP 004066F2
保存,现在试试是不是拖放后图标变了,接下来实现获得拖放文件的路径,获得路径后我们要显示出来。
我们先找怎么显示出来,在所有的SetDlgItemTextA上下断点,运行程序,点击浏览按钮选择一个文件,程序断下:
004053EC  |.  50            PUSH EAX                                 ; /Text
004053ED  |.  68 91010000   PUSH 191                                 ; |ControlID = 191 (401.)
004053F2  |.  A1 E0844000   MOV EAX,DWORD PTR DS:[4084E0]            ; |
004053F7  |.  50            PUSH EAX                                 ; |hWnd => 000905FC ('PE Optimizer by Dr.Golova',class='#32770')
004053F8  |.  E8 73F2FFFF   CALL <JMP.&user32.SetDlgItemTextA>       ; \SetDlgItemTextA
向上发现004053BF MOV DWORD PTR SS:[ESP+1C], 004084E4    ;存放了路径,我们记住4084E4,我们拖放的文件路径
也放到这个。根据程序自身的函数来修改显示出路径,好了需要的东西找齐了,开始动工;来到消息判断处:
00406679   .  8B5D 10       MOV EBX,DWORD PTR SS:[EBP+10]
0040667C   .  33F6          XOR ESI,ESI
0040667E   .  8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
00406681   .  83E8 02       SUB EAX,2                                ;  Switch (cases 2..111)
00406684   .  74 67         JE SHORT 004066ED
运行到406681时EAX放的是消息的参数,拖放为233H,即上一句的EBP+C的位置,EBP+10是拖放操作的句柄,正是我们要
找的DragQueryFileA函数所要的句柄,查看数据发现,EBP+8为调试程序的句柄,我们也可以调用之前的4084E0记得吧。

修改40667E跳转到我们自定义修改的位置413F40,修改如下:
0040667E    - E9 BDD80000   JMP 00413F40
00406683      90            NOP
00406684   .  74 67         JE SHORT 004066ED
到413F40修改如下:
00413F40    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
00413F43    3D 33020000     CMP EAX,233
00413F48    74 0C           JE 00413F56        ;是拖放就跳转
00413F4A    83E8 02         SUB EAX,2
00413F4D  - E9 3227FFFF     JMP 00406684                ;跳回原程序执行

下面自定义处理拖放程序:
00413F56    68 04010000     PUSH 104
00413F5B    68 E4844000     PUSH 004084E4                        ; 原存放路径的地方
00413F60    6A 00           PUSH 0
00413F62    FF75 10         PUSH DWORD PTR SS:[EBP+10]               ; 拖放的句柄
00413F65    E8 ACFFFFFF     CALL 00413F16       ; 获取拖放文件的路径JMP.&SHELL32.DragQueryFileA
00413F6A    68 E4844000     PUSH 004084E4
00413F6F    68 91010000     PUSH 191                                 ; 控件ID
00413F74    FF75 08         PUSH DWORD PTR SS:[EBP+8]                ; 程序句柄
00413F77    E8 F406FFFF     CALL 00404670       ; 显示路径JMP.&user32.SetDlgItemTextA
00413F7C    FF75 10         PUSH DWORD PTR SS:[EBP+10]
00413F7F    E8 98FFFFFF     CALL 00413F1C       ; 拖放过程结束JMP.&SHELL32.DragFinish
00413F84  - E9 6127FFFF     JMP 004066F2        ;转到消息结束
00413F89    90              NOP       

好了保存后就可以测试了,注册这么久了,一直没怎么学。请大家多多指教!Your Friends IVASOX, 2012-10

PEOptimizer.rar


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文章   收藏学习
2012-10-23 16:03
0
雪    币: 3279
活跃值: (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
膜拜大牛神贴。
2012-10-23 16:19
0
雪    币: 12
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我觉得不错,元芳你怎么看?
2012-10-23 22:02
0
雪    币: 97697
活跃值: (200854)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
Thanks for share.
上传的附件:
2012-10-25 01:10
0
游客
登录 | 注册 方可回帖
返回
//