首页 > 其他分享 >软件加壳输入表处理-解析

软件加壳输入表处理-解析

时间:2023-04-03 17:35:29浏览次数:44  
标签:函数 THUNK OriginalFirstThunk IMAGE 表处理 加壳 DWORD 解析 DATA


本篇博文说下PE文件中输入表的格式和具体的使用,以及在软件加壳中的注意事项(本人菜鸟),高手飘过

IMAGE_IMPORT_DESCRIPTOR STRUC
{
     union
       Characteristics DWORD
      OriginalFirstThunk  DWORD
     ends
    TimeDateStamp DWORD 
     ForwardChain  DWORD
    Name DWORD //指向输入Dll的文件名称
    FirstThunk   DWORD
}

这里我们只说明OriginalFirstThunk和FirstThunk两个比较重要的项,这两者的相同之处在于指向同一种数据结构

IMAGE_THUNK_DATA STRUC
{
      union u1
       ForwarderString  DWORD
       Function                DWORD
      Ordinal                   DWORD
      AddressOfData    DWORD
      ends
}

OriginalFirstThunk指向的IMAGE_THUNK_DATA中AddressOfData是具有用处的,(虽然IMAGE_THUNK_DATA在一个时间内只有一个是有作用的但为了便于理解)

并且AddressOfData指向的是另一种数据结构

IMAGE_IMPORT_BY_NAME

{

Hint    WORD

Name  BYTE

},这两项都有作用,Hint表示的是本函数在其所驻留dll的输出函数的序号,Name则是指向了,输入函数的名称(其实在程序中序号要比名称更为方便,但是不便于理解)

由OriginalFirstThunk指向的IMAGE_IMPORT_BY_NAME是单独的一项,不可改写,但是由FirstThunk指向的IMAGE_THUNK_DATA却是可以改写的

他们是这样使用的PE装载器首先查找OriginalFirstThunk,如果他不为空,则加载程序,迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BY_NAME,利用LoadLibrary和

GetProcess获取函数真正的入口地址,放在由FirstThunk指向的IMAGE_THUNK_DATA中的Function元素中即可

有些情况下函数是不能用函数名来调用的,只能使用函数序号,这时候IMAGE_THUNK_DATA的低位指示函数序号(因为在dll中输出函数序号数组元素是以字为单位的)

另外一种情况:程序的OriginalFirstThunk是0,在初始化时,则使用FirstThunk当做OriginalFirstThunk来使用,获得函数地址时,将函数的地址装入IMAGE_THUNK_DATA指

向的Function即可

PS:综上所述,函数地址都被填入了FirstThunk指向的IMAGE_THUNK_DATA指向的Function元素。这样我们在给软件加壳时,将动态获取的函数地址的存放地便都清楚了,现

在只有一个问题,如何获得所有的输入函数的个数?

1.可首先检测OriginalFirstThunk是否为0,

       如果是0,则使用FirstThunk代替OriginalFirstThunk获得IMAGE_THUNK_DATA,

       如果不是0,则使用OriginalFirstThunk获得IMAGE_THUNK_DATA

 2.现在已经获得了IMAGE_THUNK_DATA的RVA,检测输入表函数是根据函数名还是根据函数序号

      使用IMAGE_SNAP_BY_ORDINAL32(pFirstThunk->u1.Ordinal)来确定是否使用了函数序号

在清除输入表时我们一般会

1.先擦除IMage_import_descriptor指向的Name,即dll名称字符串

2.在查找每个dll中使用的输入函数时,会擦除IMAGE_THUNK_DATA指向的AddressOfData

并且擦除IMAGE_IMPORT_BY_NAME的整个数据结构

3.在外层循环,利用查找Dll加载项的指针,最后擦除IMAGE_IMPORT_DESCRIPTOR

标签:函数,THUNK,OriginalFirstThunk,IMAGE,表处理,加壳,DWORD,解析,DATA
From: https://blog.51cto.com/u_15995156/6166931

相关文章

  • FastThreadLocal源码解析
    Netty为什么要用自己的FastThreadLocal?threadLocalHash冲突,检索时间长。Netty自己定义的fastThreadLocal用的是数组,直接数组下标检索快。下面以ftl作为FastThreadLocal的简称例子ftl只有在FastThreadLocalThread线程中运行才生效,不然会走SlowGet模式(jdkthreadLocal方式)publiccl......
  • RocketMQ NameServer启动流程解析
    具体分析可参考Gitee项目NameServer解析部分=》代码地址什么是NameServer简易Topic路由注册中心,用于支持Broker的服务注册与发现。类似Dubbo的zookeeper主要能力Broker集群管理:管理Broker集群注册信息,心跳检测broker存活路由信息管理:保存Broker集群路由信息,然后producer、consumer......
  • 实现一个函数用来解析 URL 的 querystring
    实现如下效果consturl="https://xxxx.com?a=3&b=4&c=5&name=1+1=2";//解析后得到qs如下constqs={a:3,b:4,c:5,name:'1+1=2'};纯碎使用 javascript 完成解析函数,而不利用浏览器DOM特性API,代码如下所示,细节在注释中体现functionparse(url......
  • 详细解析Java异步线程处理队列任务工具类以及实战
    场景待入快速理解小场景描述:【一群人】来到【一个大厅】办理业务,大厅中有【多个窗口】给我们办理业务。每个人都有自己要办事情,处理过程需要消耗时间。大厅根据人群多少,开始窗口梳理。如果把“一群人”理解成一群待处理的n个【任务】,把这群人排成一个长队就形成了一个【任......
  • Mybatis配置文件解析(转载)
    流程图demo案例还是从案例开始。publicstaticvoidmain(String[]args){Stringresource="mybatis-config.xml";InputStreaminputStream=null;SqlSessionsqlSession=null;try{inputStream=Resources.getResourceAsStream(resourc......
  • 软考高项第4版教程-差异点解析来啦(第5章下)!
    第5章信息系统工程,我拆分成2篇来解析第4版教程的差异重点,上篇解析了“软件工程”和“数据工程”知识块,这次带来下篇:“系统集成”和“安全工程”知识块。“信息系统工程”文字版“系统集成”讲了4部分知识点,分别是网络集成、数据集成、软件集成和应用集成。1.系统集成4个基本原则在......
  • Thrift 格式解析
    Thrift格式解析https://www.cnblogs.com/Forever-Kenlen-Ja/p/9649724.html常用数据格式包括CSVJSONXML,这些格式有缺点:CSV没有指定数据类型,如可能将数字开头的字符串无认为数字使用文本存储会浪费空间JSONXML注重可读,提高程序员效率,但数据存储传输效率不高,尤其大数......
  • 时间日期解析配置
    @ConfigurationpublicclassLocalDateTimeConfig{/**序列化内容*LocalDateTime->String*服务端返回给客户端内容**/@BeanpublicLocalDateTimeSerializerlocalDateTimeSerializer(){returnnewLocalDateTimeSeria......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态的限......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态......