能力值:
( LV13,RANK:350 )
|
-
-
2 楼
LZ谦虚了 终于住上了传说中的板凳了
|
能力值:
( LV9,RANK:180 )
|
-
-
3 楼
真是惜字如金, 多说几句嘛.
|
能力值:
( 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;
}
|
能力值:
(RANK:350 )
|
-
-
5 楼
在sessiondiy前辈面前,我还有什么好说的
曾经误会过s前辈,言语上有冒犯,不知道是否还介怀
to zapline
学习pe结构的时候我曾经写过一段,增加了区段,写入了代码,改了入口点,测试正常。如有需要,可以发给你,不过是汇编写的。
|
能力值:
( LV9,RANK:180 )
|
-
-
6 楼
那件事? 多久前?
这不找出来看看怎行...
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
额 貌似我都记得
是UB悬赏去弹网页吧
|
能力值:
(RANK:350 )
|
-
-
9 楼
记不得就好,哈哈
不是那次,悬赏去弹网页是sessiondiy前辈来指点的,我只是和那个前来大放厥词的朋友吵了一下。
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
是有那帖. 不过应该不是那帖.
你用你写的工具给小东西加个区段发出来看看错在那里.
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
大侠看看 区段好像没问题
入口点好像也没问题
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这个是没加区段的
hello zapline
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
楼主太谦虚了
这学习气氛真不错
|
能力值:
( LV9,RANK:180 )
|
-
-
14 楼
ImageSize 多了 1000h
以你 0.exe 为例, D000 改为 C000 即可
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
我十分想知道怎么手工添加区段!
sessiondiy前辈能指点指点吗?
|
能力值:
( LV9,RANK:180 )
|
-
-
16 楼
至于为何 ImageSize 不对, 你自己看一下要改那里才是你要的 :
/* 是 3000? 0x3000? 变量 SECTION_SIZE?
/* 我想你要写的应该是 SECTION_SIZE , 而不是3000元
newSectionHeader->Misc.VirtualSize = Align(3000,SECTION_ALIGN_MENT);
所以应该是你 VirtualSize 不对, 造成了 ImageSize 不对的错觉.
---------------------
回 Free , 不是我写的.
|
能力值:
( LV3,RANK:20 )
|
-
-
17 楼
收藏了!!!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
让我对PE的结构了解的更加深入了一个层次!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
谢谢师傅
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
我也下载来看看了啊
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
感觉讲了很好有助于加深节表的理解如果把增加区段后的程序也发上来能对比下的话可能更好,还有增加区段最后能不能总结下步骤。我看了后好像包括:修改文件头中的NumberOfSection值;2.加上一个节表结构,文中好像没看到VitualAddress怎么填的;3,修改sizeOfImage........
|
能力值:
(RANK:350 )
|
-
-
22 楼
非常感谢你的建议,我有空修改一下。
|
能力值:
(RANK:350 )
|
-
-
23 楼
已经做了修改
PE文件内存对齐值通常为1000H,文件对齐值一般为200H,因此区块的Virtual Address应为1000H的整倍数,而Raw Address应为200H的整倍数,还有每个区块的实际大小Raw Size也应为200H的整倍数。
根据文中提到的以上信息,新增区段的Virtual Offset这样填,上一个区段的Virtual Offset+Virtual Size(VS不足1000H按1000H计算)
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
额。。今天早上拜膜~黑客反汇编一书。
正好说到...节区
data_seg()
~
拜膜大牛的帖子~
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
顶一下。。。
|
|
|