找到匹配地址后,ecx等于表项的offset,第1项为0x2a。
2) 查opcode表
用1中的到的offset查opcode数据表(007262ed):
密文opcode表:
counter表(记录每个地址的调用次数,超出0x20次将使用新的地址解码):
第1次解出的变形码:
3) 调整stack以便正确调用变形码及返回
4) 破坏解出的代码,ret到变形码
5) 执行变形码,返回到原程序
6) patch
先把解出的代码binary copy到dumped_.exe(直接copy 722416 - 7226b0的代码即可)。
关闭722579的解码(解出7225c1 - 7226b0):
关闭7226a8处对前面代码的破坏:
patch 72260c: jnz->jmp,无论执行多少次都使用同一解码地址
copy正确的imagebase值,这里为0,改72fc1f为400000
copy 正确的10 bytes key(第1 byte为0)
执行,仍然crashedl。
8. 修复replaced code (2)
还有replaced code,在这里出异常:
->
将解出的代码贴到acprotect_fixed.exe。可以看到,这些实际上是变形的call代码。第1次执行到这里,在buffer中解出的变形码为:
xor的结果:
目前的dumped_.exe,地址72ed83的值为0(这些值是loader写入的)。
406df8的变形码原来是call getkeyboardtype。原程序的call api 全部被抽掉了。壳代码的动作与前面相似,用返回地址查表,获取相应的指针,生成jmp dword ptr ds:[xxxxxxxx]指令,该地址则指向类似72124c的变形码,调用正确的api。
变形call api的返回rva地址表:
开始:
结束:
寻址变形码数组下标表(每项1字节),用于查变形码指针数组:
变形码地址表(指向变形码的指针):
发表评论