首页
社区
课程
招聘
[原创]为任务管理器添加清理内存的功能
发表于: 2005-10-10 11:15 7691

[原创]为任务管理器添加清理内存的功能

2005-10-10 11:15
7691
作者:oHuangKeo
日期:2005-10-10
  现在有很多的内存清理工具,有的还要收费。其实原理很简单,只要获得了该进程的hProcess后,就可以调用SetProcessWorkingSetSize来设置内存使用,这里的参数设置为0xFFFFFF,就把该程序的内存使用设为0,由于该程序还在运行中,所以内存使用量并不是0,会是实际使用大小。
  好了,不多说了,动手做吧,不然要被人扔鸡蛋砸我了。

1。查找程序处理键盘按键位置。
  用资源编辑工具打开taskmgr.exe(我用的是freeRess),找到快捷键定义,分析一下。第一个就是Del键。Del的值是1050,这是十进制,换成十六进制为0x41A。用OD打开taskmgr.exe,搜索所有Switchs,找0x41A应该在哪里处理。找哇找,找到了,0100CECB处为Switch(case 3F0..41A),好去那里看看。为了测试这是不是就是DEL键,可以在这里下断,然后运行taskmgr.exe,在进程里随便选一个进程,然后按DEL键,OD会断下的,ecx里就是0x41A.证明我们找对地方了。那么我们定义个什么键来做为快捷键清理内存呢?我是用的Enter键(0x418),你也可以设置别的键,要想知道快捷键的值是多少,用刚才的方法,看看ecx里的值是多少就可以了。

2。找个空地写我们的代码。
  我选择的是从1014F00开始的地址。代码如下:
01014F00   > \60            pushad                                   ;  进栈保护寄存器的值
01014F01   .  E8 3A000000   call    taskmgr.01014F40                 ;  这里用Call是方便后面好写代码
01014F06   .  61            popad                                    ;  出栈,恢复寄存器
01014F07   .  81E9 F0030000 sub     ecx, 3F0                         ;  原程序中被覆盖的代码
01014F0D   .^ E9 BF7FFFFF   jmp     taskmgr.0100CED1                 ;  跳回去
01014F12   .  53 65 74 50 7>ascii   "SetProcessWorkin"               ;  这里开始到1014F2A是字符串SetProcessWorkingSetSize
01014F22   .  67 53 65 74 5>ascii   "gSetSize",0                     ;  因为程序中没有这个函数,所以要用GetProcAddress来得到函数地址
01014F2B   .  6B 65 72 6E 6>ascii   "kernel32.dll",0
01014F38      00            db      00
01014F39      00            db      00
01014F3A      00            db      00
01014F3B      00            db      00
01014F3C      00            db      00
01014F3D      00            db      00
01014F3E      00            db      00
01014F3F      00            db      00
01014F40  /$  81F9 18040000 cmp     ecx, 418                         ;  比较是不是回车键
01014F46  |.  75 37         jnz     short taskmgr.01014F7F           ;  不是就跳去返回
01014F48  |.  FF70 08       push    dword ptr ds:[eax+8]             ; /[eax+8]里就是当前所选进程的ProcessId
01014F4B  |.  6A 00         push    0                                ; |Inheritable = FALSE
01014F4D  |.  68 00010000   push    100                              ; |Access = SET_QUOTA
01014F52  |.  E8 2291807B   call    kernel32.OpenProcess             ; \OpenProcess
01014F57  |.  83F8 00       cmp     eax, 0                           ;  打开成功了吗?
01014F5A  |.  74 23         je      short taskmgr.01014F7F           ;  失败就跳去返回
01014F5C  |.  50            push    eax                              ;  进栈保存打开的hProcess
01014F5D  |.  68 2B4F0101   push    taskmgr.01014F2B                 ; /FileName = "kernel32.dll"
01014F62  |.  E8 10CE7E7B   call    kernel32.LoadLibraryA            ; \LoadLibraryA
01014F67  |.  68 124F0101   push    taskmgr.01014F12                 ; /ProcNameOrOrdinal = "SetProcessWorkingSetSize"
01014F6C  |.  50            push    eax                              ; |hModule
01014F6D  |.  E8 B65C7F7B   call    kernel32.GetProcAddress          ; \GetProcAddress
01014F72  |.  83F8 00       cmp     eax, 0                           ;  函数地址获得成功了吗?
01014F75  |.  74 08         je      short taskmgr.01014F7F           ;  不成功就跳去返回
01014F77  |.  5A            pop     edx                              ;  出栈,取出刚才打开的hProcess
01014F78  |.  6A FF         push    -1
01014F7A  |.  6A FF         push    -1
01014F7C  |.  52            push    edx                              ;  hProcess
01014F7D  |.  FFD0          call    near eax                         ;  call SetProcessWorkingSetSize
01014F7F  \>  C3            retn                                     ;  返回

这样添加好后,在把刚才原程序中0100CECB该成"jmp 01014F00",跳转到我们添加的代码就OK了。保存文件,运行一下试试。选择一个进程,按回车键,嘿嘿,内存减少了,嘻嘻。(不能是系统进程,因为权限不够。)

    在分析taskmgr.exe时还发现它会去打开注册表中的[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr]键值,如果不为0就会弹出“任务栏已被管理员禁止”。地址是
01005527  |. /74 4B         je      short taskmgr.01005574
这个是关键性的跳转。不跳就弹出“任务栏已被管理员禁止”,跳就继续后面的工作。

我修改好的下载地址:http://ohko.ys168.com

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
上瘾了!!!!
2005-10-10 12:13
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
来个PEdiy浪潮。
2005-10-10 12:15
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4

学习
2005-10-10 12:48
0
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
QUOTA
01014F52  |.  E8 2291807B   call    kernel32.OpenProcess             ; \OpenProcess
01014F62  |.  E8 10CE7E7B   call    kernel32.LoadLibraryA            ; \LoadLibraryA

要FF 15
2005-10-10 13:02
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵,有意思!收下!
2005-10-10 16:17
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
最初由 南蛮妈妈 发布
QUOTA
01014F52 |. E8 2291807B call kernel32.OpenProcess ; \OpenProcess
01014F62 |. E8 10CE7E7B call kernel32.LoadLibraryA ; \LoadLibraryA

要FF 15


你所说的FF 15是什么意思哇?
2005-10-10 17:49
0
雪    币: 221
活跃值: (100)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
最初由 ohuangkeo 发布



你所说的FF 15是什么意思哇?


FF 15 Address
call dword ptr[Address]的机器码

南蛮妈妈是指你在OD中直接
01014F52  |.  E8 2291807B   call    kernel32.OpenProcess             ; \OpenProcess
01014F62  |.  E8 10CE7E7B   call    kernel32.LoadLibraryA            ; \LoadLibraryA

修改后的程序不能跨平台运行,每台机器的OpenProcess,LoadLibrary在内存的地址并不一样,所以要间接调用。看雪老大前几天提过的问题。
2005-10-10 18:46
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
谢谢,懂了.我已修正过了.又学到了.下面是改后的代码.
01014F48  |.  FF70 08       push    dword ptr ds:[eax+8]             ; /ProcessId
01014F4B  |.  6A 00         push    0                                ; |Inheritable = FALSE
01014F4D  |.  68 00010000   push    100                              ; |Access = SET_QUOTA
01014F52  |.  FF15 B4100001 call    near dword ptr ds:[<&KERNEL32.Op>; \OpenProcess
01014F58  |.  83F8 00       cmp     eax, 0
01014F5B  |.  74 25         je      short taskmgr.01014F82
01014F5D  |.  50            push    eax
01014F5E  |.  68 2B4F0101   push    taskmgr.01014F2B                 ; /FileName = "kernel32.dll"
01014F63  |.  FF15 E4100001 call    near dword ptr ds:[<&KERNEL32.Lo>; \LoadLibraryA
01014F69  |.  68 124F0101   push    taskmgr.01014F12                 ; /ProcNameOrOrdinal = "SetProcessWorkingSetSize"
01014F6E  |.  50            push    eax                              ; |hModule
01014F6F  |.  FF15 04110001 call    near dword ptr ds:[<&KERNEL32.Ge>; \GetProcAddress
2005-10-10 19:06
0
雪    币: 227
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
弱弱的问下。照楼主的修改。好象本机可以使用。移动到别的机马上就出错。为什么?
2005-10-10 19:17
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
后面几位不是有提到吗?我在9楼又修正过了,可搬到别的机子上运行了.
2005-10-10 19:19
0
雪    币: 227
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学到了。谢谢了。
2005-10-10 19:44
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
好用
THX.........
2005-10-10 21:51
0
雪    币: 280
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
我下载了修正跨平台的版本,可是还是运行出错
提示无法定位程序输入点_ui64tow于动态链接库ntdll.dll上
我是win2k的系统。。。
看来只能自己动手改了。。。。。。。
2005-10-10 22:26
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
15
好!支持!
2005-10-10 22:40
0
雪    币: 212
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
是什么原理啊?是不是强制物理内存转到了虚拟内存?
2005-10-10 23:46
0
雪    币: 288
活跃值: (415)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
17
嗯,不错的东西 :D
2005-10-11 00:15
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
最初由 cgdxxx 发布
是什么原理啊?是不是强制物理内存转到了虚拟内存?


是的,强制性的.所以内存优化软件都是这样的.
2005-10-11 01:25
0
游客
登录 | 注册 方可回帖
返回
//