• Windows CryptoAPI AES加解密

    ·

    发布于

    修改于

    #include <Windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    
    void ShowError(const char* pszText);
    BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength);
    BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength);
    
    
    int main(int argc, _TCHAR* argv[])
    {
        BYTE pData[MAX_PATH] = { 0 };
        DWORD dwDataLength = 0, dwBufferLength = MAX_PATH;
        DWORD i = 0;
    
        RtlZeroMemory(pData, dwBufferLength);
        lstrcpyA((char*)pData, "Hello World !11111111111111111122222222222222222222");
        dwDataLength = lstrlenA((char*)pData);
    
        printf("Text[%d]\n", dwDataLength);
        for (i = 0; i < dwDataLength; i++)
        {
            printf("%x ", pData[i]);
        }
        printf("\n\n");
    
        //AES加密
        AesEncrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength);
        printf("AES Encrypt[%d]\n", dwDataLength);
        for (i = 0; i < dwDataLength; i++)
        {
            printf("%x ", pData[i]);
        }
        printf("\n\n");
    
        //AES解密
        AesDecrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength);
        printf("AES Decrypt[%d]\n", dwDataLength);
        for (i = 0; i < dwDataLength; i++)
        {
            printf("%x ", pData[i]);
        }
        printf("\n\n");
    
        system("pause");
        return 0;
    }
    
    
    void ShowError(const char* pszText)
    {
        char szErr[MAX_PATH] = { 0 };
        wsprintfA(szErr, "%s Error [%d]", pszText, GetLastError());
        MessageBoxA(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
    }
    
    
    //AES加密
    BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength)
    {
        BOOL bRet = TRUE;
        HCRYPTPROV hCryptprov = 0;
        HCRYPTHASH hCryptHash = 0;
        HCRYPTKEY hCryptKey = 0;
    
        do
        {
            //获取CSP句柄
            bRet = CryptAcquireContextA(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
            if (FALSE == bRet)
            {
                ShowError("CryptAcquireContext");
                break;
            }
    
            //创建HASH对象
            bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash);
            if (FALSE == bRet)
            {
                ShowError("CryptCreateHash");
                break;
            }
    
            //对密钥进行HASH计算
            bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
            if (FALSE == bRet)
            {
                ShowError("CryptHashData");
                break;
            }
    
            //使用HASH来生成密钥
            bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
            if (FALSE == bRet)
            {
                ShowError("CryptDeriveKey");
                break;
            }
    
            bRet = CryptEncrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength, dwBufferLength);
            if (FALSE == bRet)
            {
                ShowError("CryptEncrypt");
                break;
            }
    
        } while (FALSE);
    
        if (hCryptKey)
        {
            CryptDestroyKey(hCryptKey);
        }
        if (hCryptHash)
        {
            CryptDestroyHash(hCryptHash);
        }
        if (hCryptprov)
        {
            CryptReleaseContext(hCryptprov, 0);
        }
        return bRet;
    }
    
    //AES解密
    BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength)
    {
        BOOL bRet = TRUE;
        HCRYPTPROV hCryptprov = 0;
        HCRYPTHASH hCryptHash = 0;
        HCRYPTKEY hCryptKey = 0;
    
        do
        {
            //获取CSP句柄
            bRet = CryptAcquireContext(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
            if (FALSE == bRet)
            {
                ShowError("CryptAcquireContext");
                break;
            }
    
            //创建HASH对象
            bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash);
            if (FALSE == bRet)
            {
                ShowError("CryptCreateHash");
                break;
            }
    
            //对密钥进行HASH计算
            bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
            if (FALSE == bRet)
            {
                ShowError("CryptHashData");
                break;
            }
    
            //使用HASH来生成密钥
            bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
            if (FALSE == bRet)
            {
                ShowError("CryptDeriveKey");
                break;
            }
    
            bRet = CryptDecrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength);
            if (FALSE == bRet)
            {
                ShowError("CryptDecrypt");
                break;
            }
    
        } while (FALSE);
    
        if (hCryptKey)
        {
            CryptDestroyKey(hCryptKey);
        }
        if (hCryptHash)
        {
            CryptDestroyHash(hCryptHash);
        }
        if (hCryptprov)
        {
            CryptReleaseContext(hCryptprov, 0);
        }
        return bRet;
    }
    
    

     


  • 格式化文件体积

    ·

    发布于

    修改于

    两个函数

    1. StrFormatByteSize
    2. StrFormatByteSize64

    StrFormatByteSize64 can be used for either ANSI or Unicode characters. However, while StrFormatByteSize64A can be called directly, StrFormatByteSize64W is not defined. When StrFormatByteSize64 is called with a Unicode value, StrFormatByteSizeW is used.

    In Windows 10, size is reported in base 10 rather than base 2. For example, 1 KB is 1000 bytes rather than 1024.

    The following table illustrates how this function converts a numeric value into a text string.

    REMARKS
    Numeric value Text string
    532 532 bytes
    1340 1.30 KB
    23506 23.5 KB
    2400016 2.40 MB
    2400000000 2.4 GB

  • boost中json库的用法

    ·

    发布于

    修改于

    boost在最新的1.75版本加入了json库,下面是该库的使用小例。

    #include <stdio.h>
    #include <boost/json.hpp>
    #include <iostream>
    
    
    void test1(std::string &str)
    {
        boost::json::object obj;
    
        obj["1"] = { {"v1","abc"},
                       {"v2","def"} ,
                       {"v3","ghi"},
                       {"v4",1234},
                       {"v5", 5678}
        };
        
        obj["2"] = "test";
    
        str = boost::json::serialize(obj);
    
        
    }
    
    void main(int argc, char* argv[])
    {
        std::string str;
        test1(str);
        std::cout << str << std::endl;
        //解析字符串
        boost::json::value val = boost::json::parse(str);
    
        if (val.is_object())
        {
            for (auto obj : val.as_object())
            {
                if (obj.key() == "1")
                {
                    if (obj.value().is_object() == false)
                    {
                        break;
                    }
                    for (auto elm : obj.value().as_object())
                    {
                        if (elm.key() == "v1")
                        {
                            if (elm.value().is_string() == false)
                            {
                                break;
                            }
                            std::cout << elm.value() << std::endl;
                        }
                        if (elm.key() == "v2")
                        {
                            if (elm.value().is_string() == false)
                            {
                                break;
                            }
                            std::cout << elm.value() << std::endl;
                        }
                        if (elm.key() == "v3")
                        {
                            if (elm.value().is_string() == false)
                            {
                                break;
                            }
                            std::cout << elm.value() << std::endl;
                        }
                        if (elm.key() == "v4")
                        {
                            if (elm.value().is_number() == false)
                            {
                                break;
                            }
                            std::cout << elm.value() << std::endl;
                        }
                        if (elm.key() == "v5")
                        {
                            if (elm.value().is_number() == false)
                            {
                                break;
                            }
                            std::cout << elm.value() << std::endl;
                        }
                    }
                }
                if (obj.key() == "2")
                {
                    if (obj.value().is_string() == false)
                    {
                        break;
                    }
                    std::cout << obj.value() << std::endl;
                }
            }
        }
        getchar();
    }


  • 36项特权

    ·

    发布于

    修改于

    SeAssignPrimaryTokenPrivilege
    SeAuditPrivilege
    SeBackupPrivilege
    SeChangeNotifyPrivilege
    SeCreateGlobalPrivilege
    SeCreatePagefilePrivilege
    SeCreatePermanentPrivilege
    SeCreateSymbolicLinkPrivilege
    SeCreateTokenPrivilege
    SeDebugPrivilege
    SeDelegateSessionUserImpersonatePrivilege
    SeEnableDelegationPrivilege
    SeImpersonatePrivilege
    SeIncreaseBasePriorityPrivilege
    SeIncreaseQuotaPrivilege
    SeIncreaseWorkingSetPrivilege
    SeLoadDriverPrivilege
    SeLockMemoryPrivilege
    SeMachineAccountPrivilege
    SeManageVolumePrivilege
    SeProfileSingleProcessPrivilege
    SeRelabelPrivilege
    SeRemoteShutdownPrivilege
    SeRestorePrivilege
    SeSecurityPrivilege
    SeShutdownPrivilege
    SeSyncAgentPrivilege
    SeSystemEnvironmentPrivilege
    SeSystemProfilePrivilege
    SeSystemtimePrivilege
    SeTakeOwnershipPrivilege
    SeTcbPrivilege
    SeTimeZonePrivilege
    SeTrustedCredManAccessPrivilege
    SeUndockPrivilege
    SeUnsolicitedInputPrivilege

     


  • 没有TPM芯片的情况下开启系统盘BitLocker

    ·

    发布于

    修改于

    步骤1
    步骤1
    步骤2

    设置完成后就可以加密系统盘了。加密完成后,每次开机的时候需要先输入密码才能开始引导进系统。


  • 获取计算机CPU核心数

    ·

    发布于

    修改于

    #include <Windows.h>
    
    DWORD CountSetBits(ULONG_PTR bitMask)
    {
    	DWORD LSHIFT = sizeof(ULONG_PTR) * 8 - 1;
    	DWORD bitSetCount = 0;
    	ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;
    	DWORD i;
    
    	for (i = 0; i <= LSHIFT; ++i)
    	{
    		bitSetCount += ((bitMask & bitTest) ? 1 : 0);
    		bitTest /= 2;
    	}
    
    	return bitSetCount;
    }
    
    VOID GetProcessorCoreCount(PDWORD LogicalProcessorCount, PDWORD ProcessorCoreCount)
    {
    	PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ProcessorInfo;
    	DWORD ReturnedLength = 0;
    
    	*LogicalProcessorCount = 0;
    	*ProcessorCoreCount = 0;
    	GetLogicalProcessorInformation(NULL, &ReturnedLength);
    	ProcessorInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)LocalAlloc(LPTR, ReturnedLength);
    	GetLogicalProcessorInformation(ProcessorInfo, &ReturnedLength);
    
    	for (DWORD i = 0; i < ReturnedLength / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
    	{
    		if (ProcessorInfo[i].Relationship == RelationProcessorCore)
    		{
    			(*ProcessorCoreCount)++;
    			*LogicalProcessorCount += CountSetBits(ProcessorInfo[i].ProcessorMask);
    		}
    	}
    	LocalFree(ProcessorInfo);
    }
    
    
    int main()
    {
    	DWORD LogicalProcessorCount, ProcessorCoreCount;
    	GetProcessorCoreCount(&LogicalProcessorCount, &ProcessorCoreCount);
    	printf("logical:%d  core:%d\n", LogicalProcessorCount, ProcessorCoreCount);
    }

  • Windows exe服务程序

    ·

    发布于

    修改于

    #include <windows.h>
    
    TCHAR szServiceName[] = "ServiceProject";
    DWORD g_CurrentState;
    SERVICE_STATUS_HANDLE g_SSHandle;
    
    void MyWriteFileA(const CHAR* aaa, DWORD bbb = 0)
    {
    	HANDLE fileHandle = CreateFile("C:\\Info.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (fileHandle == INVALID_HANDLE_VALUE)
    	{
    		return;
    	}
    	int dwPos = SetFilePointer(fileHandle, 0, NULL, FILE_END);
    	DWORD writeSize = 0;
    	if (bbb == 0)
    	{
    		if (!WriteFile(fileHandle, aaa, lstrlen(aaa), &writeSize, NULL) && writeSize != lstrlen(aaa))
    		{
    			CloseHandle(fileHandle);
    			return;
    		}
    	}
    	else {
    		if (!WriteFile(fileHandle, aaa, bbb, &writeSize, NULL) && writeSize != bbb)
    		{
    			CloseHandle(fileHandle);
    			return;
    		}
    	}
    	CloseHandle(fileHandle);
    }
    
    BOOL TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress)
    {
    	SERVICE_STATUS srvStatus;
    	srvStatus.dwServiceType = SERVICE_WIN32;
    	srvStatus.dwCurrentState = g_CurrentState = dwState;
    	srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
    	srvStatus.dwWin32ExitCode = dwExitCode;
    	srvStatus.dwServiceSpecificExitCode = 0;
    	srvStatus.dwCheckPoint = dwProgress;
    	srvStatus.dwWaitHint = 1000;
    	return SetServiceStatus(g_SSHandle, &srvStatus);
    }
    
    void WINAPI ServiceControl(DWORD dwCommand)
    {
    	switch (dwCommand)
    	{
    	case SERVICE_CONTROL_STOP:
    		MyWriteFileA("SERVICE_CONTROL_STOP\r\n");
    		TellSCM(SERVICE_STOP_PENDING, 0, 1);
    		TellSCM(SERVICE_STOPPED, 0, 0);
    		break;
    	case SERVICE_CONTROL_PAUSE:
    		MyWriteFileA("SERVICE_CONTROL_PAUSE\r\n");
    		TellSCM(SERVICE_PAUSE_PENDING, 0, 1);
    		TellSCM(SERVICE_PAUSED, 0, 0);
    		break;
    	case SERVICE_CONTROL_CONTINUE:
    		MyWriteFileA("SERVICE_CONTROL_CONTINUE\r\n");
    		TellSCM(SERVICE_CONTINUE_PENDING, 0, 1);
    		TellSCM(SERVICE_RUNNING, 0, 0);
    		break;
    	case SERVICE_CONTROL_INTERROGATE:
    		MyWriteFileA("SERVICE_CONTROL_INTERROGATE\r\n");
    		TellSCM(g_CurrentState, 0, 0);
    		break;
    	case SERVICE_CONTROL_SHUTDOWN:
    		MyWriteFileA("SERVICE_CONTROL_SHUTDOWN\r\n");
    		TellSCM(SERVICE_STOPPED, 0, 0);
    		break;
    	default:
    		MyWriteFileA("SERVICE_CONTROL_NONE\r\n");
    		break;
    	}
    }
    
    
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
    {
    	CHAR svcname[256] = { 0 };
    	lstrcpy(svcname, argv[0]);
    	g_SSHandle = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceControl);
    	if (!g_SSHandle)
    	{
    		return;
    	}
    	MyWriteFileA("SERVICE_CONTROL_START");
    	TellSCM(SERVICE_START_PENDING, 0, 1);
    	TellSCM(SERVICE_RUNNING, 0, 0);
    	//CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainStart, NULL, 0, NULL));
    }
    
    int main()
    {
    	SERVICE_TABLE_ENTRY ServiceTable[2];
    	ServiceTable[0].lpServiceName = szServiceName;
    	ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
    	ServiceTable[1].lpServiceName = NULL;
    	ServiceTable[1].lpServiceProc = NULL;
    	StartServiceCtrlDispatcher(ServiceTable);
    	return 0;
    }
    

  • VC编译openssl 3.0.7

    ·

    发布于

    修改于

    1. 安装ActivePerl和NASM
    2. 执行perl Configure no-asm no-shared no-sse2 zlib VC-WIN64A –prefix=d:\openssl-3.0.7 –with-zlib-include=d:\zlib-1.2.13 –with-zlib-lib=d:\zlib-1.2.13\zlib.lib 生成makefile
    3. 执行nmake 进行编译(或者使用jom)
    4. 执行nmake install进行安装
    • VC-WIN64A 使用VC编译器编译WIN64位版本,A表示架构为X64(区别于IA64)
    • VC-WIN32 使用VC编译器编译WIN32位版本
    • no-shared 编译为静态库
    • shared 编译为动态库(默认选项)
    • zlib 使用zlib静态库
    • zlib-dynamic 只用zlib动态库
    • no-zlib 不使用zlib

    可以通过修改第二步生成的makefile文件改变具体的编译链接选项,默认选项为/GF /Gs0 /Gy /MD,在3.1.3版本中发现已经没有这个/MD了,代码生成选项已经移动到了下面。下面是一些选项的含义。

    • /O2(最大速度优化)
    • /GF(消除重复的字符串)
    • /Gs(控制堆栈检查调用)
    • /Gy(启用函数级链接)

    可以根据需要在CFLAGS中调整代码生成选项,我这里使用/MT选项,记得删除文件中其它代码生成选项。若想编译调试版本需要将/MT改为/MDd。

    如果想使用jom -j<线程数>进行多线程编译,则必须给CFLAGS指定/FS选项。

    修改CFLAGS选项
    删除其它代码生成选项

    另外还有一些编译链接选项是分开的,也就是静态库、动态库、可执行程序都有自己独特的编译选项,修改这些内容的时候要注意区分。


  • PE文件释放资源

    ·

    发布于

    修改于

    姑且算是有C和C++两个版本吧。

    //C
    BOOL GetResource(HMODULE mod, const char* rname, const char* rtype, unsigned char** rdata, int* rlen)
    {
    	HRSRC rhandle = FindResourceA(mod, rname, rtype);
    	if (rhandle == NULL)
    		return FALSE;
    	*rlen = SizeofResource(mod, rhandle);
    	HGLOBAL global_handle = LoadResource(mod, rhandle);
    	if (NULL == global_handle)
    		return FALSE;
    	*rdata = LockResource(global_handle);
    	if (*rdata)
    	{
    		DWORD flOldProtect;
    		VirtualProtect(*rdata, *rlen, PAGE_READWRITE, &flOldProtect);
    		return TRUE;
    	}
    	FreeResource(global_handle);
    	return FALSE;
    }
    //C++
    bool GetResource(HMODULE module, const char * rname, const char * rtype, byte* &rdata, int &rlen)
    {
      HRSRC rhandle = FindResourceA(module, rname, rtype);
      if (rhandle == NULL)
        return false;
      rlen = SizeofResource(module, rhandle);
      HGLOBAL global_handle = LoadResource(module, rhandle);
      if (NULL == global_handle)
        return false;
      rdata = reinterpret_cast<byte*>(LockResource(global_handle));
      if (rdata)
      {
        DWORD flOldProtect;
        VirtualProtect(rdata, rlen, PAGE_READWRITE, &flOldProtect);
        return true;
      }
      FreeResource(global_handle);
      return false;
    }

  • 编译安装Apache

    ·

    发布于

    修改于

    下载apr和apr-util到apache源码目录下的srlib目录中,并去掉目录名称中的版本号,如图所示。

    安装步骤:

    1. 安装编译过程中需要用到的工具和库
    2. sudo apt-get install autoconf automake libtool libexpat1-dev libpcre3-dev

      其中前三个是编译apr需要用到的工具,libexpat1-dev是编译apr-util用到的库,最后libpcre3-dev是编译apache本体用到的库。

    3. apr
    4. cd srclib/apr
      ./configure --prefix=/usr/local/apr            
      make && make install
    5. apr-util
    6. cd srclib/apr-util
      ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
      make && make install
    7. apache
    8. ./configure --prefix=/opt/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
      make && make install

最新

NAS openwrt QNAP sing-box 电脑组装 网络设备 翻墙