怎么样知道硬盘上有哪几个分区或者指定的分区是在哪一个硬盘上
作者:lysoft 日期:2005-02-04
希望能得到这样的结果
磁盘 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
磁盘 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
win2000/xp/2003下不能关闭程序的方法
作者:lysoft 日期:2005-02-04
只针对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
一般有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
TMethod的妙用:解决动态创建的组件的事件赋值问题 by LYSoft LiuYang
作者:lysoft 日期:2005-02-01
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.
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.








