UPack调试

  1. Ollydbg运行错误
  • 由于Upack会将IMAGE_OPTIONAL_HEADER中的NumberOfRvaAndSizes值设置为A,所以使用OllyDbg打开notepad_upack.exe文件时,初始检查过程中会弹出错误消息对话框:
    UPack调试
  • 按确认按钮关闭对话框,上面这个错误导致OllyDbg无法转到EP位置,停留在ntdll.dl区域:
    UPack调试
  • 该现象是由OllyDbg的Bug引起的,所以需要强制设置EP,首先要查找EP位于何处,下面使用Stud_PE查找EP的虚拟地址。
    UPack调试
  • ImageBase为01000000,EP的RVA为1018,经过计算可知EP的VA值为01001018,在OllyDbg的代码窗口总转到01001018处,使用New origin here命令强制更改EIP寄存器中的值:
    UPack调试
  1. 解码循环
  • UPack把压缩后的数据放到第二个节区,在运行解码循环将这些数据压缩后放到第一个节区,从EP代码开始调试:
    UPack调试
  • 前两条指令用于从010011B0地址读取4个字节,然后保存到EAX,EAX拥有值0100739D,它时原本notepad的OEP,(分析一下LODS DWORD PTR DS:[ESI]指令可知,该指令从ESI所指的地址处读取4字节存储到EAX寄存器),如果事先知道该值时OEP,那么可以直接设置硬件断点,再按F9键运行,就会在OEP处暂停。
  • 经过一阵调试后,会出现下图所示代码:
    UPack调试
  • 此时ESI地址指向的值为0101FCCB,该地址就是decode()函数的地址,后面会反复调用执行该函数,接下里略微看一下decode()函数:
    UPack调试
  • 继续调试,会看到如下代码:
    UPack调试
  • 0101FE57与0101FE5D地址处有“向EDI所指位置写入内容”的指令,此时EDI值指向第一个节区的地址,也就是说,这些命令会先执行解压缩,然后写入实际内存,在0101FE5E与0101FE61地址处通过CMP/JB指令继续执行循环,知道EDI的值为01014B5A([ESI+34]=01014B5A),地址0101FE61即使解码循环的结束部分,反复执行时跟踪,可以随时看到向EDI所指地址写入了什么值。
  1. 设置IAT
  • 一般而言,压缩器执行完解码循环后会根据原文件重新阻止IAT,UPack也有类似过程:
    UPack调试
  • UPack会使用导入的2个函数(LoadLibraryA与GetProcAddress)边执行循环边构建原本的notepad的IAT(先获取notepad中导入函数的实际内存地址,再写入原IAT区域),该过程结束后,有0101FEAF地址处的RETN命令将运行转到OEP处。
    UPack调试