IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT问题

  IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT问题
今天读取了ws2_32.dll的PE格式
在读取到image_nt_header32.OptionalHeader.DataDirectory[11]时
也就是IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT数据目录

看下面数据目录 
      Name            RVA                   SIZE
1    Export           $1404                $11ED
2    Import           $125E8              $78
3    Resource     $15000               $3F8
4    Exception     $0                       $0
5    Security        $0                      $0
6    Base Reloc  $16000               $DC8
7    Debug          $130F4              $38
8    Copyright     $0                      $0
9    Global Ptr    $0                       $0
10  TLS             $0                       $0
11  Load Config  $BC90  $40
12  Bound Import $288  $74
13  IAT    $1000  $1D4
14  COM    $12528  $40
15  Delay Import $0   $0
16  (reserved)  $0   $0

再看一下节表
 Name VSize  VAddress
1 .text $12153 $1000 $12200 $400 $0 $0 0 0 $60000020 CER
2 .data $914 $14000 $A00 $12600 $0 $0 0 0 $C0000040 IRW
3 .rsrc $3F8 $15000 $400 $13000 $0 $0 0 0 $40000040 IR
4 .reloc $DC8 $16000 $E00 $13400 $0 $0 0 0 $42000040 IDR
 VirtualAddress 0x00000288

image_nt_header32.OptionalHeader.DataDirectory[11].VirtualAddress是0x00000288
image_nt_header32.OptionalHeader.DataDirectory[11].Size是0x00000074

但是看各个节的VAddress 好像都大于0x00000288 (最小的就是.text $1000)
那请问我应该怎样找到image_nt_header32.OptionalHeader.DataDirectory[11].VirtualAddress所指向的内容呢?

 

http://blog.csdn.net/cay22/article/details/7234258 

(关于IAT解析中有对IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT的说明)

 

看一些问答
http://bbs.pediy.com/showthread.php?t=90795
--------------------------------------------------------------------------------
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT这个是做什么用的,我在exe中将这条信息摸掉,
包括这个地址目标位置信息摸掉也能运行,那么它起什么作用呢?另外在PE变形中,也经常吧它清0,这个是为什么呢?
--------------------------------------------------------------------------------
bound import。当PE装载器装入PE文件时,检查引入表并将相关DLLs映射到进程地址空间。然后象我们这样遍历IMAGE_THUNK_DATA 数组并用引入函数的真实地址替换IMAGE_THUNK_DATAs 值。这一步需要很多时间。如果程序员能事先正确预测函数地址,PE装载器就不用每次装入PE文件时都去修正IMAGE_THUNK_DATAs 值了。Bound import就是这种思想的产物。为了方便实现,Microsoft出品的类似Visual Studio的编译器多提供了bind.exe这样的工具,由它检查PE文件的引入表并用引入函数的真实地址替换IMAGE_THUNK_DATA 值。当文件装入时,PE装载器必定检查地址的有效性,如果DLL版本不同于PE文件存放的相关信息,或则DLLs需要重定位,那么装载器认为原先计算的地址是无效的,它必定遍历OriginalFirstThunk指向的数组以获取引入函数新地址。

http://blog.csdn.net/qq276592716/article/details/6956027
(PE区段添加编写中的一点心得~ .)
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size=0;
pNTHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress=0;
上面这两行是平常在其他加区段的代码中不常见的,比如zapline的添加区段代码。如果没有上面这两句,那么对一些有bound iat的程序加壳后不能运行。
原因是IMAGE_BOUND_IMPORT_DESCTIPTOR结构中的OffsetModuleName变量存放的是与第一个IBID结构之间的偏移(不是RVA)。当你加了个新区段后,这个偏
移改变了,所以加壳就失败了~~

http://hi.baidu.com/viruswizard/blog/item/440d20816fb986de9023d964.html
/*添加节的代码,By VirusWizard
以前写过加节的,当初写的代码死活无法给Windows自带的记事本加节。
原因是最后一个节后面的空间不足。但是发现不少壳能给记事本加节,而且位置不变。
于是今天用AsPack做了头部的二进制比较,结果发现,SectionHeaders后面原来是IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT。
这些数据没啥用,抹掉用来加节。呵呵。这样能加的节的个数应该很多,直到第一个Section的RAW为止。
*/
BOOL CLkPackDlg::AddSection(PIMAGE_NT_HEADERS pNtHdrs,DWORD dwRawSize)
{
        PIMAGE_SECTION_HEADER pNewSec = NULL;
        PIMAGE_SECTION_HEADER pSec = IMAGE_FIRST_SECTION(pNtHdrs);
        PIMAGE_SECTION_HEADER pLastSec = NULL;

        DWORD dwNewSecAlign;
        DWORD dwNewFileAlign;

        //
        pNewSec = (PIMAGE_SECTION_HEADER)
                 ( (DWORD)pSec + pNtHdrs->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER) );

        pLastSec = (PIMAGE_SECTION_HEADER)
                 ( (DWORD)pNewSec - sizeof(IMAGE_SECTION_HEADER) );

        dwNewSecAlign = AlignSize(
                pLastSec->VirtualAddress + pLastSec->Misc.VirtualSize,
                pNtHdrs->OptionalHeader.SectionAlignment
                );
        dprintf(L"dwNewSecAlign : 0x%08X.\n",dwNewSecAlign);

        dwNewFileAlign = AlignSize(
                pLastSec->PointerToRawData + pLastSec->SizeOfRawData,
                pNtHdrs->OptionalHeader.FileAlignment
                );
        dprintf(L"dwNewFileAlign : 0x%08X.\n",dwNewFileAlign);

        //modify SizeOfImage
        pNtHdrs->OptionalHeader.SizeOfImage += AlignSize(
                dwRawSize, pNtHdrs->OptionalHeader.SectionAlignment );

        memcpy(pNewSec->Name,".VirWizd",8);
        pNewSec->VirtualAddress = dwNewSecAlign;
        pNewSec->Misc.VirtualSize = dwRawSize;
        pNewSec->PointerToRawData = dwNewFileAlign;
        pNewSec->Characteristics =
                IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_WRITE;

        pNewSec->SizeOfRawData = AlignSize(
                dwRawSize,
                pNtHdrs->OptionalHeader.FileAlignment
                );
        pNtHdrs->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
        pNtHdrs->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
        pNtHdrs->FileHeader.NumberOfSections++;
        return TRUE;
}

DWORD CLkPackDlg::AlignSize(DWORD nSize, DWORD nAlign)
{
        return ( (nSize + nAlign - 1) / nAlign * nAlign );
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值