预览模式: 普通 | 列表
希望能得到这样的结果  

磁盘  1  的分区  1  :  C  
磁盘  1  的分区  2  :  D  
磁盘  1  的分区  3  :  E  
磁盘  1  的分区  4  :  F  
磁盘  2  的分区  1  :  G  
磁盘  2  的分区  2  :  I  
磁盘  2  的分区  3  :  J  
磁盘  2  的分区  4  :  K  

---------------------------------------------------------------  
就是这样了,GetVolumeInfo('C').DiskNumber结果就是所在的物理磁盘ID  

需要JEDI的Win32支持库才能编译!  

function  GetVolumeInfo(DriverLetter:  Char):  TDiskExtent;  
var  
   hVolume:  THandle;  
   DiskExtents:  PVolumeDiskExtents;  
   dwOutBytes:  Cardinal;  
begin  
   with  Result  do  
       begin  
           DiskNumber  :=  0;  
           StartingOffset.QuadPart  :=  0;  
           ExtentLength.QuadPart  :=  0;  
       end;  
   hVolume  :=  CreateFile(PChar('\\.\'+DriverLetter+':'),  GENERIC_READ  or  GENERIC_WRITE,  
                                                 FILE_SHARE_READ  or  FILE_SHARE_WRITE,  nil,  OPEN_EXISTING,  0,  0);  
   if  hVolume  <  1  then  Exit;  
   DiskExtents  :=  AllocMem(Max_Path);  
   if  DeviceIoControl(hVolume,  
                               IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,  
                               nil,  0,  
                               DiskExtents,  Max_Path,  
                               dwOutBytes,  nil)  then  
         begin  
             if  DiskExtents^.NumberOfDiskExtents  >  0  then  
                   Result  :=  DiskExtents^.Extents[0];  
         end;  
   FreeMem(DiskExtents);  
   CloseHandle(hVolume);  
end;  
  
http://lysoft.g4soft.net

查看更多...

Tags: 分区查找

分类:Tech | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2968

win2000/xp/2003下不能关闭程序的方法

只针对2000以上系统,9X的就别问我了,4年没搞了:)  

一般有4种方法:  

1)DLL挂靠方法  
程序改写为DLL结构,挂靠Explorer.exe上运行  
好处:没进程实体,普通进程查看无效  
缺点:可以通过代码叫Explorer.exe  Unload你的Dll,呵呵,还有Explorer出错时,会重新启用,那个时候需要重新挂靠你的DLL  
改进:用Debug权限挂靠WinLogon.exe,哈哈,安全系数就高很多,WinLogon死了,你也就死机了  

我主页的/projects/No  Ctrl+Alt+Del.rar是DLL挂靠方法的例子,修改就可用  

2)API  Hook方法  
关闭程序的实质是什么?TerminateProcess的API!  
只要你的Application.Title:=‘’就不会出现在任务管理器的第一页  
第二页会出现的,但不怕,我Hook了TerminateProcess就可以保证安全了  
TerminateProcess可以Hook?可以,但Hook了没用,Handle是未知的  
因此实质上要Hook的是OpenProcess,只要是我的进程就拒绝打开  
好处:不怕你见的到,你就是关不了我  
缺点:CMD下的命令行方法Hook不到  
改进:能够Hook系统服务就一定可以,可惜难度大,需要编写驱动  

我主页的/projects/API  Hook.rar是API  Hook方法的例子,修改就可用  

3)NT内核修改方法  
修改NT系统内核对象PsLoadedModuleList上的ActiveProcessLink链表就可以在系统上“失踪”了,但实现这个功能需要驱动支持,没驱动的方法只能适合XP/2003,因为Nt5.1以上的ZwSystemDebugControl  API才能支持内核访问  
好处:你怎么都见不到进程的  
缺点:难度过大,用内核工具仍然可以看见的,很多RootKit木马就用这个方法的  
改进:几乎是终极大法,没什么别的好方法了。  

我主页的/projects/NTLowLevel.exe是演示程序

关键代码如下  
function  HideProcess:  boolean;  
label  Err;  
var  
   EProcess  :  DWord;  
   hPM,  FLink,  BLink:  Cardinal;  
begin  
   Result  :=  false;  
   EProcess  :=  GetCurrentEProcess;  
   if  EProcess  <  1  then  Exit;  
   if  not  ReadVirtualMemory(EProcess+$88,  @FLink,  4)  then  Exit;  
   if  not  ReadVirtualMemory(EProcess+$8C,  @BLink,  4)  then  Exit;  
   if  not  WriteVirtualMemory(FLink+4,  @BLink,  4)  then  Exit;  
   if  not  WriteVirtualMemory(BLink,  @FLink,  4)  then  Exit;  
   Result  :=  true;  
end;  

不要问为什么了,你需要NTDDK的知识才能明白的:)  

4)远程线程方法
没有实体的存在,没进程,没DLL,只有代码  
把代码直接注入进程空间VirtualAllocEx,用CreateRemoteThread运行,  
好处:没可见的实体,隐蔽性最强  
缺点:适合于简单代码,复杂的难以保证其可靠性和稳定性,病毒的最爱  
改进:不需要什么了  

这个没演示了,呵呵:)  
注入某个进程空间,要涉及到API定位等一系列病毒式操作,在对方的身体运行呀  
简单的代码可以,复杂的功能就很不适合,一般的程序根本就不适合,所以除非写病毒,否则不建议用这样的方法,因为连调试都变得很难  

by LYSoft

查看更多...

Tags: 不能关闭程序的方法

分类:Tech | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 4006
program Test;

uses
  Windows,
  SysUtils,
  ExtCtrls,
  Classes,
  Forms;

var
  timer1:TTimer; Method:TMethod;

procedure Timer1Timer(Self, Sender: TObject);  // 注意要比类下面的方法多一个Self参数
// 在类中声明是隐含了的, 改为外部声明就必须包含这个4 Bytes的用来传递TMethod.Data的参数
begin
  MessageBox(0, 'aa', 'bb', 0);
end;

begin
   timer1:=TTimer.Create(nil);
   timer1.Interval:=3000;
   Method.Data := nil;
   Method.Code := @Timer1Timer;
   timer1.OnTimer:= TNotifyEvent(Method);
   while True do Application.ProcessMessages;
end.

查看更多...

Tags: TMethod

分类:Tech | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3765