vc编写自己的壳之一:对pe文件OEP的修改

转载 2007年10月14日 13:57:00

调试了下修改pe文件的oep,然后在新的入口点什么都没做,只是jmp回到原始入口点,程序继续执行.测试通过. 准备明天在自己入口点的地方添加一个MessageBox代码.

很多是网上朋友的代码,借用下不好意思,如有版权等问题请联系偶,偶会尽快处理,谢谢.

void CPeSecDlg::Go()
{
 HANDLE hFile, hMapping;
 void * basepointer = NULL;
 if(INVALID_HANDLE_VALUE == (hFile = CreateFile("C://CenterServer.exe",
  GENERIC_READ | GENERIC_WRITE,
  FILE_SHARE_READ | FILE_SHARE_WRITE,
  0,
  OPEN_EXISTING,
  FILE_FLAG_SEQUENTIAL_SCAN,
  0)))
 {
  AfxMessageBox("打开失败!!");
  return;
 }

 if(!(hMapping = CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0)))
 {
  AfxMessageBox("CreateFileMapping打开失败!!");
  CloseHandle(hFile);
  return;
 }

 if(!(basepointer = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0)))
 {
  AfxMessageBox("MapViewOfFile");
  CloseHandle(hMapping);
  CloseHandle(hFile);
  return;
 }

 IMAGE_DOS_HEADER * dos_head = (IMAGE_DOS_HEADER*)basepointer;
 IMAGE_NT_HEADERS * header = (IMAGE_NT_HEADERS*)((char*)dos_head + dos_head->e_lfanew);
 DWORD oldOEP = header->OptionalHeader.AddressOfEntryPoint;
 IMAGE_SECTION_HEADER * sectionHeader = (IMAGE_SECTION_HEADER*)(((char*)header + sizeof(IMAGE_NT_HEADERS)));

 //此段真实长度
 DWORD dwVirtSize = sectionHeader->Misc.VirtualSize;
 //此段物理偏移
 DWORD dwPhysAddress = sectionHeader->PointerToRawData;
 //此段物理长度
 DWORD dwPhysSize = sectionHeader->SizeOfRawData;
 //取得此段的可用空间
 DWORD dwSpace = dwPhysSize - dwVirtSize;
 //取得程序的装载地址
 DWORD dwProgRAV = header->OptionalHeader.ImageBase;

 //代码偏移一般为0
 DWORD dwCodeOffset = header->OptionalHeader.BaseOfCode - dwPhysAddress;

 //代码写入的物理偏移
 DWORD dwEntryWrite = dwPhysAddress + dwVirtSize;
 if(0 != (dwEntryWrite%16))
 {
  dwEntryWrite += (16 - (dwEntryWrite%16));
 }

 //计算新的程序入口地址
 DWORD dwNewEntryAddress = dwEntryWrite + dwCodeOffset;

 //将jmp oldOEP的代码写入新的入口地址
 SetFilePointer(hFile, dwNewEntryAddress, NULL, FILE_BEGIN);
 //jmp oldOEP的16进值码为0xE90002D820
 DWORD iWrited = 0;
 char cmd[4] = {0};
 ChangeDwordToString(/*0x0002D820*/0xFFFE069B, cmd);
/* cmd[0] = (char)0x00;
 cmd[1] = (char)0x02;
 cmd[2] = (char)0xD8;
 cmd[3] = (char)0x20;
 WriteFile(hFile, cmd, 4, &iWrited, NULL);
*/ char d[1] = {0};
 d[0] = (char)0xE9;
 WriteFile(hFile, d, 1, &iWrited, NULL);
 WriteFile(hFile, cmd, 4, &iWrited, NULL);

 //设置新的入口地址
 int nEntryPos = dos_head->e_lfanew + 40;
 SetFilePointer(hFile, nEntryPos, NULL, FILE_BEGIN);
 char pBuffer[4] = {0};
 ChangeDwordToString(/*0x0002D820*/dwNewEntryAddress, pBuffer);
 WriteFile(hFile, pBuffer, 4, &iWrited, NULL);

 //OK
}

//转换DWORD为字符串,并转换成低低高高顺序
void CPeSecDlg::ChangeDwordToString(DWORD d, char *cBuffer)
{
 unsigned char waddress[4] = {0};

 cBuffer[3] = (char)(d>>24)&0xFF;
 cBuffer[2] = (char)(d>>16)&0xFF;
 cBuffer[1] = (char)(d>>8)&0xFF;
 cBuffer[0] = (char)(d)&0xFF;

手动增加pe节并修改oep

一直想学学怎么动动pe文件,学习了几篇文章尤其是寒晨的文章后,自己动手也尝试了一下加节和修改oep,写出来供和我一样菜的一起进步。 一、       增加pe节需要的操作 1.    确定...
  • wangbabadan
  • wangbabadan
  • 2015年03月26日 09:40
  • 319

Windows可执行文件(PE文件)壳的设计过程

PE文件壳的设计过程 标题:pe文件壳的设计过程 作者:baccon(PEDIY论坛),或chenxiang(软件发布者) 时间:2013年10月26日星期六...
  • adebies
  • adebies
  • 2014年10月04日 00:38
  • 1275

图解VC++版PE文件解析器源码分析

该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 ...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年07月13日 19:11
  • 1741

壳的编写(5)-- 进行加壳操作

由于我们在编写壳的部分比较简单,那么我们在编写加壳的过程中难免要复杂些。我们要完成加壳的操作必然会要读取被加壳程序的各种信息,并保存到一个结构中,为了便于后面的操作。还有在操作上只能读取源文件,将加壳...
  • oBuYiSeng
  • oBuYiSeng
  • 2016年01月16日 16:58
  • 2098

常见脱壳的查找OEP的方法--黑鹰教程

OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳。 PUSHAD (压栈) 代表程序的入口点        POPAD...
  • woshiyuanlei
  • woshiyuanlei
  • 2015年05月17日 19:25
  • 1312

壳的编写(3)-- 编写壳(Stub)部分(2)

接:壳的编写(2)-- 编写壳(Stub)部分(1)  http://blog.csdn.net/obuyiseng/article/details/50456807 5、动态加载API--获取...
  • oBuYiSeng
  • oBuYiSeng
  • 2016年01月04日 16:41
  • 945

手动修改PE文件:添加自定义代码

在PE文件里有很多位置可以添加自己的代码(其实就是感染PE),凡是用不到的地方都能加。想到的位置有(在文件中不是在内存中):Dos头和Nt头之间、每个节末尾的Padding(间隙)、新增节分配在文件末...
  • nargnos
  • nargnos
  • 2014年11月06日 16:38
  • 868

常见各种语言编写的程序的入口点代码(识别是否到达OEP)

Borland Delphi 6.0- 7.0 00509CB0 > $ 55 PUSH EBP 00509CB1 . 8BEC MOV EBP,ESP 00509CB3 . 83C4 EC A...
  • pxm2525
  • pxm2525
  • 2014年10月10日 20:11
  • 1733

修改文件版本信息(PE文件版本信息、资源Version)

修改PE文件版本信息(简单演示)
  • tiewen
  • tiewen
  • 2014年04月14日 17:46
  • 7740

压缩壳和低强度加密壳的万能脱壳法

OEP内存断点万能脱壳法 对于压缩壳和低强度加密壳经过一段时间的研究发现有一种万能的脱壳方法--OEP内存断点万能脱壳法。什么是压缩壳和低强度加密壳呢?所谓压缩壳和低强度加密壳是指能用PEiD的...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2013年07月18日 10:52
  • 1853
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc编写自己的壳之一:对pe文件OEP的修改
举报原因:
原因补充:

(最多只允许输入30个字)