您的位置:首页 > 编程语言 > C语言/C++

C语言实现区块加密

2016-02-03 18:25 495 查看
哈 学了几节PE格式,写了一个这玩意(还有一个PE信息查看的 没写完呢)

需要的基础知识:

只需要一点点的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: