题目:解决载入(打开)加壳程序后,OD关闭退出的问题
编写:Coderui
博客:http://hi.baidu.com/coderui
环境:Win XP-SP3,Ollydbg 1.10 cao_cong汉化第二版
关键字:脱壳;OD自动关闭;关闭OD;OD退出;载入后OD自动退出;打开后OD自动退出;
问题:
“VMProtect”这个壳加密过的程序不能够使用OD(没加载反反调试插件)直接打开调试。原因是在使用OD打开时(还没有开始调试的情况下),OD会马上关闭退出,并且不会出现任何异常提示。
解决:
昨天找了个时间研究了下这个加壳后的病毒程序样本(exe和dll版),通过多次尝试,发现了一个快速、简单的解决方法,在这里和大家分享下。
在使用OD调试样本前,我们需要先手动去修改一下这个PE程序“导出表”中的“函数名数目”值。方法:使用“LordPE”打开要编辑的PE程序,然后依次选择[目录]->[导出表对应的“..”按钮],把“函数名数目”的值减1,并点击“保存”按钮,这样就OK了。为了好看些,您也可以把“函数数目”和“函数名数目”的值都同时减1并保存,效果一样。EXE和DLL版的程序都可以使用上述方法去解决这个问题,经过测试方法有效。
解释:
一般情况下EXE不会加“导出表”,如果加了,就应该给出所导出的API函数。当我们打开加这个壳后的PE程序(EXE版)时,您会发现它存在“导出表”,但“导出表”中并没有导出的API函数。同时“函数数目”和“函数名数目”的值都比原PE程序设置的值大了1(如:EXE版“导出表”列表中显示了0个导出的API函数,壳将其“函数数目”和“函数名数目”的值都设置成了1;DLL版“导出表”列表中显示了0xD个导出的API函数,壳将其“函数数目”和“函数名数目”的值都设置成了0xE。)。所以我们将其减1,就OK了。被修改过的PE程序,可以正常运行,不会有任何影响。
现在使用OD打开那个被我们修改过的加壳程序,OD就不会自动关闭退出了。这个壳内部还有很多反调试手段,极难搞(目前估计我还搞不定),呵呵!
壳检测出自己正在被调试时,会弹出如下提示信息(点“击确”定后退出):
------------------------------------------------------
C:/Documents and Settings/coderui/桌面/090316-A-0.exe
---------------------------
A debugger has been found running in your system.Please, unload it from memory and restart your program.
---------------------------
确定
------------------------------------------------------
壳的入口代码如下(EXE版,第一个CALL进去以后,是一个向上的JMP。):
0044CB28 > 68 4EC42D0B PUSH 0B2DC44E
0044CB2D E8 E15E0000 CALL 090316-A.00452A13
0044CB32 68 4EE47306 PUSH 673E44E
0044CB37 E8 A75B0000 CALL 090316-A.004526E3
0044CB3C 60 PUSHAD
0044CB3D ^ 76 A6 JBE SHORT 090316-A.0044CAE5
0044CB3F 18E8 SBB AL,CH
0044CB41 A2 17000068 MOV BYTE PTR DS:[68000017],AL
0044CB46 4E DEC ESI
0044CB47 44 INC ESP
0044CB48 1E PUSH DS
0044CB49 04 E8 ADD AL,0E8
0044CB4B 14 4C ADC AL,4C
0044CB4D 0000 ADD BYTE PTR DS:[EAX],AL
0044CB4F 3F AAS
0044CB50 2F DAS
0044CB51 026CC7 04 ADD CH,BYTE PTR DS:[EDI+EAX*8+4]
0044CB55 24 7D AND AL,7D
0044CB57 7B 6E JPO SHORT 090316-A.0044CBC7
0044CB59 27 DAA
0044CB5A 01C7 ADD EDI,EAX
0044CB5C 83EC FC SUB ESP,-4
0044CB5F ^ 0F85 D5D9FDFF JNZ 090316-A.0042A53A
0044CB65 66:0FBAE0 0D BT AX,0D
0044CB6A 84F4 TEST AH,DH
0044CB6C 8B3C8F MOV EDI,DWORD PTR DS:[EDI+ECX*4]
0044CB6F 53 PUSH EBX
0044CB70 85FF TEST EDI,EDI
0044CB72 FF3424 PUSH DWORD PTR SS:[ESP]
0044CB75 E8 4CF0FFFF CALL 090316-A.0044BBC6
0044CB7A E9 7B200000 JMP 090316-A.0044EBFA
0044CB7F 68 4E844B03 PUSH 34B844E
0044CB84 E8 63320000 CALL 090316-A.0044FDEC
0044CB89 12B7 37873687 ADC DH,BYTE PTR DS:[EDI+87368737]
壳的入口代码如下(DLL,第一个CALL进去以后,是一个向上的JMP。):
009E602D > 68 96FA1F6F PUSH 6F1FFA96
009E6032 E8 A5200A00 CALL HookSys.00A880DC
009E6037 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
009E6039 60 PUSHAD
009E603A FF7424 10 PUSH DWORD PTR SS:[ESP+10]
009E603E 8B7424 30 MOV ESI,DWORD PTR SS:[ESP+30]
009E6042 66:C70424 0B41 MOV WORD PTR SS:[ESP],410B
009E6048 C70424 0395CB1B MOV DWORD PTR SS:[ESP],1BCB9503
009E604F C60424 65 MOV BYTE PTR SS:[ESP],65
009E6053 9C PUSHFD
009E6054 8D6424 38 LEA ESP,DWORD PTR SS:[ESP+38]
009E6058 ^ E9 D10DFFFF JMP HookSys.009D6E2E
009E605D 68 88FA8FFC PUSH FC8FFA88
009E6062 E8 31040A00 CALL HookSys.00A86498
009E6067 04 77 ADD AL,77
009E6069 1999 6897FA9F SBB DWORD PTR DS:[ECX+9FFA9768],EBX
009E606F 68 E85FFF09 PUSH 9FF5FE8
009E6074 00F2 ADD DL,DH
009E6076 6E OUTS DX,BYTE PTR ES:[EDI] ; I/O 命令
009E6077 93 XCHG EAX,EBX
009E6078 27 DAA
009E6079 68 9BFAAFCC PUSH CCAFFA9B
009E607E E8 51FF0900 CALL HookSys.00A85FD4
009E6083 D023 SHL BYTE PTR DS:[EBX],1
009E6085 B7 C2 MOV BH,0C2
009E6087 52 PUSH EDX
009E6088 68 EEF94FD9 PUSH D94FF9EE
009E608D E8 06040A00 CALL HookSys.00A86498