所谓的内存释放工具——原理

    技术2024-08-06  58

    刚才逆向了一个内存释放的小工具,原来是调用了SetProcessWorkingSetSize()函数,MSDN一下。

    此函数原型如下:

    BOOL SetProcessWorkingSetSize( HANDLE hProcess , SIZE_T dwMinimumWorkingSetSize , SIZE_T dwMaximumWorkingSetSize );

    hProcess是进程的句柄,dwMinimumWorkingSetSize和dwMaximumWorkingSetSize分别是设置程序运行空间的最小和最大空间。

    其实这个函数的功能就是保留一些必要的代码在内存中运行,其余的直接扔虚拟内存里去了。所谓虚拟内存,其实就是硬盘中划分出来的一片区域用来作内存使用。不过,这个只是暂时性地放进虚拟内存里,一旦程序激活了,内存又会被重新占用。其实这个特性操作系统本身就有的,可以先打开任务管理器,观察某个进程,如果将其窗口最小化后,所占用内存一下子就减小了;一旦被激活,又要开始重新对内存进行占用,这就是所谓的后台运行。

    所以事实上并没有节约多少内存,一切都是骗眼睛的,这样做反而增加了内存与硬盘的页面交换频率,硬盘的针就转得更快了,有时反而更降低系统的性能。

    贴一段代码:

    #include <stdio.h>#include <windows.h>#include <tlhelp32.h>/*time :    2010.5.9by     :    乱雪email:    lx#shellcodes.orgSetProcessWorkingSetSize函数演示*/int main(){    PROCESSENTRY32 pentry = {sizeof(pentry)};              //填充大小    HANDLE hPSnap =::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //建立快照    BOOL bMore = ::Process32First(hPSnap,&pentry);     //得到首个进程

        //循环搜索    while(bMore)    {        if(strcmp("QQ.exe",pentry.szExeFile) == NULL)        //搜索QQ.exe这个进程        {            //如果找到,就用OpenProcess获得它的句柄            //根据MSDN对SetProcessWorkingSetSize的描述,进程必须有PROCESS_SET_QUOTA权限            HANDLE hProcess = ::OpenProcess(PROCESS_SET_QUOTA,                                        FALSE,                                        pentry.th32ProcessID);        //hProcess不为空就表明获得了句柄值        if(hProcess != NULL)            //调用SetProcessWorkingSetSize函数            ::SetProcessWorkingSetSize(hProcess, -1, -1);        else            break;        }        bMore = ::Process32Next(hPSnap,&pentry); //获得下一个进程    }    ::CloseHandle(hPSnap);   //关闭句柄    return 0;}

    这段代码演示了对QQ进程(QQ.exe)的进程释放。首先建立一个进程快照,然后开始搜索QQ.exe这个进程,如果找到了就打开它的句柄,然后进行内存释放。

    如图,在释放前QQ进程所占的内存大小:

    编译运行后,QQ.exe所占用的内存大小,如图:

    就这回事儿,晕。

    PS:真的很简单  但是没什么大用处。。。。只能骗骗不知道的人了~~~

    最新回复(0)