PE文件数字签名信息读取存储及格式详解图之上(历史代码,贴出学习)

// 注意下图PE文件格式详解图中的

// IMAGE_NT_HEADERS------->OptionalHeader------>DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]字段

#include <windows.h>
HANDLE hWriteFileHandle = NULL ;
HANDLE hReadFileHandle = NULL ;
HANDLE hFileMapping = NULL ;
LPVOID lpVoidFileBaseAddress = NULL ;
IMAGE_DOS_HEADER * lpidh_Dos_Header= NULL ;
IMAGE_NT_HEADERS * lpinh_NTHeader= NULL ; 

#define RETURN_FAIL -1
#define RETURN_SUCC  1

typedef struct __DIGITAL_SIGNATURE_DATA_PARAM
{
    DWORD dwVirtulAddress;
    DWORD dwSize;
}

SIGNATURE_DATA_PARAM,LPSIGNATURE_DATA_PARAM;

#include <iostream>
using namespace std;

void UsingFuction()
{
    cout<<"----------export cer from exe ------------>>"<<endl;
    cout<<"--EX:srcpath[*.exe] despath [*.cer]------->>"<<endl;
    cout<<"------------------------------------------>>"<<endl;
}
int main( int argc,char **argv)
{ 

    switch (argc)
    {
    case 1:
        cout<<"help using usage -h"<<endl;
        break;
    case 2:
        {
            if (strcmp(argv[1],"-h"))
            {
                UsingFuction();
                return RETURN_FAIL;
            }
        }
        break;
    case 3:
        cout<<"all argument is ok"<<endl;
        break;
    default:
        cout<<"argument is error"<<endl;
        break;
    }
    if (argc!=3)
    {
        UsingFuction();
        return RETURN_FAIL;
    }
    TCHAR* lpcerFilePath=argv[2];
    TCHAR* lpPeFilePath=argv[1];

    hReadFileHandle = CreateFile(lpPeFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
    OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL ) ;
    if ( hReadFileHandle==INVALID_HANDLE_VALUE )
        return RETURN_FAIL;
    hFileMapping = CreateFileMapping( hReadFileHandle, NULL , PAGE_READONLY, 0, 0, NULL ) ;
    if ( ! hFileMapping )
    {
        CloseHandle( hReadFileHandle) ;
        return RETURN_FAIL;
    }
    lpVoidFileBaseAddress = MapViewOfFile( hFileMapping, FILE_MAP_READ, 0, 0, 0) ;
    if ( ! lpVoidFileBaseAddress )
    {
        CloseHandle( hFileMapping) ;
        CloseHandle( hReadFileHandle) ;
        return RETURN_FAIL;
    }
    lpidh_Dos_Header = (IMAGE_DOS_HEADER* ) lpVoidFileBaseAddress;
    if ( lpidh_Dos_Header->e_magic!=IMAGE_DOS_SIGNATURE )
        return RETURN_FAIL; 

    lpinh_NTHeader=(IMAGE_NT_HEADERS*)((char*)lpVoidFileBaseAddress+lpidh_Dos_Header->e_lfanew) ;
    if ( lpinh_NTHeader->Signature!=IMAGE_NT_SIGNATURE )
        return RETURN_FAIL;
    //
    SIGNATURE_DATA_PARAM sdp;

    sdp.dwVirtulAddress=lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress;
    sdp.dwSize=lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;

    PBYTE pbBufferSignture=new byte[sdp.dwSize];
    DWORD dwReadedSize=0;
    SetFilePointer(hReadFileHandle,sdp.dwVirtulAddress,0,FILE_BEGIN);
    ReadFile(hReadFileHandle,pbBufferSignture,sdp.dwSize,&dwReadedSize,NULL);

    //
    hWriteFileHandle = CreateFile(lpcerFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
    CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL ) ;
    if ( hWriteFileHandle==INVALID_HANDLE_VALUE )
        return RETURN_FAIL;
    DWORD dwWritedSize=0;
    WriteFile(hWriteFileHandle,pbBufferSignture,dwReadedSize,&dwWritedSize,NULL);
    WriteFile(hWriteFileHandle,&sdp.dwSize,sizeof(sdp.dwSize),&dwWritedSize,NULL);

    delete pbBufferSignture;
    UnmapViewOfFile( lpVoidFileBaseAddress) ;
    CloseHandle( hFileMapping);
    CloseHandle( hReadFileHandle);
    CloseHandle(hWriteFileHandle);
    return RETURN_SUCC;
}

PE文件格式详解图

PE文件数字签名信息读取存储及格式详解图之上(历史代码,贴出学习)

时间: 2024-09-29 19:09:13

PE文件数字签名信息读取存储及格式详解图之上(历史代码,贴出学习)的相关文章

手动添加PE文件数字签名信息及格式详解图之下(历史代码,贴出学习)

#include <windows.h> HANDLE hWriteFileHandle = NULL ; HANDLE hReadFileHandle = NULL ; HANDLE hFileMapping = NULL ; LPVOID lpVoidFileBaseAddress = NULL ; IMAGE_DOS_HEADER * lpidh_Dos_Header= NULL ; IMAGE_NT_HEADERS * lpinh_NTHeader= NULL ; #define RE

32位PE文件信息查看器(WIN32控制台)

最近重新撸了一遍PE文件的文件格式,这个程序算是复习的产物吧. 说明与警告: 1.只适用于32位PE文件,可以读取符合标准的32位PE文件的DOS头.NT头.节区头.导入表.导出表信息,想要其他功能请在PEFile类中找,没有请留言 2.因为是边复习功能边写的,所以不要纠结程序架构.编码风格.鲁棒性等各种问题,我会再改的 3.翻译可能是不准的,仅供参考 4.所有计数从0开始,程序不对是否越界进行检查 5.转载请注明出处,本人不对引用此源码后程序产生的任何问题负责 单独的PEFile类 class

深入剖析PE文件

不赖猴的笔记,转载请注明出处. 深入剖析PE文件 PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一.        基本结构. 上图便是PE文件的基本结构.(注意:DOS MZ Header和部分PE header的大小是不变的:DOS stub部分的大小是可变的.) 一个PE文件至少需要两个Section,一个是存放代码,一个存放数据.NT上的PE文件基本上有9个预定义的Section.分别是:.t

深入学习PE文件(转)

PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. 基本结构. 上图便是PE文件的基本结构.(注意:DOS MZ Header和部分PE header的大小是不变的:DOS stub部分的大小是可变的.) 一个PE文件至少需要两个Section,一个是存放代码,一个存放数据.NT上的PE文件基本上有9个预定义的Section.分别是:.text, .bss, .rdata, .data, .rsrc,

PE文件结构部分解析以及输入的定位

此图非常详细,可以看到每个字段的内容和大概含义,根据此图动手实践了PE文件结构,下面给出我自己理解的简约结构: 为了更加形象生动,特把实验过程记录如下,从实验过程中我们可以发现不小细节: 使用一个简单的PE文件举例,下图是PE文件概要信息: 图中没有列出DOS头信息,直接跳到了NT头的Image_File_Header,其中Machine=014C,有四个段,可选头大小为EO:其他是一些标志位. 接下来是可选头部分image base=400000也就是镜像文件载入地址为400000, 段落对齐

计算PE文件校验和

// 计算PE校验和 #include <ImageHlp.h> #pragma comment(lib,"Imagehlp.lib") void Getchecksum(TCHAR* pszPath) { /* Code by Lthis 转载请注明出处 */ DWORD dwHeaderSum, dwCheckSum; // 一般PE文件中CheckSum字段存储的 // 是本代码中的dwHeaderSum获取的值 // 打开文件 HANDLE hFile = Crea

在文件中读取、存储Json格式的字符串

public class Weather { static readonly string FilePath = System.Environment.CurrentDirectory + @"\Area.txt"; public static Models.Area GetCurrentArea() { var file = new FileInfo(FilePath); Models.Area result; if (!file.Exists) { //文件不存在就返回一个默认值,

C++开发人脸性别识别教程(8)——搭建MFC框架之读取文件夹信息

在上一篇博客中我们已经绘制了MFC界面,在这篇博客中我们将添加响应代码,为MFC框架添加一个最基本的功能:打开一个文件夹. 一.添加相关头文件 这里头文件主要包含三类:opencv头文件.批量读取文件相关的头文件.CvvImage.这里需要强调CvvImage这个头文件,这个是用来关联OpenCv和picture控件,并且这个头文件是隶属于OpenCv1.x的,在2.x版本中已经将这个类移除,因此需要手动下载这两个文件(CvvImage.h和CvvImage.cpp),下载地址:CvvImage

获取PE文件的输入表信息

输入表是PE文件结构中不可或缺的部分,输入表也称之为"导入表". 要想了解输入表,首先还得先从DLL文件入手.日常生活中我们会看见一些大型软件有很多的DLL格式的文件,这些文件中有很多的导入函数,这些函数不会直接被执行.当一个程序(EXE)运行时,导入函数是被程序调用执行的,其执行的代码是不在主程序(EXE)中的一小部分函数,其真正的代码却在DLL文件中.这时我们就会想,那么EXE主程序是如何找到这些需要导入的函数呢,这就要归结于“输入表”了,输入表就相当于EXE文件与DLL文件沟通的