飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

楼主: fonge

[活动] 活动之一PE自定义

[复制链接]
  • TA的每日心情
    奋斗
    2023-1-26 21:37
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2007-9-25 15:31:20 | 显示全部楼层
    偶菜
    看不懂
    偶要好好学习了
    ...
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-10-15 15:45:14 | 显示全部楼层
    增加区块的程序实现...
    1. {-------------------------增加区块 -------------------------------}
    2. {                                                                }
    3. {                                                                }
    4. {1.定义附加段填充数据                                              }
    5. {                                                                }
    6. {2.读取PE信息                                                      }
    7. {                                                                 }
    8. {3.块填充大小=(待增加数据大小/区块物理对齐大小+1)*区块物理对齐大小        }
    9. {                                                                 }
    10. {4.计算块各项属性                                                   }
    11. { A.读取区块信息                                                    }
    12. { B.块物理位置=最后一块的物理位置+最后一块物理大小                      }
    13. { C.映象中偏移=最后一块的映象中偏移+最后一块映象大中大小                 }
    14. {                                                                 }
    15. {5.增加块,定义块各项属性                                             }
    16. { A.增加块                                                         }
    17. { B.校正新节物理偏移                                                }
    18. { C.校正新节映象偏移                                               }
    19. { D.设置区块属性                                                   }
    20. { E.保存整个块表                                                   }
    21. {                                                                 }
    22. {6.修正PE头信息                                                    }
    23. { A.校正内存映象大小=原野内存映象大小+已定义块映象大小                  }
    24. { B.更正块数=原块数目+1                                            }
    25. { C.保存修改过的映象头                                              }
    26. {                                                                 }
    27. {7.定位到文件末尾,追加待增加数据,长度为物理大小                         }
    28. { A.填充数据到物理对齐                                               }
    29. { B.填充自定义数据                                                  }
    30. {                                                                 }
    31. {8.退出                                                            }
    32. {*****************************************************************}

    33. unit Unit1;

    34. interface

    35. uses
    36.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    37.   Dialogs, StdCtrls;

    38. type
    39.   TForm1 = class(TForm)
    40.     Button1: TButton;
    41.     Edit1: TEdit;
    42.     procedure Button1Click(Sender: TObject);
    43.   private
    44.     { Private declarations }
    45.   public
    46.     { Public declarations }
    47.   end;

    48. var
    49.   Form1             : TForm1;

    50. implementation

    51. {$R *.dfm}
    52. function AttachStart: DWORD; stdcall;   //我们定义的待填充数据
    53. begin
    54.   asm
    55.    mov eax,eax
    56.   end;
    57. end;
    58. function AttachEnd: DWORD; stdcall;
    59. begin
    60. end;

    61. {-------------------------增加区块--------------------------------}
    62. procedure AddSection(lFileName: string; lBackup: Boolean); //打开exe文件,是否备份
    63. var
    64.   hFile             : THandle;          //文件句柄
    65.   ImageDosHeader    : IMAGE_DOS_HEADER; //DOS部首
    66.   ImageNtHeaders    : IMAGE_NT_HEADERS; //映象头
    67.   ImageSectionHeader: IMAGE_SECTION_HEADER; //块表
    68.   lPointerToRawData : DWORD;            //指向文件中的偏移
    69.   lVirtualAddress   : DWORD;            //指向内存中的偏移
    70.   i                 : Integer;          //循环变量
    71.   BytesRead, ByteSWrite: Cardinal;      //读写用参数
    72.   AttachSize        : DWORD;            //附加段大小
    73.   AttachData        : Integer;          //附加段填充数据
    74. begin

    75. {1.定义附加段填充数据}
    76.   //定义附加段填充数据
    77.   AttachData := 0;

    78. {2.读取PE信息}
    79.   //打开文件
    80.   hFile := CreateFile(PChar(lFileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    81.   //校验
    82.   if hFile = INVALID_HANDLE_VALUE then
    83.   begin
    84.     ShowMessage('打开文件失败');
    85.     exit;
    86.   end;

    87.   //确认备份
    88.   if lBackup then CopyFile(PChar(lFileName), PChar(lFileName + '.bak'), False);

    89.   try

    90.     //读取DOS部首到ImageDosHeader
    91.     ReadFile(hFile, ImageDosHeader, SizeOf(ImageDosHeader), BytesRead, nil);

    92.     //校验
    93.     if ImageDosHeader.e_magic <> IMAGE_DOS_SIGNATURE then
    94.     begin
    95.       ShowMessage('不是有效的PE文件!');
    96.       exit;
    97.     end;

    98.     //指向映象头
    99.     SetFilePointer(hFile, ImageDosHeader._lfanew, nil, FILE_BEGIN);

    100.     //读取映向头到ImageNtHeaders
    101.     ReadFile(hFile, ImageNtHeaders, SizeOf(ImageNtHeaders), BytesRead, nil);

    102.     //校验
    103.     if ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE then
    104.     begin
    105.       ShowMessage('不是有效的PE文件');
    106.       exit;
    107.     end;

    108. {3.块填充大小=(待增加数据大小/区块物理对齐大小+1)*区块物理对齐大小}
    109.     //计算加入块对齐后大小
    110.     AttachSize := ((Integer(@AttachEnd) - Integer(@AttachStart)) div ImageNtHeaders.OptionalHeader.FileAlignment + 1) * ImageNtHeaders.OptionalHeader.FileAlignment;

    111. {4.计算块各项属性}
    112.     //初始化文件中偏移和映象中偏移
    113.     lPointerToRawData := 0;
    114.     lVirtualAddress := 0;

    115.     for i := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
    116.     begin

    117.     {A.读取区块信息}
    118.       //读取块表中信息
    119.       ReadFile(hFile, ImageSectionHeader, SizeOf(ImageSectionHeader), BytesRead, nil);

    120.     {B.块物理位置=最后一块的物理位置+最后一块物理大小}
    121.       //计算文件中偏移
    122.       if lPointerToRawData < ImageSectionHeader.PointerToRawData + ImageSectionHeader.SizeOfRawData then
    123.         lPointerToRawData := ImageSectionHeader.PointerToRawData + ImageSectionHeader.SizeOfRawData;

    124.     {C.映象中偏移=最后一块的映象中偏移+最后一块映象大中大小}
    125.       //计算映象中偏移
    126.       if lVirtualAddress < ImageSectionHeader.VirtualAddress + ImageSectionHeader.Misc.VirtualSize then
    127.         lVirtualAddress := ImageSectionHeader.VirtualAddress + ImageSectionHeader.Misc.VirtualSize;
    128.     end;

    129. {5.增加块,定义块各项属性}
    130.   {A.增加块}
    131.     //新建区块,名为.EN
    132.     Move('.EN'#0, ImageSectionHeader.Name[0], 5);

    133.     //设法初始属性
    134.     ImageSectionHeader.Misc.VirtualSize := AttachSize;
    135.     ImageSectionHeader.VirtualAddress := lVirtualAddress;
    136.     ImageSectionHeader.SizeOfRawData := AttachSize;
    137.     ImageSectionHeader.PointerToRawData := lPointerToRawData;
    138.     ImageSectionHeader.PointerToRelocations := 0;
    139.     ImageSectionHeader.PointerToLinenumbers := 0;
    140.     ImageSectionHeader.NumberOfRelocations := 0;

    141.   {B.校正新节物理偏移}
    142.     //校正新节物理偏移(物理区块对齐)
    143.     if ImageSectionHeader.VirtualAddress mod ImageNtHeaders.OptionalHeader.SectionAlignment > 0 then
    144.       ImageSectionHeader.VirtualAddress := (ImageSectionHeader.VirtualAddress div ImageNtHeaders.OptionalHeader.SectionAlignment + 1) * ImageNtHeaders.OptionalHeader.SectionAlignment;

    145.   {C.校正新节映象偏移}
    146.     //校正新节映象偏移(映象中区块对齐)
    147.     if ImageSectionHeader.Misc.VirtualSize mod ImageNtHeaders.OptionalHeader.SectionAlignment > 0 then
    148.       ImageSectionHeader.Misc.VirtualSize := (ImageSectionHeader.Misc.VirtualSize div ImageNtHeaders.OptionalHeader.SectionAlignment + 1) * ImageNtHeaders.OptionalHeader.SectionAlignment;

    149.   {D.设置区块属性}
    150.     //设置区块属性
    151.     ImageSectionHeader.Characteristics := $E00000E0;

    152.   {E.保存整个块表}
    153.     //保存区块信息
    154.     WriteFile(hFile, ImageSectionHeader, SizeOf(ImageSectionHeader), ByteSWrite, nil);

    155. {6.修正PE头信息}
    156.   {A.校正内存映象大小=原野内存映象大小+已定义块映象大小}
    157.     //校正内存映象大小
    158.     ImageNtHeaders.OptionalHeader.SizeOfImage := ImageNtHeaders.OptionalHeader.SizeOfImage + ImageSectionHeader.Misc.VirtualSize;

    159.   {B.更正块数=原块数目+1}
    160.     //校正块数目
    161.     Inc(ImageNtHeaders.FileHeader.NumberOfSections);

    162.   {C.保存修改过的映象头}
    163.     //定位到映象头
    164.     SetFilePointer(hFile, ImageDosHeader._lfanew, nil, FILE_BEGIN);

    165.     //保存校正过的映象头
    166.     WriteFile(hFile, ImageNtHeaders, SizeOf(ImageNtHeaders), ByteSWrite, nil);

    167. {7.定位到文件末尾,追加待增加数据,长度为物理大小}
    168.   {A.填充数据到物理对齐}
    169.     //定位到新节开始处
    170.     SetFilePointer(hFile, ImageSectionHeader.PointerToRawData, nil, FILE_BEGIN);

    171.     //用00数据填充满新节
    172.     for i := 1 to AttachSize do
    173.     begin
    174.       WriteFile(hFile, PByte(@AttachData)^, 1, ByteSWrite, nil);
    175.     end;

    176.   {B.填充自定义数据}
    177.     //指向新节开始处
    178.     SetFilePointer(hFile, ImageSectionHeader.PointerToRawData, nil, FILE_BEGIN);

    179.     //填充我们定义的数据示例
    180.     WriteFile(hFile, PByte(@AttachStart)^, Integer(@AttachEnd) - Integer(@AttachStart), ByteSWrite, nil);

    181.     //没有异常,显示增加区块成功!
    182.     ShowMessage('增加区块成功!');
    183.   finally

    184. {8.退出}
    185.     //关闭文件
    186.     CloseHandle(hFile);
    187.   end;

    188. end;
    189. {*************************Func end*********************************}


    190. procedure TForm1.Button1Click(Sender: TObject);
    191. begin
    192.   AddSection(Edit1.text, true);//Edit1.text为文件路径,true表示备份
    193. end;
    复制代码

    [ 本帖最后由 fonge 于 2007-10-15 15:47 编辑 ]

    ADDSEC.rar

    166.94 KB, 下载次数: 20, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-2-17 18:27
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2007-10-15 18:00:24 | 显示全部楼层
    两位版主大大都是BD高手,呵呵

    学习,感叹呀!/:L
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-10-19 12:02:31 | 显示全部楼层
    支持fonge,太强悍了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-27 22:43:59 | 显示全部楼层
    学习了,佩服高手!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-21 13:33:27 | 显示全部楼层
    两位版主大大都是高手,我要学习。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-4-14 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-6-28 21:46:55 | 显示全部楼层
    楼主厉害!/:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-2 20:44:41 | 显示全部楼层
    谢谢楼主的分享,收藏了再慢慢看了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-15 00:20:40 | 显示全部楼层
    当初入门的时候好像还是一个层次的,现在看来差距大啊 /:014
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-17 01:21:59 | 显示全部楼层
    吓到我了。。/:013 太牛了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表