首页
社区
课程
招聘
[原创]第一次PEDIY---让Windows 任务管理器更强,更人性!
发表于: 2009-8-16 22:12 35167

[原创]第一次PEDIY---让Windows 任务管理器更强,更人性!

2009-8-16 22:12
35167

【文章标题】: 第一次PEDIY---让Windows 任务管理器更强,更人性!
【文章作者】: slore
【作者邮箱】: slorelee@yahoo.com.cn
【软件名称】: taskmgr.exe
【下载地址】: 附件
【使用工具】: PEiD,OD,ImportREC,Restorator
【操作平台】: Windows XP SP3

看了stalker前辈的给任务管理器增加显示程序完整路径功能
链 接: http://bbs.pediy.com/showthread.php?t=82582

感觉很不错,但是不够好(不是技术,是本身的任务管理器不好。)
我手头一直用的任务管理器本身就有这个功能,而且更人性,更方便。
如图所示:

PIC1.PNG
而且右键有直接打开到所选进程所在目录并选中的功能,很方便。

PIC2.PNG

PEiD 0.95查壳:
PECompact 2.5 Retail -> Jeremy Collake
自己不会脱壳,看到壳就先搜索了。
网上的基本都是BP VirtualFree下断和查找 push 8000的方法。
但是这个程序下断,Alt+F9回不到原程序领空,直接白了...很郁闷,
后来找到了http://bbs.pediy.com/showthread.php?t=94624
这个单步法还挺简单,成功脱壳修复,但是查壳显示:什么都没找到  *
不过OD载入,好像没有问题。(查看了下微软原版的也是什么都没找到  *)

要添加显示程序的命令行参数的功能。本来不添加这个功能这个任务管理
器已经很不错了。但是不DIY下,怎么好意思发呢~哈哈。

本身程序既然能获取路径,一定已经有这个函数,先看函数列表。
GetCommandLine先想到,后来查了原型,没有参数,应该只能的本身运行程序的参数。
一个个觉得不认识和可能会是下断……苦试了3~4个小时发现NtReadVirtualMemory
这个函数,在每次打开个新程序的时候会停下来(7C8021E5),F8跟着走,ret一层来到
调用ReadProcessMemory的过程,继续F8,看最后的ret的位置。
出来是0100CF52,在点下回车键,进到函数,可以看到:
Local Calls from 0100A739, 0100CF52

我们先回0100CF52去,继续走看下堆栈。

0100CF25  |. FF73 08        PUSH DWORD PTR DS:[EBX+8]                ; /ProcessId
0100CF28  |. 6A 00          PUSH 0                                   ; |Inheritable = FALSE
0100CF2A  |. 68 10040000    PUSH 410                                 ; |Access = VM_READ|QUERY_INFORMATION
0100CF2F  |. FF15 14110001  CALL DWORD PTR DS:[<&kernel32.OpenProces>; \OpenProcess
0100CF35  |. 85C0           TEST EAX,EAX
0100CF37  |. 8985 F0FDFFFF  MOV DWORD PTR SS:[EBP-210],EAX
0100CF3D  |. 0F84 A7000000  JE taskmgr.0100CFEA
0100CF43  
|. 68 04010000    PUSH 104                                 
; /Arg4 = 00000104
0100CF48  |. 8D8D F4FDFFFF  LEA ECX,DWORD PTR SS:[EBP-20C]           ; |
0100CF4E  |. 51             PUSH ECX                                 ; |Arg3
0100CF4F  |. 6A 00          PUSH 0                                   ; |Arg2 = 00000000
0100CF51  |. 50             PUSH EAX                                 ; |Arg1
0100CF52  |. E8 9F560000    CALL taskmgr.010125F6                    ; \taskmgr.010125F6
0100CF57  |. 85C0           TEST EAX,EAX                             ;从上面出来继续F8
0100CF59  |. 74 34          JE SHORT taskmgr.0100CF8F
0100CF5B  
|. 8D3C00         LEA EDI,DWORD PTR DS:[EAX+EAX]
0100CF5E  |. 8D47 02        LEA EAX,DWORD PTR DS:[EDI+2]
0100CF61  |. 50             PUSH EAX                                 
; /Size
0100CF62  |. 6A 40          PUSH 40                                  ; |Flags = LPTR
0100CF64  |. FF15 38110001  CALL DWORD PTR DS:[<&kernel32.LocalAlloc>; \LocalAlloc
0100CF6A  |. 85C0           TEST EAX,EAX
0100CF6C  |. 8983 A0000000  MOV DWORD PTR DS:[EBX+A0],EAX
0100CF72  |. 74 1B          JE SHORT taskmgr.0100CF8F
0100CF74  
|. 8BCF           MOV ECX,EDI
0100CF76  |. 8BF8           MOV EDI,EAX
0100CF78  |. 8BC1           MOV EAX,ECX
0100CF7A  |. C1E9 02        SHR ECX,2
0100CF7D  
|. 8DB5 F4FDFFFF  LEA ESI,DWORD PTR SS:[EBP-20C]           
;堆栈看到这里能显示进程的全路径
0100CF83  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0100CF85  |. 8BC8           MOV ECX,EAX
0100CF87  |. 83E1 03        AND ECX,3
0100CF8A  
|. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0100CF8C  |. 8B75 10        MOV ESI,DWORD PTR SS:[EBP+10]
0100CF8F  |> 68 04010000    PUSH 104
0100CF94  
|. 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0100CF9A  |. 50             PUSH EAX
0100CF9B  |. FFB5 F0FDFFFF  PUSH DWORD PTR SS:[EBP-210]
0100CFA1  |. E8 A2560000    CALL taskmgr.01012648                    
;这个CALL不知道为什么没注释,
0100CFA6  |. 85C0           TEST EAX,EAX                             ;通过句柄查找映像路径我们补丁要用到。
0100CFA8  |. 74 34          JE SHORT taskmgr.0100CFDE
0100CFAA  
|. 8D3C00         LEA EDI,DWORD PTR DS:[EAX+EAX]
0100CFAD  |. 8D47 02        LEA EAX,DWORD PTR DS:[EDI+2]
0100CFB0  |. 50             PUSH EAX                                 
; /Size
0100CFB1  |. 6A 40          PUSH 40                                  ; |Flags = LPTR
0100CFB3  |. FF15 38110001  CALL DWORD PTR DS:[<&kernel32.LocalAlloc>; \LocalAlloc
0100CFB9  |. 85C0           TEST EAX,EAX
0100CFBB  |. 8983 9C000000  MOV DWORD PTR DS:[EBX+9C],EAX
0100CFC1  |. 74 1B          JE SHORT taskmgr.0100CFDE
0100CFC3  
|. 8BCF           MOV ECX,EDI
0100CFC5  |. 8BF8           MOV EDI,EAX
0100CFC7  |. 8BC1           MOV EAX,ECX
0100CFC9  |. C1E9 02        SHR ECX,2
0100CFCC  
|. 8DB5 F4FDFFFF  LEA ESI,DWORD PTR SS:[EBP-20C]           
;到这里我们看到了带运行参数的字符串!兴奋!终于找到了。
0100CFD2  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0100CFD4  |. 8BC8           MOV ECX,EAX
0100CFD6  |. 83E1 03        AND ECX,3
0100CFD9  
|. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0100CFDB  |. 8B75 10        MOV ESI,DWORD PTR SS:[EBP+10]
0100CFDE  |> FFB5 F0FDFFFF  PUSH DWORD PTR SS:[EBP-210]              
; /hObject
0100CFE4  |. FF15 5C110001  CALL DWORD PTR DS:[<&kernel32.CloseHandl>; \CloseHandle
01026F00   81F9 D0C30000  CMP ECX,0C3D0                                 ;判断菜单是不是"映像路径(I)"
01026F06   . 0F85 A3000000  JNZ taskmgr.01026FAF                          ;不是则转原程序指令处
01026F0C   . 60             PUSHAD                                        ;保护现场
01026F0D   . 8B40 08        MOV EAX,DWORD PTR DS:[EAX+8]                  ;进程PID
01026F10   . 83F8 04        CMP EAX,4                                     ;判断是不是SYSTEM.EXE进程
01026F13   . 0F84 95000000  JE taskmgr.01026FAE                           ;是则转恢复现场
01026F19   . 50             PUSH EAX                                      ; /ProcessId
01026F1A   . 6A 00          PUSH 0                                        ; |Inheritable = FALSE
01026F1C   . 68 10040000    PUSH 410                                      ; |Access = VM_READ|QUERY_INFORMATION
01026F21   . FF15 14110001  CALL DWORD PTR DS:[<&kernel32.OpenProcess>]   ; \OpenProcess
01026F27   . 8985 00FAFFFF  MOV DWORD PTR SS:[EBP-600],EAX                ;将OpenProcess打开的句柄保存
01026F2D   . 83A5 F8F9FFFF >AND DWORD PTR SS:[EBP-608],0                  ;将字符串保存地址清零
01026F34   . 85C0           TEST EAX,EAX                                  ;判断EAX是否为0即OpenProcess是否成功
01026F36   . 74 76          JE SHORT taskmgr.01026FAE                     ;不成功跳到恢复现场
01026F38   . 68 04010000    PUSH 104
01026F3D   . 8D85 F4FBFFFF  
LEA EAX,DWORD PTR SS:[EBP-40C]
01026F43   . 50             PUSH EAX                                      
;传入保存结果地址
01026F44   . FFB5 00FAFFFF  PUSH DWORD PTR SS:[EBP-600]                   ;OpenProcess句柄
01026F4A   . E8 F9B6FEFF    CALL taskmgr.01012648                         ;获取进程映像路径的函数
01026F4F   . 85C0           TEST EAX,EAX                                  ;EAX保存查询到的字符串WORD数
01026F51   . 74 31          JE SHORT taskmgr.01026F84                     ;没有查询到则转CloseHandle
01026F53   . 8D3C00         LEA EDI,DWORD PTR DS:[EAX+EAX]                ;转为字节数保存到EDI
01026F56   . 8D47 02        LEA EAX,DWORD PTR DS:[EDI+2]                  ;字符串结尾0000需要两个字节
01026F59   . 50             PUSH EAX                                      ; /Size
01026F5A   . 6A 40          PUSH 40                                       ; |Flags = LPTR
01026F5C   . FF15 38110001  CALL DWORD PTR DS:[<&kernel32.LocalAlloc>]    ; \LocalAlloc
01026F62   . 85C0           TEST EAX,EAX                                  ;判断是否申请成功,成功EAX为地址
01026F64   . 8985 F8F9FFFF  MOV DWORD PTR SS:[EBP-608],EAX                ;将申请到的空间首地址保存
01026F6A   . 74 18          JE SHORT taskmgr.01026F84                     ;不成功转OpenProcess
01026F6C   . 8BCF           MOV ECX,EDI
01026F6E   . 8BF8           MOV EDI,EAX                                   
;字符串复制目的地址放入EDI
01026F70   . 8BC1           MOV EAX,ECX                                   ;复制字节数保存在EAX
01026F72   . C1E9 02        SHR ECX,2                                     ;字节数/4=按DWORD复制的次数
01026F75   . 8DB5 F4FBFFFF  LEA ESI,DWORD PTR SS:[EBP-40C]                ;字符串复制源地址存入ESI
01026F7B   . F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI];执行字符串双字复制
01026F7D   . 8BC8           MOV ECX,EAX
01026F7F   . 83E1 03        AND ECX,3                                     
;计算剩余字节数,即按字节复制次数
01026F82   . F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]  ;执行字符串字节复制
01026F84   FFB5 00FAFFFF  PUSH DWORD PTR SS:[EBP-600]                   ; /hObject
01026F8A   . FF15 5C110001  CALL DWORD PTR DS:[<&kernel32.CloseHandle>]   ; \CloseHandle
01026F90   . 8B85 F8F9FFFF  MOV EAX,DWORD PTR SS:[EBP-608]                ;读取保存的字符串地址
01026F96   . 85C0           TEST EAX,EAX
01026F98   . 74 14          JE SHORT taskmgr.01026FAE                     
;没有有效字符串地址则不弹消息框
01026F9A   . 6A 00          PUSH 0                                        ; /Style = MB_OK|MB_APPLMODAL
01026F9C   . 68 C06F0201    PUSH taskmgr.01026FC0                         ; |Title = "映像路径"
01026FA1   . 50             PUSH EAX                                      ; |Text
01026FA2   . FF35 645D0101  PUSH DWORD PTR DS:[1015D64]                   ; |hOwner = NULL
01026FA8   . FF15 94120001  CALL DWORD PTR DS:[<&user32.MessageBoxW>]     ; \MessageBoxW
01026FAE   61             POPAD                                         ;恢复现场
01026FAF   81F9 CFC30000  CMP ECX,0C3CF                                 ;跳转处替换的汇编指令
01026FB5   .^E9 974EFEFF    JMP taskmgr.0100BE51                          ;转到原程序执行处
01026FBA     0000           ADD BYTE PTR DS:[EAX],AL
01026FBC     0000           ADD BYTE PTR DS:[EAX],AL
01026FBE     0000           ADD BYTE PTR DS:[EAX],AL
01026FC0     2066 CF50                                                    
;标题(Unicode)
01026FC4     EF8D 845F      
01026FC8     0000

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (69)
雪    币: 500
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
..占楼..
2009-8-16 22:14
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hcg
3
感謝樓主分享,下載測試新增功能
2009-8-16 23:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,领会中
2009-8-17 16:23
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看看先
2009-8-17 20:12
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
TAG:DIY EXE比较有意思,值得收藏
2009-8-17 20:54
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,收藏了!
2009-8-17 20:57
0
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢lZ,试试看看。
2009-8-17 21:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很不错的东西先收藏了
2009-8-19 01:27
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

眼睛都看花了
呵呵  
看起来感觉有些晦涩
但是真的很精彩
谢谢了
2009-8-19 12:22
0
雪    币: 421
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
呃,都牛人,等没事了来学习一下
2009-8-30 16:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
留个脚印学习中,嘎嘎!
2009-8-31 08:13
0
雪    币: 274
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习下··~~~
2009-8-31 08:30
0
雪    币: 411
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习中,路过留下脚印
2009-8-31 08:39
0
雪    币: 390
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
历害楼主,学习了...
2009-8-31 18:42
0
雪    币: 170
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习了,领会中
2009-8-31 18:59
0
雪    币: 167
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
强 支持学习
2009-8-31 19:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢,楼主很强大,学习了。。。
2009-8-31 20:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
俺来下载··············
2009-8-31 22:37
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
下载来看看..
2009-9-1 07:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
厉害呀 都是大牛哟
2009-9-1 08:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
很好  学习了
2009-9-1 09:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错。肯花时间还是会有东西出来的。
2009-9-1 11:48
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢楼主。 学习一下。
2009-9-1 19:43
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
太强悍了,lz太牛了
2009-9-1 20:40
0
游客
登录 | 注册 方可回帖
返回
//