首页
社区
课程
招聘
[原创]元宵节献礼,用类的思想处理PE结构附源码
发表于: 2015-3-5 22:07 20945

[原创]元宵节献礼,用类的思想处理PE结构附源码

2015-3-5 22:07
20945

最近在论坛里接了个业务,客户看了我的ID后说,我发的都是求助帖,对我的能力很质疑,我自己一看才发现,真是除了几年前发了个破解的帖子蒙混过关骗得一个邀请码之外,一直在做伸手党,于是翻出了之前给赏金论坛做过的一套《壳的编写》的教程,因为做的时候答应人家不能再出售,所以就不发教程了,只是把里面的源码拿来用下。
    一直以来我都是以开发为主,类的思想在我脑海里根深蒂固,几年前研究PE结构的时候发现,PE结构完全可以用类的思想处理,于是写了几个处理的代码,并用这个思想写了个简单的加壳程序,可以给notepad.exe加壳,仅供参考,现把代码贴上献丑。
---------------------------------第二次编辑---------------------------------------------------------
其实主要想法就是减少重复劳动,做到代码最大限度的重用,把功能模块化,比如得到NT头,这个功能很多数据都是通过这里开始的,这样就不用每次都重复这个代码,直接调用类中的这个代码就可以了,特别是利用C++的集成功能,可以在继承的子类中使用这部分代码,而对于子类这个代码是不可见的,功能可以用类区分开,代码非常容易管理。下面贴出个别核心代码供大家参考。


//基本的PE处理 可以得到dos头 NT头 节 等信息
class LPEFile  
{
public:
  BOOL LoadPEFile(BYTE* lpBuffer,DWORD dwSize);          //载入PE文件
  LPVOID RvaToPtr(DWORD dwRVA);                          //计算偏移
  LPVOID GetDirectoryEntryToData(USHORT DirectoryEntry);   
  PIMAGE_SECTION_HEADER GetSection(int nIndex);           //得到节的信息
  BOOL IsPEFile();
  PIMAGE_SECTION_HEADER GetFirstSectionHeader();         //得到第一个节
  int GetSectionCount();                                 //得到节的个数
  PIMAGE_DATA_DIRECTORY GetDataDirectory(int nIndex);     //得到数据目录
  PIMAGE_DATA_DIRECTORY GetDataDirectory();               //得到数据目录
  PIMAGE_OPTIONAL_HEADER GetNtOptionalHeader();           
  PIMAGE_FILE_HEADER GetNtFileHeader();
  PIMAGE_NT_HEADERS GetNtHeader();          
  PIMAGE_DOS_HEADER GetDosHeader();
  DWORD GetImageSize();
  BYTE* GetImage();
  bool Free();
  BOOL LoadPEFile(char* lpFilename);
  BOOL SetInfo(MAP_FILE_STRUCT *pMapFileMsg);
  MAP_FILE_STRUCT* GetInfo();
  void operator=(LPEFile& lPeFile);
  LPEFile();
  virtual ~LPEFile();

private:
  //用于标识文件的打开状态//用于标识文件的打开状态
    BYTE bLoadStact;    
    //用于存储打开的文件句柄,文件数据,文件大小

protected:
    MAP_FILE_STRUCT *pstMapFile;
};


//用于将文件载入内存
BOOL LPEFile::LoadPEFile(char *lpFilename)
{
	HANDLE hFile;
	HANDLE hMapping;
	LPVOID ImageBase;
    pstMapFile=new MAP_FILE_STRUCT;
	bLoadStact=LFILE_FROM_FILE;
    
	hFile=CreateFile(lpFilename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,NULL);
	if (hFile==NULL)
	{
		return FALSE;
	}
	pstMapFile->dwFileSize=GetFileSize(hFile,NULL);
	hMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,pstMapFile->dwFileSize,NULL);
	if (hMapping==NULL)
	{
		CloseHandle(hFile);
		return FALSE;
	}
    
	ImageBase=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,pstMapFile->dwFileSize);
	if (ImageBase==NULL)
	{
		CloseHandle(hFile);
		CloseHandle(hMapping);
		return FALSE;
	}
	pstMapFile->hFile=hFile;
	pstMapFile->hMapping=hMapping;
	pstMapFile->ImageBase=ImageBase;
   return TRUE;
}

//得到文件的dos头
PIMAGE_DOS_HEADER LPEFile::GetDosHeader()
{
   return (PIMAGE_DOS_HEADER)GetImage();
}
//得到文件的NT头,这里就不需要从得到Dos开始了,直接调用编写好的类函数
PIMAGE_NT_HEADERS LPEFile::GetNtHeader()
{
    PIMAGE_DOS_HEADER pDH=GetDosHeader();
	if (pDH!=NULL)
	{
		return (PIMAGE_NT_HEADERS32)((DWORD)GetImage()+pDH->e_lfanew);
	}
	return NULL;
}
//得到文件头
PIMAGE_FILE_HEADER LPEFile::GetNtFileHeader()
{
   PIMAGE_NT_HEADERS pNth=GetNtHeader();
   if (pNth!=NULL)
   {
	   return (PIMAGE_FILE_HEADER)&pNth->FileHeader;
   }
   return NULL;
}
//得到可选头
PIMAGE_OPTIONAL_HEADER LPEFile::GetNtOptionalHeader()
{
	PIMAGE_NT_HEADERS pNth=GetNtHeader();
	if (pNth!=NULL)
	{
		return (PIMAGE_OPTIONAL_HEADER32)&pNth->OptionalHeader;
	}
   return NULL;
}
//得到数据目录
PIMAGE_DATA_DIRECTORY LPEFile::GetDataDirectory()
{
   PIMAGE_OPTIONAL_HEADER pOptionalHeader=GetNtOptionalHeader();
   if (pOptionalHeader!=NULL)
   {
	   return (PIMAGE_DATA_DIRECTORY) pOptionalHeader->DataDirectory;
   }
   return NULL;
}

PIMAGE_DATA_DIRECTORY LPEFile::GetDataDirectory(int nIndex)
{
    if (nIndex>=0&&nIndex<16)
    {
        PIMAGE_DATA_DIRECTORY pDataDir=GetDataDirectory();
		if (pDataDir!=NULL)
		{
				return &pDataDir[nIndex];
		}
    }
	return NULL;
}



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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (45)
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
看看学习一下
2015-3-5 22:24
0
雪    币: 194
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
这文章肯定不能射精了。
2015-3-5 22:58
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
。。额,表示不懂
2015-3-5 23:29
0
雪    币: 538
活跃值: (269)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
对于这种模块化的拿来就能用的代码 只能赞一个!
2015-3-5 23:35
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
mark一下下
2015-3-5 23:45
0
雪    币: 138
活跃值: (470)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
原来赏金的《壳的编写》是你做的呀~  
当时让我受益匪浅 万分感谢~!
2015-3-6 09:37
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
多谢啦,那个是我几年前写的教程!
2015-3-6 13:38
0
雪    币: 47
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
老狼 我也看过你的《壳的编写》教程  也是受益匪浅啊
2015-3-6 15:08
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
再次编辑,谢谢关注!
2015-3-6 20:05
0
雪    币: 84
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习中。谢谢老大!
2015-3-6 21:08
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
谢谢看雪老大鼓励,我会继续努力的!
2015-3-7 22:24
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
可以读读PeLib的代码,C++写的,很精致
2015-3-8 09:30
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark mark
2015-3-8 10:59
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
谢谢啦,我会努力的。
2015-3-8 12:30
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
感谢分享,mark一下
2015-3-8 12:33
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
17
终于精了~哈。。
2015-3-8 21:38
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
是看雪老大为了鼓励我给的精华。
2015-3-8 21:50
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
把你那套android放出来肯定是哈哈哈。。。。得不偿失...
2015-3-8 21:51
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
打死也不能开源的,我一年多的心血。
2015-3-8 23:07
0
雪    币: 1753
活跃值: (2187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不放的话就你就是唯一作者,你知道的
2015-3-9 00:47
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
原来赏金的教程是你做的
一定要致谢咯,~~
2015-3-9 10:50
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
23
谢谢,你也看过啊?
2015-3-9 11:24
0
雪    币: 1234
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
大神,嘿嘿。
2015-3-9 11:39
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
25
NiCe! Bump up the thread
2015-3-9 14:59
0
游客
登录 | 注册 方可回帖
返回
//