看流星社区

 找回密码
 注册账号
查看: 2090|回复: 0

模拟锁定文件

[复制链接]

该用户从未签到

发表于 2017-6-2 13:31:47 | 显示全部楼层 |阅读模式

模拟锁定文件的Rring 3下的程序代码,代码来自于看雪中的HWL发表的一份代码中,我只是看了下代码:

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. void GetAllProcessA(int pids[],int *procount)
  4. {
  5.         int i=0,c=0;
  6.         HANDLE hProcess=0;
  7.         for(i=8;i<19996;i+=4)
  8.         {
  9.                 hProcess=OpenProcess(0x10,0,i);
  10.                 if (hProcess!=0)
  11.                 {
  12.                         pids[c]=i;
  13.                         CloseHandle(hProcess);
  14.                         c++;
  15.                 }
  16.         }
  17.         *procount=c;
  18. }
  19. int main()
  20. {
  21.         #define SE_DEBUG_PRIVILEGE 0x14 //DEBUG 权限
  22.         //源码中没有__stdcall,所以一直报checkesp.c  line 14的错误
  23.         typedef long (__stdcall *RTLADJUSTPRIVILEGE)(int, bool, bool, int*);
  24.         typedef long (__stdcall *NTDUPLICATEOBJECT)(HANDLE,HANDLE,HANDLE,PHANDLE,ACCESS_MASK,BOOLEAN,ULONG);
  25.         int nEn = 0;
  26.         int pids[4*260];
  27.         int procsnum=0;
  28.         char pFile[260];
  29.         //得到函数的地址
  30.         RTLADJUSTPRIVILEGE getdbg=(RTLADJUSTPRIVILEGE)GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"RtlAdjustPrivilege");
  31.         NTDUPLICATEOBJECT NtDuplicateObject=(NTDUPLICATEOBJECT)GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"NtDuplicateObject");
  32.         //提升进程权限
  33.         getdbg(SE_DEBUG_PRIVILEGE , TRUE, FALSE,&nEn);//SE_DEBUG_PRIVILEGE =20
  34.         //getdbg(20,1,0,&bRet);
  35.         memset(pids,0,4*260);
  36.         memset(pFile,0,260);
  37.         printf("Input the file name you want to protect: ");
  38.         scanf("%s",pFile);
  39.         //新建文件
  40.         //#define GENERIC_READ                     (0x80000000L)
  41.         //HANDLE hsFile = CreateFileA(pFile, 0x80000000, 0, 0, 3, 0, 0);
  42.         HANDLE hsFile = CreateFileA(pFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  43.         //SetHandleInformation(hsFile,0,2);
  44.         SetHandleInformation(hsFile, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE); //#define HANDLE_FLAG_PROTECT_FROM_CLOSE  0x00000002
  45.        
  46.         //得到当前存活的进程id列表和进程数目,
  47.         GetAllProcessA(pids,&procsnum);
  48.         //遍历当前存活的进程
  49.         for(int i=0;i<procsnum;i++)
  50.         {
  51.                 HANDLE htFile=0;
  52.                 //HANDLE hProcess = OpenProcess(0x1F0FFF, 0, pids[i]);
  53.                 //#define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
  54.                 //#define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  55.                 0xFFFF)
  56.                 //#define SYNCHRONIZE                      (0x00100000L)
  57.                 //不知道原作者为什么要用这些魔幻数,而不用PROCESS_ALL_ACCESS
  58.                 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pids[i]);
  59.                 if (hProcess!=0)
  60.                 {
  61.                         //NtDuplicateObject((HANDLE)-1, hsFile, hProcess, &htFile, 0, 0, 4);
  62.                         NtDuplicateObject((HANDLE)-1, hsFile, hProcess, &htFile, 0, 0, 4); //DUPLICATE_SAME_ATTRIBUTES = 4
  63.                         CloseHandle(hProcess);
  64.                 }
  65.         }
  66.         getchar();
  67.         printf("OK!\n");
  68.         getchar();
  69.         return 0;
复制代码



代码分析:遍历当前进程,将文件句柄复制到每个进程中,从而实际锁定文件
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 10:50

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表