DWORD ToLoaderPE(LPSTR file_path, PVOID
*
pFileBuffer);
DWORD CopyFileBufferToImageBuffer(PVOID pFileBuffer, PVOID
*
pImageBuffer);
DWORD CopyImageBufferToNewFileBuffer(PVOID pImageBuffer, PVOID
*
pNewFileBuffer);
BOOL
MemoryToFile(PVOID pMemBuffer, DWORD size, LPSTR lpszFile);
char file_path[]
=
"E:\\Reverse\\吾爱破解工具包2.0\\吾爱破解工具包\\Tools\\Others\\ipmsg.exe"
;
char write_file_path[]
=
"C:\\Users\\whl\\Desktop\\1.exe"
;
/
/
返回PE文件大小
DWORD ToLoaderPE(LPSTR file_path, PVOID
*
pFileBuffer)
{
FILE
*
pFile
=
NULL;
DWORD FileSize
=
0
;
PVOID pFileBufferTemp
=
NULL;
pFile
=
fopen(file_path,
"rb"
);
if
(!pFile)
{
printf(
"(ToLoaderPE)Can't open file!\n"
);
return
0
;
}
fseek(pFile,
0
, SEEK_END);
FileSize
=
ftell(pFile);
printf(
"FileBuffer: %#x\n"
, FileSize);
fseek(pFile,
0
, SEEK_SET);
pFileBufferTemp
=
malloc(FileSize);
if
(!pFileBufferTemp)
{
printf(
"(ToLoaderPE)Allocate dynamic memory failed!\n"
);
fclose(pFile);
return
0
;
}
DWORD n
=
fread(pFileBufferTemp, FileSize,
1
, pFile);
if
(!n)
{
printf(
"(ToLoaderPE)Read file failed!\n"
);
free(pFileBufferTemp);
fclose(pFile);
return
0
;
}
*
pFileBuffer
=
pFileBufferTemp;
pFileBufferTemp
=
NULL;
fclose(pFile);
return
FileSize;
}
DWORD CopyFileBufferToImageBuffer(PVOID pFileBuffer, PVOID
*
pImageBuffer)
{
PIMAGE_DOS_HEADER pDosHeader
=
NULL;
PIMAGE_NT_HEADERS pNTHeader
=
NULL;
PIMAGE_FILE_HEADER pPEHeader
=
NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader
=
NULL;
PIMAGE_SECTION_HEADER pSectionHeader
=
NULL;
PVOID pImageTemp
=
NULL;
if
(!pFileBuffer)
{
printf(
"(CopyFileBufferToImageBuffer)Can't open file!\n"
);
return
0
;
}
if
(
*
((PWORD)pFileBuffer) !
=
IMAGE_DOS_SIGNATURE)
{
printf(
"(CopyFileBufferToImageBuffer)No MZ flag, not exe file!\n"
);
return
0
;
}
pDosHeader
=
(PIMAGE_DOS_HEADER)pFileBuffer;
if
(
*
((LPDWORD)((DWORD)pFileBuffer
+
pDosHeader
-
>e_lfanew)) !
=
IMAGE_NT_SIGNATURE)
{
printf(
"(CopyFileBufferToImageBuffer)Not a valid PE flag!\n"
);
return
0
;
}
pNTHeader
=
(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer
+
pDosHeader
-
>e_lfanew);
pPEHeader
=
(PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)
+
4
);
pOptionHeader
=
(PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader
+
IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader
=
(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader
+
pPEHeader
-
>SizeOfOptionalHeader);
pImageTemp
=
malloc(pOptionHeader
-
>SizeOfImage);
if
(!pImageTemp)
{
printf(
"(CopyFileBufferToImageBuffer)Allocate dynamic memory failed!\n"
);
free(pImageTemp);
return
0
;
}
memset(pImageTemp,
0
, pOptionHeader
-
>SizeOfImage);
memcpy(pImageTemp, pDosHeader, pOptionHeader
-
>SizeOfHeaders);
PIMAGE_SECTION_HEADER pSectionHeaderTemp
=
pSectionHeader;
for
(
int
n
=
0
; n < pPEHeader
-
>NumberOfSections; n
+
+
, pSectionHeaderTemp
+
+
)
{
memcpy((PVOID)((DWORD)pImageTemp
+
pSectionHeaderTemp
-
>VirtualAddress), (PVOID)((DWORD)pFileBuffer
+
pSectionHeaderTemp
-
>PointerToRawData), pSectionHeaderTemp
-
>SizeOfRawData);
printf(
"VirtualAddress%d: %#10x PointerToRawData%d: %#10x\n"
, n, (DWORD)pImageTemp
+
pSectionHeader
-
>VirtualAddress, n, (DWORD)pFileBuffer
+
pSectionHeader
-
>PointerToRawData);
}
*
pImageBuffer
=
pImageTemp;
pImageTemp
=
NULL;
return
pOptionHeader
-
>SizeOfImage;
}
DWORD CopyImageBufferToNewFileBuffer(PVOID pImageBuffer, PVOID
*
pNewFileBuffer)
{
PIMAGE_DOS_HEADER pDosHeader
=
NULL;
PIMAGE_NT_HEADERS pNTHeader
=
NULL;
PIMAGE_FILE_HEADER pPEHeader
=
NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader
=
NULL;
PIMAGE_SECTION_HEADER pSectionHeader
=
NULL;
LPVOID pTempNewbuffer
=
NULL;
if
(!pImageBuffer)
{
printf(
"(CopyImageBufferToNewBuffer)Can't open file!\n"
);
return
0
;
}
if
(
*
((PWORD)pImageBuffer) !
=
IMAGE_DOS_SIGNATURE)
{
printf(
"(CopyImageBufferToNewBuffer)No MZ flag, not exe file!\n"
);
return
0
;
}
pDosHeader
=
(PIMAGE_DOS_HEADER)pImageBuffer;
if
(
*
((PDWORD)((DWORD)pImageBuffer
+
pDosHeader
-
>e_lfanew)) !
=
IMAGE_NT_SIGNATURE)
{
printf(
"(CopyImageBufferToNewBuffer)Not a valid PE flag!\n"
);
return
0
;
}
pNTHeader
=
(PIMAGE_NT_HEADERS)((DWORD)pImageBuffer
+
pDosHeader
-
>e_lfanew);
pPEHeader
=
(PIMAGE_FILE_HEADER)((DWORD)pNTHeader
+
4
);
/
/
这里必须强制类型转换
pOptionHeader
=
(PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader
+
IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader
=
(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader
+
pPEHeader
-
>SizeOfOptionalHeader);
/
/
获取new_buffer的大小
int
new_buffer_size
=
pOptionHeader
-
>SizeOfHeaders;
for
(DWORD i
=
0
; i < pPEHeader
-
>NumberOfSections; i
+
+
)
{
new_buffer_size
+
=
pSectionHeader[i].SizeOfRawData;
/
/
pSectionHeader[i]另一种加法
}
/
/
分配内存(newbuffer)
pTempNewbuffer
=
malloc(new_buffer_size);
if
(!pTempNewbuffer)
{
printf(
"(CopyImageBufferToNewBuffer)Allocate dynamic memory failed!\n"
);
return
0
;
}
memset(pTempNewbuffer,
0
, new_buffer_size);
memcpy(pTempNewbuffer, pDosHeader, pOptionHeader
-
>SizeOfHeaders);
/
/
循环拷贝节区
PIMAGE_SECTION_HEADER pTempSectionHeader
=
pSectionHeader;
for
(DWORD j
=
0
; j < pPEHeader
-
>NumberOfSections; j
+
+
, pTempSectionHeader
+
+
)
{
/
/
PointerToRawData节区在文件中的偏移,VirtualAddress节区在内存中的偏移地址,SizeOfRawData节在文件中对齐后的尺寸
memcpy((PDWORD)((DWORD)pTempNewbuffer
+
pTempSectionHeader
-
>PointerToRawData), (PDWORD)((DWORD)pImageBuffer
+
pTempSectionHeader
-
>VirtualAddress), pTempSectionHeader
-
>SizeOfRawData);
}
/
/
返回数据
*
pNewFileBuffer
=
pTempNewbuffer;
/
/
暂存的数据传给参数后释放
pTempNewbuffer
=
NULL;
return
new_buffer_size;
/
/
返回计算得到的分配内存的大小
}
BOOL
MemoryToFile(PVOID pMemBuffer, DWORD size, LPSTR lpszFile)
{
FILE
*
fp;
fp
=
fopen(lpszFile,
"wb"
);
if
(fp !
=
NULL)
{
fwrite(pMemBuffer, size,
1
, fp);
}
fclose(fp);
return
1
;
}
VOID operate()
{
LPVOID pFileBuffer
=
NULL;
LPVOID pNewFileBuffer
=
NULL;
LPVOID pImageBuffer
=
NULL;
DWORD ret1
=
ToLoaderPE(file_path, &pFileBuffer);
/
/
&pFileBuffer(void
*
*
类型) 传递地址对其值可以进行修改
printf(
"exe->filebuffer 返回值为计算所得文件大小:%#x\n"
, ret1);
DWORD ret2
=
CopyFileBufferToImageBuffer(pFileBuffer, &pImageBuffer);
printf(
"filebuffer -> imagebuffer返回值为计算所得文件大小:%#x\n"
, ret2);
DWORD ret3
=
CopyImageBufferToNewFileBuffer(pImageBuffer, &pNewFileBuffer);
printf(
"imagebuffer -> newfilebuffer返回值为计算所得文件大小:%#x\n"
, ret3);
MemoryToFile(pNewFileBuffer, ret3, write_file_path);
free(pFileBuffer);
free(pNewFileBuffer);
free(pImageBuffer);
}
int
main()
{
operate();
getchar();
return
0
;
}