手动添加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 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<<"---------import cer to exe---------------->>"<<endl;
    cout<<"--EX:srcpath[*.cer] despath [*.exe]------->>"<<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[1];
    TCHAR* lpPeFilePath=argv[2];
    hWriteFileHandle = CreateFile(lpPeFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL ,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ;
    if ( hWriteFileHandle==INVALID_HANDLE_VALUE )
        return RETURN_FAIL;
    hFileMapping = CreateFileMapping( hWriteFileHandle, NULL , PAGE_READWRITE, 0, 0, NULL ) ;
    if ( ! hFileMapping )
    {
        CloseHandle( hWriteFileHandle) ;
        return RETURN_FAIL;
    }
    lpVoidFileBaseAddress = MapViewOfFile( hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0) ;
    if ( ! lpVoidFileBaseAddress )
    {
        CloseHandle( hFileMapping) ;
        CloseHandle( hWriteFileHandle) ;
        return RETURN_FAIL;
    }
    lpidh_Dos_Header = (PIMAGE_DOS_HEADER) lpVoidFileBaseAddress;
    if ( lpidh_Dos_Header->e_magic!=IMAGE_DOS_SIGNATURE )
        return RETURN_FAIL; 

    lpinh_NTHeader=(PIMAGE_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;

    //if exist sn
    if (sdp.dwSize!=0)
    {
        //
        return RETURN_FAIL;
    }
    //
    hReadFileHandle = CreateFile(lpcerFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
    OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL ) ;
    if ( hReadFileHandle==INVALID_HANDLE_VALUE )
        return RETURN_FAIL;
    DWORD dwReadedSize=0;
    DWORD dwWritedSize=0;

    SetFilePointer(hReadFileHandle,-4,0,FILE_END);
    ReadFile(hReadFileHandle,&sdp.dwSize,sizeof(DWORD),&dwReadedSize,NULL);

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

    PIMAGE_SECTION_HEADER lppsh_SECTION_HEADER=(PIMAGE_SECTION_HEADER)((DWORD)&lpinh_NTHeader->OptionalHeader+lpinh_NTHeader
    ->FileHeader.SizeOfOptionalHeader);
    lppsh_SECTION_HEADER=lppsh_SECTION_HEADER+(lpinh_NTHeader->FileHeader.NumberOfSections-1);
    sdp.dwVirtulAddress=lppsh_SECTION_HEADER->PointerToRawData+lppsh_SECTION_HEADER->SizeOfRawData;

    SetFilePointer(hWriteFileHandle,sdp.dwVirtulAddress,0,FILE_BEGIN);
    WriteFile(hWriteFileHandle,pbBufferSignture,sdp.dwSize,&dwWritedSize,NULL);

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

    UnmapViewOfFile( lpVoidFileBaseAddress) ;
    CloseHandle( hFileMapping);
    CloseHandle( hReadFileHandle);
    CloseHandle(hWriteFileHandle);

    return RETURN_SUCC;
}

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

时间: 2024-08-24 20:26:37

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

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

// 注意下图PE文件格式详解图中的 // IMAGE_NT_HEADERS------->OptionalHeader------>DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]字段 #include <windows.h> HANDLE hWriteFileHandle = NULL ; HANDLE hReadFileHandle = NULL ; HANDLE hFileMapping = NULL ; LPVOID lpVoid

C#手动添加XML文件

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Xml; 7 8 namespace ConsoleApplication7 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 /

Xcode6后手动添加.pch文件,与其常遇到的问题

在Xcode6之前,创建一个新工程Xcode会在Supporting files文件夹下面自动创建一个"工程名-Prefix.pch"文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件共享和访问.是一个预编译文件.Xcode6后就不会自动创建了,需要手动创建. 其作用: 1.存放一些全局的宏(整个项目中都用得上的宏) 2.用来包含一些全部的头文件(整个项目中都用得上的头文件) 接下来就进入主题-->手动创建.pch文件 Command+N,打开新建文件窗口:ios

python筛选特定文件的信息按照格式输出到txt

最近搞数据库,为了把图片文件的信息导入数据库表中,我开始研究python列出图片文件,其中发现因为IE临时文件里有非常多的不需要的图片,就需要筛选掉一些文件. 最终用python输出了所有需要的图片文件的路径.文件名.时间到一个txt 1 import os 2 import time 3 4 def IsObjfile( path , filename , suffix , shield ): 5 #判断文件是否以suffix中的串结尾以及是否有不需要的文件路径 6 flag1 = False

Qt 手动添加ui文件到工程(转)

制作ui文件 先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替).在制作自己的界面文件时要注意以下几个要点: 1.要记住ui文件的名字,因为uic生成的代码会存在ui_myform.h里:2.要记住主窗体的object name, 因为ui文件提供的类名将以这个form的名字来命,例如主窗体名字为MainWindow,则ui文件提供的类名会命名为Ui_MainWindow:3.要特别注意你的form选择的基类要和你代码中的窗体

【PE】手动给PE文件添加一段代码MessageBoxA

源程序是这个样子: 思路: 1.通过LordPE工具拿到所需数据 2.OllyDebug通过BP MessageBoxA拿到MessageBoxA地址 3.UE十六进制编辑器定位代码节基址 4.在代码节找到一处空白区 5.写入代码对应的十六进制数据 6.Call到MessageBoxA,Call:E8 7.Jmp到原OEP,Jmp:E9 8.修改原OEP为写入数据地址 准备工作: 测试程序 LordPE工具 OllyDebug UE十六进制编辑器 通过LordPE工具拿到所需数据: Addres

maven手动添加库文件

项目应用到了ojdbc,dubbo等私有库,maven无法直接下载,需要手动下载后添加到maven本地库里面. 以下以ojdbc为例: 1.下载jar后,cmd添加到本地库: mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.5.0 -Dpackaging=jar -Dfile=d:\ojdbc12.jar 2.pom.xml添加: <dependency> <group

Xcode6中手动添加Precompile Prefix Header

Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会自动的将pch文件中的头文件添加到所有的源文件中去,这样在需要使用相关类的时候不需要使用import就可以直接使用头文件中的内容,很大程度上给程序员带来了编程的便利性.但是在Xcode6中去掉Precompile Prefix Header文件. Xcode6去掉Precompile Prefix

深入剖析PE文件

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