|
本帖最后由 admin_user 于 2015-3-11 14:16 编辑
最近在论坛里接了个业务,客户看了我的ID后说,我发的都是求助帖,对我的能力很质疑,我自己一看才发现,真是除了几年前发了个破解的帖子蒙混过关骗得一个邀请码之外,一直在做伸手党,于是翻出了之前给赏金论坛做过的一套《壳的编写》的教程,因为做的时候答应人家不能再出售,所以就不发教程了,只是把里面的源码拿来用下。
一直以来我都是以开发为主,类的思想在我脑海里根深蒂固,几年前研究PE结构的时候发现,PE结构完全可以用类的思想处理,于是写了几个处理的代码,并用这个思想写了个简单的加壳程序,可以给notepad.exe加壳,仅供参考,现把代码贴上献丑。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| //基本的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;
};
|
有了基本的PE处理之后,就可以在类上做继承,扩展新功能
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| //继承LPEFile里面基础处理功能并对 对节处理进行扩展
class LPESection : public LPEFile
{
public:
BOOL WriteSectionData(int nIndex,DWORD dwOffset,BYTE* lpBuffer,DWORD *dwSize); //写入节数据
BYTE* GetSectionData(int nIndex,DWORD* rdwSize); //得到节数据
BOOL AddSection(char* pSectionName,DWORD &dwSectionSize,DWORD dwSectionStact); //添加一个节
DWORD OffsetToRva(DWORD dwOffset); //计算偏移
DWORD RvaToOffset(DWORD dwRva); //计算偏移
DWORD GetVRk(int nSeciotnIndex);
int OffsetToSectionIndex(DWORD dwOffset);
int RvaToSectionIndex(DWORD dwRva);
LPESection();
virtual ~LPESection();
void operator =(LPEFile& lPeFile);
};
//继承自LPEFile 对处理重定位表功能进行扩展
class LPEReLocal : public LPEFile
{
public:
BOOL RelocaltionVA(DWORD dwNewAddress, DWORD dwNewImageBase, DWORD &dwOldVA);
BOOL RelocationMySelf(DWORD dwNewSecAddress,DWORD dwImageBase);
DWORD GetReLocaltionRVA(int nRelocalIndex,int nTypeOffsetIndex);
WORD GetReLocationType(int nRelocalIndex,int nTypeOffsetIndex);
WORD GetTypeOffset(int nRelocalIndex,int nOffsetIndex);
int GetTypeOffsetCount(int nIndex);
PIMAGE_BASE_RELOCATION GetReLocal(int nCount,DWORD *rdwOffset);
int GetReLocalCount();
PIMAGE_BASE_RELOCATION GetFirstReLocaltion();
LPEReLocal();
virtual ~LPEReLocal();
void operator=(LPEFile& lPeFile);
};
//继承自LPEFile 对处理导入表功能进行扩展
class LPEImport : public LPEFile
{
public:
BOOL ReLocalImport(DWORD dwRVA);
DWORD GetImportThunk(PIMAGE_IMPORT_DESCRIPTOR pImportDesc);
void operator=(LPEFile& lPeFile);
PIMAGE_IMPORT_BY_NAME GetImportFucByName(DWORD RavThunk);
PIMAGE_IMPORT_DESCRIPTOR GetImportDesc(int index);
int GetImportDesCount();
PIMAGE_IMPORT_DESCRIPTOR GetFirstImportDesc();
LPEImport();
virtual ~LPEImport();
};
//继承自LPEFile对处理导出表功能进行扩展
class LPEExport : public LPEFile
{
public:
WORD GetNameOrdValue(int nIndex);
DWORD GetNameOrd(int nIndex);
DWORD GetFirstNameOrd();
char* GetNameValue(int nIndex);
DWORD GetName(int nIndex);
DWORD GetFirstName();
DWORD GetFuncValue(int nIndex);
DWORD GetFunc(int nIndex);
DWORD GetFirstFunc();
int GetNameCount();
int GetFuncCount();
PIMAGE_EXPORT_DIRECTORY GetExportTab();
LPEExport();
virtual ~LPEExport();
void operator=(LPEFile& lPeFile);
};
|
开源的加壳代码已经很多了,重要的不是介绍怎样加壳,而是给大家提供一种新的PE文件处理思路,本人小菜,不当之处请多包含 |
|