notepad_upx第一个节区的RawDataSize为0,即第一个节区在磁盘文件中是不存在的,但是其Virtual Size值为0xF000,意味着,UPX压缩后的PE文件在运行瞬间将压缩的代码解压到(内存中的)第一个节区。
notepad_upx的EP,第一个节区的起始地址0x01001000,存入edi,第二个节区的起始地址0x01010000,存入esi。
把esi中的字节写入edi中,这里有个大循环,直到把该写的数据写完。然后跳出来到了pop esi处。
又有一个循环,判断第一个节区中的数据减去0xE8后是不是小于等于1,也就是判断数据是否为0xE8/0xE9(call/jmp),找到之后还要判断数据后面的那个数据是否为0x1。(ja,大于跳)如果是0x1就执行下面这段代码,恢复call/jmp的地址。
设置IAT。用GetProcAddress获取函数地址,然后将函数地址存储到EBX寄存器所指的原notepad.exe的IAT区域。
下图为EDI所指的第二个节区。
下图为第一节区
IAT设置好之后会跳到下图断点所在的地方。
往下单步执行几步就到了跳去OEP的地方。
真正的OEP