朋友问如何脱Execryptor 2.1.3,无奈现在没多少时间,勉强搞定了如何跳过Execryptor的反OD部分,现在把方法说说,并说说我在跟踪时发现的一些tips,以供后来的朋友参考,废话少说,进入正题
由于Execryptor使用了tls,也就是说在进入EP(Entry Point,程序入口点)前会先执行两个call,其反调试就是在这两个call里实现的
下面的步骤是我总结的比较简单的方法,具体探索过程就比较繁复了,应此只适合于2.1.3版本
1.打开OD(最好是修改版的,如fly版的OD),修改选项使得OD载入程序后在系统入口点处断下,载入目标程序
2.选择忽略单步异常,然后在0063C6B7下断,F9
2+.如果是原版OD,停下后就要在FindWindowA处下断,Ctrl+F9执行到retn,然后改eax值为0
3.之后在EnumWindows入口处下硬件执行断点,Go
4.停下后栈空间应该如下
0012F980 0052D3E4 /CALL to EnumWindows from EXECrypt.0052D3DF
0012F984 0055180F |Callback = EXECrypt.0055180F <-----这里
0012F988 00000000 \lParam = 0
在005180F处下断点,这里是回调函数,F9 Go
5.停下后栈里会这样
0012F944 77CDAA3B RETURN to user32.77CDAA3B <-----返回处
0012F948 00010066
0012F94C 00000000
到77CDAA3B处下断 Go
6.一般来说不会第一个就找到修改版的OD吧,如果找到了....(此处省略1000字,只说说Execryptor杀OD的方法,就是向他发送(SendMessageA)WM_CLOSE消息,之后还会DebugActiveProcess之流).命不太衰的话会在77CDAA3B处停下.
7.改此时的eax值为0.(你的eax本来就是0?? 你真的是在用windows吗??)
8.之后就是想办法小心的跳到EP(有必要吗??),反正到现在如果忽略剩下所有碰到的异常,如果运气好的话(我运气不错^_^)就能正常在OD中跑起Execryptor了
------------------------------------------------------------------
Now,下面就是我的一些猜想,欢迎批评指正
Execryptor的tls有两个call
第一个call是解压用的,反正是没有反调试,我只看见了不停的解压,以及修复跳转偏移(LZ标准压缩方法??似乎看到一眼LZ...啥的,呵呵,没时间看了)
第二个call是自校验(_lopen, _lread, _lclose),反OD,Regmon,filemon的(似乎就是这些了). 值得注意的是程序里配置了反编译引擎,会对需要执行的API进行扫描,检测代码是否连接完整,你如果用了INT3的话,无论在什么地方(+1,+2...),都很容易被查出来.所以还是用硬件断点或者内存访问断点,^_^
Execryptor自己搞了个"GetProcAddress",用的方法是将API的名字经过一个特定的编码(方法没细分析.-_-!),然后将值和一个选定的值比较,一样就表示找到正确的API了(和我以前分析的唯一的一个病毒用的方法类似,所以有些亲切感,*^_^*)
程序里大量用了如下的花指令
call AA
...
AA:
xchg [esp], eax
pop eax
而且整个壳几乎是东写一些,西写一些,执行时就到处乱跳,有时候都会跨段跳转,所以没有十足的把握,不要轻易用F8,否则会不知道跟到什么鬼地方了
废话就说到这了,所有上面这些应该只是冰山的一角吧,下面的脱壳工作也许更加艰巨和漫长,Good Luck to all~~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)