Pe 简单增加区段
原由
这几天要写个Xor加密的壳子,原来已经写过2遍,但是源码丢掉了,只能很比较无奈的重新再写。但是要增加区段啊,用LordPE增加要修改一些相关的信息,不只是在区段的界面增加一个新的区段,就很麻烦。因此写一个增加区段的工具,很简单,供大家参考。
总共用了一天时间写完,速度还可以,因为毕竟有自己写的Pe库,就很方便。
Pe库
决定把原来的Pe库改写成C和C++混合的,名为 LibPe。同时更改了很多c文件的源码。
请注意:本代码库遵循 LGPL协议 发布。
链接:https://pan.baidu.com/s/18d3YWww5mauK4Sqn_-MSuQ
提取码:hpny
代码
#include <stdio.h>
#include <Windows.h>
#include <winnt.h>
#include <string>
#include "LibPeH.h" //这个就是我原来写的那个 PE.h ,给改了名字
using std::string;
int main(int prmNbr, char* prmArr[])
{
char* flNm;
flNm = (char*)malloc(0x100);
memset(flNm, 0, sizeof(flNm));
//printf("%d\n", prmNbr);
//获取文件名参数
if (prmNbr > 1)
{
strcpy(flNm,prmArr[1]);
}
else
{
printf(">>> [文件名]:%s", flNm);
scanf("%s",flNm );
}
PeStrc pe = getStrc(flNm);
//修改optional header中的相关信息
pe.optHd.SizeOfImage += 0x1000;
pe.flHd.NumberOfSections++;
//修改节表
int newScnIdx = pe.scnCnt;
memcpy(pe.scnHd[newScnIdx].Name, (byte*)".decode\0", 0x8);
pe.scnHd[newScnIdx].PointerToRawData = scnIdxToFoaFromStrc(pe,newScnIdx-1) + scnIdxToFlSzFromStrc(pe,newScnIdx-1);
pe.scnHd[newScnIdx].SizeOfRawData = szAlgn(pe.flAlgn,0x400);
pe.scnHd[newScnIdx].VirtualAddress = scnIdxToRvaFromStrc(pe,newScnIdx-1) + scnIdxToVrtSzFromStrc(pe,newScnIdx-1);
pe.scnHd[newScnIdx].Misc.VirtualSize = szAlgn(pe.scnAlgn, 0x1000);
pe.scnHd[newScnIdx].Characteristics = IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_DATA|IMAGE_SCN_MEM_READ \
| IMAGE_SCN_MEM_WRITE;
pe.scnCnt++;
pe.ntHd.FileHeader = pe.flHd;
pe.ntHd.OptionalHeader = pe.optHd;
pe.flSz += 0x400;
pe.scn[newScnIdx] = (byte*)malloc(szAlgn(pe.flAlgn, 0x400)+0x1000);
strcGnrt((char *)(string("Scn_")+string(flNm)).c_str(),pe );
}