-
-
[原创]第一次PEDIY---让Windows 任务管理器更强,更人性!
-
发表于:
2009-8-16 22:12
35166
-
[原创]第一次PEDIY---让Windows 任务管理器更强,更人性!
【文章标题】: 第一次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期)