首页
社区
课程
招聘
[求助]pe文件修改后无法执行添加的代码
发表于: 2007-8-8 23:51 6577

[求助]pe文件修改后无法执行添加的代码

2007-8-8 23:51
6577
DWORD dwNtHeader=((PIMAGE_DOS_HEADER)pMem)->e_lfanew;
  int iSecNum = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->FileHeader.NumberOfSections;
  DWORD dwFirstSecHeader = dwNtHeader + sizeof(IMAGE_NT_HEADERS);
  int k;
  DWORD codeLength,codeRVA,codeOffset,OldEntry;
  callAddress = newcode;
  endAddress = ending;
  codeLength = reinterpret_cast<DWORD>(endAddress) - reinterpret_cast<DWORD>(callAddress);
  DWORD add=(DWORD)(newcode);
  DWORD add1=(DWORD)(ending);
  codeLength=add1-add;
  for(k=0;k<iSecNum;k++)
  {
    if (((PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
      -(PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->SizeOfRawData)
      >codeLength)
    {
      codeRVA = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
        + (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->VirtualAddress;
      codeOffset = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
        + (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->PointerToRawData;
      (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Characteristics =0xc0000040;
      RtlMoveMemory((char*)pMem + codeOffset,callAddress,codeLength);
      OldEntry = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint + (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.ImageBase;
      (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint = codeRVA;
      
      break;
    }

  }

AddressOfEntryPoint修改成功,我想先执行newcode,然后回到原AddressOfEntryPoint,文件改了以后,没有执行AfxMessageBox,用peid看EP区段也没有内容,怎么办??
void newcode()
{
  AfxMessageBox("dd");
  __asm
  {
    jmp OldEntry
  }
}

void ending(int)
{
       
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
2
DWORD dwFirstSecHeader = dwNtHeader + sizeof(IMAGE_NT_HEADERS);
这一行有问题,
看看 IMAGE_FIRST_SECTION 这个宏
2007-8-9 19:46
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DWORD dwFirstSecHeader = dwNtHeader + sizeof(IMAGE_NT_HEADERS);计算偏移量,有什么不对?
2007-8-9 23:41
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自己来顶啊。
2007-8-11 22:24
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
那里是对的!

怎么没有完整代码?

没看到保存文件的模块!

建议:
1:语句写短点,长的可以折分成几条写.
2:写点必要的注释
2007-8-12 08:12
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
6
第一个节的偏移不总是紧跟着在 nt 头的后面,而是由 file header 中的 optionl header size 确定的
2007-8-12 16:57
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=壹只老虎;344742]那里是对的!

怎么没有完整代码?

没看到保存文件的模块!

;;;;; RtlMoveMemory((char*)pMem + codeOffset,callAddress,codeLength);
2007-8-12 21:19
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
DWORD add=(DWORD)(newcode);
  DWORD add1=(DWORD)(ending);
  codeLength=add1-add;

这样取函数的尺寸对不对?
2007-8-13 21:52
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
if(FirstHdr->Misc.VirtualSize - FirstHdr->SizeOfRawData > codeLength)
                {
                        codeRVA = FirstHdr->Misc.VirtualSize + FirstHdr->VirtualAddress;
                        codeOffset = FirstHdr->Misc.VirtualSize + FirstHdr->PointerToRawData;
                        FirstHdr->Characteristics = 0xc0000040;
                        MoveMemory((char*)pMem + codeOffset,newcode,codeLength);
                        (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint = codeRVA;

                        break;
                }

这样改后还是不行
2007-8-17 22:38
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
都来看看帮帮忙
2007-8-20 18:46
0
游客
登录 | 注册 方可回帖
返回
//