|
1)、把一个PE文件读入内存缓冲区File->FileBuffer
2)、PE文件的拉伸,FileBuffer->ImageBuffer
3)、PE文件的还原,开辟另一块空间,把ImageBuffer重新还原成文件刚加载进内存时的样子
4)、PE文件的转存,把3得到的结果转存为文件,看看是否可以运行
滴水逆向2015-03-16期课后做业
编译器提示好像是 memcpy错误
如有大佬解决,有偿一包烟钱~~ 可以加我Q 2070002026
- #include "stdafx.h"
- #include<windows.h>
- #include<winnt.h>
- #include<stdlib.h>
- #define IMAGE_SIZEOF_SHORT_NAME 8
- LPVOID ReadPEFile(IN LPSTR lpszFile){
- FILE* Pfile = NULL;
- LPVOID pFileBuffer = NULL;
- Pfile = fopen(lpszFile,"rb");
- if(!Pfile){
- printf("无法打开exe程序");
- return NULL;
- }
- fseek(Pfile,0,SEEK_END);
- DWORD fileSize = ftell(Pfile);//文件大小
- fseek(Pfile,0,SEEK_SET);
- pFileBuffer=(char*)malloc(fileSize);//分配文件大小
- //将文件数据读入缓冲区
- size_t n = fread(pFileBuffer,fileSize,1,Pfile);
- if(!n){
- printf("读取数据失败\n");
- free(pFileBuffer);
- fclose(Pfile);
- return NULL;
- }
- fclose(Pfile);
- return pFileBuffer;
- }
- LPVOID CopyFileBufferToImageBuffer(){
- LPVOID pFileBuffer = NULL;
- LPVOID pimageBuffer = NULL;
- PIMAGE_DOS_HEADER pdosheader = NULL;
- PIMAGE_NT_HEADERS pntheader= NULL;
- PIMAGE_FILE_HEADER pheader= NULL;
- PIMAGE_OPTIONAL_HEADER poptionheader = NULL;
- PIMAGE_SECTION_HEADER psection = NULL;
- pFileBuffer = ReadPEFile("C:\\Windows\\SysWOW64\\notepad.exe");//读文件到缓冲区
- if(!pFileBuffer){
- printf("读文件失败");
- return NULL;
- }
- pdosheader = (PIMAGE_DOS_HEADER)pFileBuffer;
- DWORD pe = pdosheader->e_lfanew+0x4;//pe标识
- pheader = (PIMAGE_FILE_HEADER)(DWORD)pFileBuffer+pe;
- DWORD pebz = sizeof(IMAGE_FILE_HEADER);
- poptionheader = (PIMAGE_OPTIONAL_HEADER)(DWORD)pheader+pebz;
- pimageBuffer = malloc(poptionheader->SizeOfImage);
- //memset(pimageBuffer,0,poptionheader->SizeOfImage);
- memcpy(pimageBuffer,pFileBuffer,((size_t)poptionheader->SizeOfImage));//copy的整体的大小
- psection = (PIMAGE_SECTION_HEADER)((DWORD)poptionheader+poptionheader->SizeOfImage);//节表
- for(int i=0;i<pheader->NumberOfSections;i++,psection++){
- memcpy((void*)((DWORD)pimageBuffer+psection->VirtualAddress),(void*)((DWORD)pheader+psection->PointerToRawData),((size_t)psection->SizeOfRawData));//拷贝到pimageBuffer
- }
- return pimageBuffer;
- }
- LPVOID CopyImageBufferToNewBuffer(LPSTR lpszFile){
- LPVOID pnewbuffer = NULL;
- LPVOID pimageBuffer = NULL;
- PIMAGE_DOS_HEADER pdosheader = NULL;
- PIMAGE_NT_HEADERS pntheader= NULL;
- PIMAGE_FILE_HEADER pheader= NULL;
- PIMAGE_OPTIONAL_HEADER poptionheader = NULL;
- PIMAGE_SECTION_HEADER psection = NULL;
- FILE* f = NULL;
- char* FilePath = "D:\\zuoye\\Notpead1.exe";
- pimageBuffer=CopyFileBufferToImageBuffer();//缓冲区内存
- // pnewbuffer = malloc(fileSize);
- FILE* pfile = fopen(lpszFile,"rb");
- fseek(pfile,0,SEEK_END);
- DWORD fileSize = ftell(pfile);
- pnewbuffer = malloc(fileSize);
- memset(pnewbuffer,0,fileSize);
- pdosheader = (PIMAGE_DOS_HEADER)pimageBuffer;
- pntheader = (PIMAGE_NT_HEADERS)((DWORD)pimageBuffer+pdosheader->e_lfanew);
- pheader = (PIMAGE_FILE_HEADER)((DWORD)pntheader+4);
- poptionheader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pheader+IMAGE_SIZEOF_FILE_HEADER);//PE标准头
- memcpy(pnewbuffer,pimageBuffer,poptionheader->SizeOfHeaders);//复制到pnewbuffer
- psection =(PIMAGE_SECTION_HEADER)((DWORD)poptionheader+ pheader->SizeOfOptionalHeader);
- for(int i=0;i<pheader->NumberOfSections;i++,psection++){
- memcpy((void*)((DWORD)pnewbuffer+psection->PointerToRawData),(void*)((DWORD)pimageBuffer+psection->VirtualAddress),(size_t)(psection->SizeOfRawData));
- }
- f = fopen(FilePath,"wb");
- fwrite(pnewbuffer,fileSize,1,f);
- fclose(f);
- return 0;
- }
- int main(int argc, char* argv[])
- {
- CopyImageBufferToNewBuffer("C:\\Windows\\SysWOW64\\notepad.exe");
-
-
- return 0;
- }
复制代码 |
上一篇: 定时软件下一篇: VC6 MFC工程怎么升级到 64位工程
|