基本知识

1、#pragma section,建立一个section。下例中,ATL是section名,_a是section中的的段名,段默认大小为104H,另外默认段内数据初始化为0。意即一个section可以包含多个名字不同的段。不懂section的请查阅PE文件结构。

巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立

2、合并两个Section

巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立

3、allocate将指定的变量放在指定的section中的指定的段中。

巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立

4、VC编译器属性,假设定义了同一section的三个段,ATL$_a、ATL$_b、ATL$_c,则这三个段在section内会按名称顺序依次排列。

巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立

ATL OBJ_MAP 的建立

巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立

根据【基本知识】,很容易分析出,上文定义了一个ATL section,然后在其中定义了三个段,__a、__z、__m。

为什么要这么做呢?

ATL将一个指针放在__a段,那么取其地址&__pobjMapEntryFirst表示的就是__a段的起始地址。

ATL将一人指针放在__z段,那么取其地址&__pobjMapEntryLast表示的就是__z段的起始地址。

最后,ATL将所有OBJ_MAP_ITEM的数据放在__m段中。

那么,做了以上这么多事之后呢?我们怎样获取和遍历对象数组?

其实答案已经出来了,上面分析了,我们有了起始指针__pobjMapEntryFirst,我们有了结尾指针__pobjMapEntryLast,而根据【基本知识】,__m段夹在这两个指针之间,所以我们只要从起始指针遍历到结尾指针就能获取到所有的对象了。

ok,剖析OVER,最后感叹一下,牛B轰轰的ATL!

相关文章:

  • 2021-06-17
  • 2021-12-12
  • 2021-08-04
  • 2021-05-27
  • 2022-12-23
  • 2021-04-07
  • 2022-12-23
猜你喜欢
  • 2022-01-19
  • 2021-05-18
  • 2021-08-19
  • 2021-09-13
  • 2022-12-23
  • 2022-01-05
  • 2021-12-10
相关资源
相似解决方案