欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[分享] 爱琴海CrackMe 第三道题的程序快速解密

[分享] 爱琴海CrackMe 第三道题的程序快速解密

虽然没有做出来,也阻止不了我来分享。

看了其他几位大牛的writeup,很多反调试手段并没有特别指明。

可以参考风间仁的writeup,对反调试处理过程较为详细。http://bbs.pediy.com/thread-218241.htm

这道程序是使用VB语言写的,然后作者使用手工汇编对程序增加了几个反调试的处理。所幸的是只是做了VB程序入口前的反调试。

第一个反调试,修改程序入口

作者将程序入口修改为0x0,意味着在程序入口(EIP)在基址0x00400000处,在0x00400000处的汇编指令发现会跳转到0x00401090。

HEADER:00400000                 dec     ebp

HEADER:00400001                 pop     edx

HEADER:00400002                 push    edx

HEADER:00400003                 inc     ebp

HEADER:00400004                 push    401090h

HEADER:00400009                 retn

第二个反调试(不太合适),VB程序入口变形

VB程序的入口就是将程序控制权交给MSVBxx.dll,这个入口就是ThunRTMain。而在到达这个入口前,作者大量使用push +retn指令,使用非正常手段来控制程序流程。


第三个反调试 堆栈段寄存器

从.text:00408EC0 开始,利用pop SS + pushf + pop edi,判断TF标志,进行流程控制。

具体解释可以搜索加粗关键字


第四个反调试 OEP 程序入口

004088F4    B8 26FFBFFF     mov     eax, FFBFFF26

00408908    F7D0            not     eax

00408911    8B00            mov     eax, dword ptr [eax] 

004088DF    A3 E5884000     mov     dword ptr [4088E5], eax

004088E4   /E9 57000000     jmp     00408940

mov eax, dword ptr [eax],恰好是程序入口的第二个字节,如果没有修改程序入口地址,那么 eax=0,否则是10H,

再通过mov [4088E5],eax 隐秘地修改跳转指令的偏移。


第五个反调试 IsDebuggerPresent

这个比较常见,不叙述了


第六个反调试 修改VB程序的指令

我想说,这个无语。修改了三个加法指令,并互调两个VB全局变量


做完题目后,我萌生了一个想法,对这个程序脱壳,还原它的本来面目。

VB程序的入口在 jmp ThunRTMain,在到达这个入口前,程序已经被还原成了作者未加壳前的样子。

可以对程序进行patch,修改jmp ThunRTMain,为 

.text:00401088 loc_401088:                             ; CODE XREF: .text:loc_401088j

.text:00401088                 jmp     short loc_401088

对应指令为 0EBH 0FEH。当启动程序时,便会卡在这里。

然后使用OD加载,然后在dump,最后修改OEP为0x00001090,再还原修改的指令为jump ThunRTMain

完毕,可以流畅运行。

最后使用VB decompiler逆向出算法。(from 风间仁)

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功