惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
A
About on SuperTechFans
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
博客园 - Franky
D
Docker
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
U
Unit 42
F
Fortinet All Blogs
H
Help Net Security
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
P
Proofpoint News Feed
月光博客
月光博客
G
Google Developers Blog

博客园 - 龙巢NET刀

Windows位图文件格式[转] Windows堆栈区别[转] 聚焦3D地形编程第五章GeomipMapping for the CLOD 聚焦3D地形编程第四章光照化地形 聚焦3D地形编程第三章纹理化地形 聚焦3D地形编程第一章 The Journey into the great Outdoors 聚焦3D地形编程第二章Terrain 101 枚举驱动器 - 龙巢NET刀 - 博客园 文件遍历目录 和InjectFile配套InjectDLL - 龙巢NET刀 - 博客园 和InjectFile配套TestOne 激动的InjectFile 通过GUI方式打印信息 PE文件加区块 我的简历 进度 我的经历我的历史 内嵌Lua问题 BGET内存分配器
PE文件
龙巢NET刀 · 2007-05-12 · via 博客园 - 龙巢NET刀

// 插入区块
bool InsertSection(BYTE *decBuf)
{
 cout<<"计算区块各参数:";
 // 插入区块, 先获取OEP
 const int offDOSStub = 0x3C;
 long      off_elfanew = 0;   // 根据类型直接读出即可。
    char  szPEHead[5];           // PE00
 WORD  Machine = 0;           // CPU类型   
 DWORD AddressOfEntryPoint = 0; // 程序执行入口RVA
 DWORD ImageBase = 0;         // 程序默认装入基址
    WORD  SubSystem = 0;         // 子系统, 控制台或其他
    DWORD SizeOfImage = 0;       // 内存中整个PE映像大小
    WORD  SizeOfOptionalHeader = 0; // 可选映像头大小
    DWORD SectionTableHeaderValue = 0;  // 块表首值  PE(Base) + 0x12 + SizeOfOptionalHeader
    WORD NumberOfSections        = 0;  // 块(Section)个数
 DWORD SectionsLength          = 0;  // 块长度

 FILE* test = fopen("test.txt", "wb");

 memcpy(&off_elfanew, &decBuf[offDOSStub], sizeof(long));
 fwrite(&off_elfanew, 1, sizeof(off_elfanew), test);
 memcpy(szPEHead, &decBuf[off_elfanew], sizeof(szPEHead));
 fwrite(szPEHead, 1, sizeof(szPEHead)-1, test);
 memcpy(&Machine, &decBuf[off_elfanew + 0x4], sizeof(WORD));
 if(Machine == 0x14C)
   printf("CPU Intel i386或以上系列: %X\n", Machine);
    memcpy(&AddressOfEntryPoint, &decBuf[off_elfanew + 0x28], sizeof(DWORD));
 printf("程序入口点: 0x0%X\n", AddressOfEntryPoint);
    memcpy(&ImageBase, &decBuf[off_elfanew + 0x34], sizeof(DWORD));
 printf("镜像基址: 0x0%X\n", ImageBase);
    memcpy(&SubSystem, &decBuf[off_elfanew + 0x5C], sizeof(WORD));
 switch(SubSystem)
 {
 case 0:
  printf("未知子系统\n");
  break;
 case 1:
        printf("不需要子系统: 0x0%X\n", SubSystem);
  break;
 case 2:
  printf("图形接口子系统(GUI): 0x0%X\n", SubSystem);
  break;
 case 3:
  printf("控制台子系统(Console or DOS or CUI): 0x0%X\n", SubSystem);
  break;
 case 5:
  printf("OS/2字符子系统: 0x0%X\n", SubSystem);
  break;
 case 7:
  printf("POSIX字符子系统: 0x0%X\n", SubSystem);
  break;
 
 default:
  printf("未知子系统\n");
  break;
 }
 memcpy(&SizeOfImage, &decBuf[off_elfanew + 0x50], sizeof(DWORD));
 printf("内存镜像大小: 0x%X\n", SizeOfImage);
    memcpy(&SizeOfOptionalHeader, &decBuf[off_elfanew + 0x14], sizeof(WORD));
 printf("可选映像头大小: %d字节(%X)\n", SizeOfOptionalHeader,SizeOfOptionalHeader);
    memcpy(&SectionTableHeaderValue, &decBuf[off_elfanew + 0x18 + SizeOfOptionalHeader], sizeof(DWORD));
 printf("块表首值: %X\n", SectionTableHeaderValue);
    memcpy(&NumberOfSections, &decBuf[off_elfanew + 0x06], sizeof(WORD));
 printf("块(Sections)个数: %X\n", NumberOfSections);
   
 IMAGE_SECTION_HEADER  tISH;   // 块表结构实例
 printf("块表项结构大小: %d字节\n", sizeof(tISH));
 int t_totalSectionLength = sizeof(tISH) * NumberOfSections;
    printf("总块表长度: %d字节(%X)\n", t_totalSectionLength, t_totalSectionLength);
    int t_InsertPosition = 0x18 + SizeOfOptionalHeader + t_totalSectionLength;
 printf("插块表项偏移位置: 0x0%X\n", t_InsertPosition);

 fclose(test);
 return 0;
}