C语言实现区块加密
2016-02-03 18:25
495 查看
哈 学了几节PE格式,写了一个这玩意(还有一个PE信息查看的 没写完呢)
需要的基础知识:
只需要一点点的PE结构基础就可以了
参考小甲鱼老师的PE结构详解(听懂其中前三节左右)
既然是加密,那肯定需要加密算法吧。
这次我是用XOR加密和凯撒密码来加密程序数据
XOR加密其实很简单,就是对文件进行二进制操作(异或大法好~)
数据相等为0,不相等为1.也就是说 XOR加密算法既可以加密也可以解密~
XOR加密
解密函数
首先需要输入文件名
判断文件是否打开失败
创建一个内核映射对象
映射起始地址
定位到要加密的区段
加密或解密数据
接下来是全部的代码(上面已经贴的差不多了哈)
需要的基础知识:
只需要一点点的PE结构基础就可以了
参考小甲鱼老师的PE结构详解(听懂其中前三节左右)
既然是加密,那肯定需要加密算法吧。
这次我是用XOR加密和凯撒密码来加密程序数据
XOR加密其实很简单,就是对文件进行二进制操作(异或大法好~)
数据相等为0,不相等为1.也就是说 XOR加密算法既可以加密也可以解密~
XOR加密
void xor(unsigned char*code,char *key,int keyt,int codet) { for(int i=0;i<codet;) { for(int j=0;(j<keyt)&&(i<codet);j++,i++) { code[i]=code[i]^key[j]; code[i]=~code[i]; } } return; }
void plus(unsigned char *code,long size) { for(int i=0;i<size;i++) code[i]=code[i]+63; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]+23; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]+13; return; }
解密函数
void un(unsigned char *code,long size) { for(int i=0;i<size;i++) code[i]=code[i]-13; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]-23; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]-63; return; }
首先需要输入文件名
scanf("%s ",FileName); scanf("%s",SecName); hFile=CreateFileA( FileName, GENERIC_READ| GENERIC_WRITE, FILE_SHARE_READ| FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
判断文件是否打开失败
if(hFile==INVALID_HANDLE_VALUE) { printf("打开文件失败!\n"); pause; return 0; }
创建一个内核映射对象
size=GetFileSize(hFile,0); hMap=CreateFileMappingA(hFile,NULL,PAGE_READWRITE,0,size,NULL); if(!hMap) { goto _Exit; _Exit: printf("映射失败!"); CloseHandle(hFile); pause; return 0; }
映射起始地址
pBuf=(char*)MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,size); if(!pBuf) { CloseHandle(hMap); goto _Exit; }
定位到要加密的区段
pDosHeader=(PIMAGE_DOS_HEADER)pBuf; pNtHeader=(PIMAGE_NT_HEADERS)&pBuf[pDosHeader->e_lfanew]; if(pNtHeader->Signature!=IMAGE_NT_SIGNATURE) { printf("不是有效的PE文件\n"); goto _Clean; } Sec=pNtHeader->FileHeader.NumberOfSections; pSec=(PIMAGE_SECTION_HEADER)&pBuf[sizeof(IMAGE_NT_HEADERS)+pDosHeader-> e_lfanew];
加密或解密数据
for(int i=0;i<Sec;i++) { if(!strcmp(SecName,(char*)pSec->Name)) { unsigned char* data=NULL; int a; SecSize=pSec->SizeOfRawData; data=(unsigned char*)&pBuf[pSec->PointerToRawData]; printf("输入 0 加密区块数据,否则解密区块数据!\n请输入:"); scanf("%d",&a); if(!a) { plus(data,SecSize); printf("加密完成\n"); goto _Clean; } else { un(data,SecSize); printf("解密完成\n"); goto _Clean; } } pSec++; } printf("未找到 %s 区段",SecName); goto _Clean; _Clean: UnmapViewOfFile(pBuf); CloseHandle(hFile); CloseHandle(hMap); pause; return 0;
接下来是全部的代码(上面已经贴的差不多了哈)
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define pause system("pause")
void xor(unsigned char*code,char *key,int keyt,int codet);
void plus(unsigned char *code,long size) { for(int i=0;i<size;i++) code[i]=code[i]+63; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]+23; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]+13; return; }void un(unsigned char *code,long size) { for(int i=0;i<size;i++) code[i]=code[i]-13; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]-23; xor(code,"wojiushishen",strlen("wojiushishen"),size); for(int i=0;i<size;i++) code[i]=code[i]-63; return; }
void xor(unsigned char*code,char *key,int keyt,int codet) { for(int i=0;i<codet;) { for(int j=0;(j<keyt)&&(i<codet);j++,i++) { code[i]=code[i]^key[j]; code[i]=~code[i]; } } return; }
int main(void)
{
char FileName[1024];
char SecName[8];
char *pBuf;
int size;
WORD Sec;
DWORD SecSize;
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_NT_HEADERS pNtHeader;
PIMAGE_SECTION_HEADER pSec;
HANDLE hFile;
HANDLE hMap;
scanf("%s ",FileName); scanf("%s",SecName); hFile=CreateFileA( FileName, GENERIC_READ| GENERIC_WRITE, FILE_SHARE_READ| FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if(hFile==INVALID_HANDLE_VALUE) { printf("打开文件失败!\n"); pause; return 0; }
size=GetFileSize(hFile,0);
hMap=CreateFileMappingA(hFile,NULL,PAGE_READWRITE,0,size,NULL);
if(!hMap)
{
goto _Exit;
_Exit:
printf("映射失败!");
CloseHandle(hFile);
pause;
return 0;
}
pBuf=(char*)MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,size);
if(!pBuf)
{
CloseHandle(hMap);
goto _Exit;
}
pDosHeader=(PIMAGE_DOS_HEADER)pBuf;
pNtHeader=(PIMAGE_NT_HEADERS)&pBuf[pDosHeader->e_lfanew];
if(pNtHeader->Signature!=IMAGE_NT_SIGNATURE)
{
printf("不是有效的PE文件\n");
goto _Clean;
}
Sec=pNtHeader->FileHeader.NumberOfSections;
pSec=(PIMAGE_SECTION_HEADER)&pBuf[sizeof(IMAGE_NT_HEADERS)+pDosHeader->
e_lfanew];
for(int i=0;i<Sec;i++)
{
if(!strcmp(SecName,(char*)pSec->Name))
{
unsigned char* data=NULL;
int a;
SecSize=pSec->SizeOfRawData;
data=(unsigned char*)&pBuf[pSec->PointerToRawData];
printf("输入 0 加密区块数据,否则解密区块数据!\n请输入:");
scanf("%d",&a);
if(!a)
{
plus(data,SecSize);
printf("加密完成\n");
goto _Clean;
}
else
{
un(data,SecSize);
printf("解密完成\n");
goto _Clean;
}
}
pSec++;
}
printf("未找到 %s 区段",SecName);
goto _Clean;
_Clean:
UnmapViewOfFile(pBuf);
CloseHandle(hFile);
CloseHandle(hMap);
pause;
return 0;
}
相关文章推荐
- 菜鸟系列之C/C++经典试题(七)
- 【C/C++】宏
- C++学习笔记1
- leetcode258题 题解 翻译 C语言版 Python版
- 能让你成为更优秀程序员的10个C语言资源
- C++ 关键字 explicit, export, mutable
- C++ int与string的转化
- leetcode292题 题解 翻译 C语言版 Python版
- C++ 资源大全
- c语言一些经典语句 【精华】
- 【Visual C++】一些开发心得与调试技巧
- 深入理解C++中的mutable关键字
- C++ 11标准新增加了Lambda表达式、for_each语法,修改了auto
- C++11 的 5 个实用特性
- c/c++中取余与取模区别
- 字符串搜索--Rabin-Karp算法
- UIActionSheet :libc++abi.dylib: terminate_handler unexpectedly threw an exception
- C++ AMP同CUDA之间的性能比较
- C/C++内存泄漏及检测
- C语言文件IO操作的一些其它函数