首页
社区
课程
招聘
[原创]为程序增加区段
发表于: 2009-5-7 22:27 31023

[原创]为程序增加区段

2009-5-7 22:27
31023

给和我一样的菜鸟
不修改原来的文章了
在这里总结一下,步骤如下
1.构造新的区段头
2.增加实际空间
3.修正NumberOfSections和SizeOfImage
NumberofSections(此值位于PE头开始的偏移6H处,WORD)你添加几个节就在原来的基础上加几
SizeOfImage(此值位于PE头开始的50h处,DWORD)则根据增加的Virtual Size做相应修改
手工增加后的test.exe已经上传


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (28)
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
2
LZ谦虚了 终于住上了传说中的板凳了
2009-5-7 22:43
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
真是惜字如金, 多说几句嘛.
2009-5-7 22:49
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
额 手工的啊
我试着写过,加了区段 但就运行不了了
路过的大侠指点一下哦
#include "windows.h"
#include <assert.h>
#include <stdio.h>
#define SECTION_SIZE    0x2000   
#define SECTION_NAME    ".zapline"  
BOOL AddSection(LPCSTR fileName);
int Align(int size, int base);
int main()
{
 char a[30]="";
 scanf("%s",a);
 if ( AddSection(a) )
 {
  MessageBox(NULL,"成功!","",MB_OK);
 }
 else
 {
  MessageBox(NULL,"失败!","",MB_OK);
 }
 return 0;
}
BOOL AddSection(LPCSTR fileName)
{  
 IMAGE_DOS_HEADER *dosHeader;
 IMAGE_NT_HEADERS *ntHeader;
 IMAGE_SECTION_HEADER *sectionHeader;
 IMAGE_SECTION_HEADER *newSectionHeader;
 IMAGE_SECTION_HEADER *lastSectionHeader;
 int numOfSections;
 int FILE_ALIGN_MENT;
 int SECTION_ALIGN_MENT;

 HANDLE hFile=CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hFile==INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL,"open file failed!","",MB_OK);
  return FALSE;
 }
 HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
 if(hMap==INVALID_HANDLE_VALUE)
 {
  MessageBox(NULL,"create map failed!","",MB_OK);
  return FALSE;
 }
 LPVOID lpBase=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
 if(lpBase==NULL)
 {
  MessageBox(NULL,"get view failed!","",MB_OK);
  return FALSE;  
 }
 dosHeader=(IMAGE_DOS_HEADER*)lpBase;
 if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
 {
  MessageBox(NULL,"not PE file!","",MB_OK);
  return FALSE;
 }
 ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
 if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
 {
  MessageBox(NULL,"not FE file!","",MB_OK);
  return FALSE;
 }
 FILE_ALIGN_MENT = ntHeader->OptionalHeader.FileAlignment;
 SECTION_ALIGN_MENT = ntHeader->OptionalHeader.SectionAlignment;
 numOfSections = ntHeader->FileHeader.NumberOfSections;
 ntHeader->FileHeader.NumberOfSections++;
 sectionHeader = (IMAGE_SECTION_HEADER*)((DWORD)ntHeader+sizeof(IMAGE_NT_HEADERS));
 lastSectionHeader = (IMAGE_SECTION_HEADER *)§ionHeader[numOfSections-1];
 newSectionHeader = (IMAGE_SECTION_HEADER *)§ionHeader[numOfSections];
 memset(newSectionHeader,0,sizeof(IMAGE_SECTION_HEADER));
 strncpy((char*)newSectionHeader->Name,SECTION_NAME,strlen(SECTION_NAME));
 newSectionHeader->VirtualAddress = lastSectionHeader->VirtualAddress+Align(lastSectionHeader->Misc.VirtualSize,SECTION_ALIGN_MENT);
// ntHeader->OptionalHeader.AddressOfEntryPoint = newSectionHeader->VirtualAddress;
 newSectionHeader->Misc.VirtualSize = Align(3000,SECTION_ALIGN_MENT);
 newSectionHeader->PointerToRawData = lastSectionHeader->PointerToRawData+Align(lastSectionHeader->SizeOfRawData,FILE_ALIGN_MENT);
 newSectionHeader->SizeOfRawData = Align(SECTION_SIZE, FILE_ALIGN_MENT);
 newSectionHeader->Characteristics = 0xE0000020;
 ntHeader->OptionalHeader.SizeOfCode = ntHeader->OptionalHeader.SizeOfCode+Align(SECTION_SIZE, FILE_ALIGN_MENT);
 ntHeader->OptionalHeader.SizeOfImage = ntHeader->OptionalHeader.SizeOfImage+Align(SECTION_SIZE, SECTION_ALIGN_MENT);
 FlushViewOfFile(lpBase,0);
 UnmapViewOfFile(lpBase);
 CloseHandle(hMap);
 if(SetFilePointer(hFile,SECTION_SIZE,NULL,FILE_END)==-1)
 {
  MessageBox(NULL,"set file pointer failed!","",MB_OK);
  return FALSE;
 }
 if(!SetEndOfFile(hFile))
 {
  MessageBox(NULL,"set file end failed!","",MB_OK);
  return FALSE;
 }
 CloseHandle(hFile);
 return TRUE;
}
int Align(int size, int base)
{
 int ret,result;
 assert( 0 != base); 
 result = size % base;
 result != 0 ? ret = ((size / base) + 1) * base : ret = size;
 return ret;
}
2009-5-7 22:53
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
在sessiondiy前辈面前,我还有什么好说的
曾经误会过s前辈,言语上有冒犯,不知道是否还介怀

to zapline

学习pe结构的时候我曾经写过一段,增加了区段,写入了代码,改了入口点,测试正常。如有需要,可以发给你,不过是汇编写的。
2009-5-7 23:01
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
那件事? 多久前?
这不找出来看看怎行...
2009-5-7 23:07
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ASM我只能勉强看懂
下次群里碰到传我一下哦
2009-5-7 23:09
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
额 貌似我都记得
是UB悬赏去弹网页吧
2009-5-7 23:10
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
记不得就好,哈哈



不是那次,悬赏去弹网页是sessiondiy前辈来指点的,我只是和那个前来大放厥词的朋友吵了一下。
2009-5-7 23:16
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
是有那帖. 不过应该不是那帖.

你用你写的工具给小东西加个区段发出来看看错在那里.
2009-5-7 23:17
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大侠看看  区段好像没问题
入口点好像也没问题
上传的附件:
  • 0.rar (14.20kb,27次下载)
2009-5-7 23:18
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个是没加区段的
hello zapline
上传的附件:
  • 0.rar (14.17kb,19次下载)
2009-5-7 23:23
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主太谦虚了

这学习气氛真不错
2009-5-7 23:27
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
ImageSize 多了 1000h

以你 0.exe 为例,  D000 改为 C000 即可
2009-5-7 23:28
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我十分想知道怎么手工添加区段!

sessiondiy前辈能指点指点吗?
2009-5-7 23:49
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
16
至于为何 ImageSize 不对,  你自己看一下要改那里才是你要的 :

/* 是 3000?   0x3000?   变量 SECTION_SIZE?
/* 我想你要写的应该是 SECTION_SIZE , 而不是3000元
newSectionHeader->Misc.VirtualSize = Align(3000,SECTION_ALIGN_MENT);

所以应该是你 VirtualSize 不对, 造成了 ImageSize 不对的错觉.

---------------------

回 Free , 不是我写的.
2009-5-8 00:12
0
雪    币: 1329
活跃值: (5184)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
收藏了!!!!!!
2009-5-8 03:30
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
让我对PE的结构了解的更加深入了一个层次!
2009-5-8 07:48
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢师傅
2009-5-8 11:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我也下载来看看了啊
2009-5-8 20:32
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
感觉讲了很好有助于加深节表的理解如果把增加区段后的程序也发上来能对比下的话可能更好,还有增加区段最后能不能总结下步骤。我看了后好像包括:修改文件头中的NumberOfSection值;2.加上一个节表结构,文中好像没看到VitualAddress怎么填的;3,修改sizeOfImage........
2009-5-8 21:35
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
22
非常感谢你的建议,我有空修改一下。
2009-5-8 22:52
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
23
已经做了修改



PE文件内存对齐值通常为1000H,文件对齐值一般为200H,因此区块的Virtual Address应为1000H的整倍数,而Raw Address应为200H的整倍数,还有每个区块的实际大小Raw Size也应为200H的整倍数。

根据文中提到的以上信息,新增区段的Virtual Offset这样填,上一个区段的Virtual Offset+Virtual Size(VS不足1000H按1000H计算)
2009-5-8 23:23
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
额。。今天早上拜膜~黑客反汇编一书。
正好说到...节区
data_seg()


拜膜大牛的帖子~
2009-5-9 00:19
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
顶一下。。。
2009-5-9 12:44
0
游客
登录 | 注册 方可回帖
返回
//