虚拟声卡仪器1.1版PC-Guard的脱壳
这是我学习脱壳的一些过程,有些地方还是没有弄明白,有错误请大家多多包涵。
该程序用于在PC机上利用声卡虚拟音频范围内的信号发生器和示波器。有使用7天的期限,7天范围内没有任何功能限制,7天后要注册。官方下载地址
http://w3.virtins.com/
首先用PEid查壳,提示为“PC-Guard 4.03 - 4.15 -> Blagoje Ceklic”。如果软件到期就被PC-Guard壳保护了,所以首先应当把程序过期的“标记”清除,让程序能顺利运行,才能找到脱壳后的入口点。这个过程就不详叙了,我用Regmon和Filemon找到的标记:只要删除C:\Virtins.lic文件(只读、隐藏)和清除注册表里HKCU\Software\Microsoft\MSDAIPP\Provider\{050F5575-F2AE8FAA-A1C068FA}下的键值就能恢复程序再次使用7天。
好,一切准备就绪。用OD载入CScins.exe,一看,哇噻,全是花指令,头都大了。没关系,使用内存大法,用Alt+M切换到内存映射,在code段,地址为00401000处按右键设置内存访问断点,按F9运行,中断在
0049E181 281F sub byte ptr ds:[edi],bl ;中断在这里
0049E183 50 push eax
0049E184 8B85 A54E4100 mov eax,dword ptr ss:[ebp+414EA5]
0049E18A 3207 xor al,byte ptr ds:[edi]
0049E18C D1C0 rol eax,1
0049E18E 8985 A54E4100 mov dword ptr ss:[ebp+414EA5],eax
0049E194 58 pop eax
0049E195 47 inc edi
0049E196 59 pop ecx
0049E197 ^ E2 AC loopd short CScins.0049E145
0049E199 C3 retn ;在这里设置断点
然后在0049E199处按F2设置断点,继续运行前先清除内存断点。再按F9、F9、F9运行3次,打开运行跟踪,设置条件为:命令计数是9756时中断(这是经过实验的结果),按Ctrl+F11,中断在
0049E5FF F1 int1
0049E600 EB 01 jmp short CScins.0049E603
0049E602 89F7 mov edi,esi
0049E604 F7EB imul ebx
0049E606 01E3 add ebx,esp
0049E608 EB 01 jmp short CScins.0049E60B
0049E60A D4 EB aam 0EB
0049E60C 9B wait
下面的全是花指令。再按2次F7变为
0049E603 F7F7 div edi
再按F7上面将产生除0异常。程序马上跳到ntdll领空。连续按Ctrl+F9,F8几次,来到Kernel32领空到下面的代码时停止
7C801DA4 5E pop esi
7C801DA5 5B pop ebx
7C801DA6 5D pop ebp
7C801DA7 C2 0400 retn 4
查看堆栈窗口显示为
0012FF0C F5A0C749
0012FF10 0047E060 ASCII "WINMM.dll"
0012FF14 00000000
0012FF18 0047DF8A ASCII "waveOutUnprepareHeader"
0012FF1C 0008952C
0012FF20 00000000
0012FF24 0049EC51 返回到 CScins.0049EC51
0012FF28 0047E060 ASCII "WINMM.dll"
栈顶的数据为F5A0C749按F7返回后将产生无法访问内存的错误!Code窗口一片空白,按按F7运行,提示“内存F5A0C749是不易读取的!”,跟踪失败!
别灰心,此法不通另辟蹊径。按Ctrl+F2重新运行程序,照前面说的先在00401000处设置内存断点,中断后再在0049E199处设置断点,清除内存断点,按F9、F9、F9,好,在代码窗口按Ctrl+G打开跟随地址,输入00401000,代码窗口即转到此。
此前经过分析该程序用Visual C++ 6.0编写,于是找入口关键机器码558BEC6AFF68,Ctrl+B打开二进制字符搜索窗口,在HEX输入以上机器码,来到00404570分析代码不象入口代码,按Ctrl+L继续搜索下一处,共搜索20次后来到
00435FB8 /. 55 push ebp ; 真正的入口处
00435FB9 |. 8BEC mov ebp,esp
00435FBB |. 6A FF push -1
00435FBD |. 68 303E4700 push CScins.00473E30
00435FC2 |. 68 B4B84300 push CScins.0043B8B4 ; SE 句柄安装
00435FC7 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
00435FCD |. 50 push eax
00435FCE |. 64:8925 00000>mov dword ptr fs:[0],esp
00435FD5 |. 83EC 58 sub esp,58
00435FD8 |. 53 push ebx
00435FD9 |. 56 push esi
00435FDA |. 57 push edi
00435FDB |. 8965 E8 mov dword ptr ss:[ebp-18],esp
00435FDE |. FF15 4CC24600 call dword ptr ds:[46C24C] ; kernel32.GetVersion
00435FE4 |. 33D2 xor edx,edx
00435FE6 |. 8AD4 mov dl,ah
00435FE8 |. 8915 345B4800 mov dword ptr ds:[485B34],edx
00435FEE |. 8BC8 mov ecx,eax
00435FF0 |. 81E1 FF000000 and ecx,0FF
00435FF6 |. 890D 305B4800 mov dword ptr ds:[485B30],ecx
00435FFC |. C1E1 08 shl ecx,8
00435FFF |. 03CA add ecx,edx
00436001 |. 890D 2C5B4800 mov dword ptr ds:[485B2C],ecx
00436007 |. C1E8 10 shr eax,10
0043600A |. A3 285B4800 mov dword ptr ds:[485B28],eax
0043600F |. 6A 01 push 1
00436011 |. E8 F1610000 call CScins.0043C207
00436016 |. 59 pop ecx
00436017 |. 85C0 test eax,eax
00436019 |. 75 08 jnz short CScins.00436023
0043601B |. 6A 1C push 1C
0043601D |. E8 C3000000 call CScins.004360E5
00436022 |. 59 pop ecx
00436023 |> E8 E4280000 call CScins.0043890C
00436028 |. 85C0 test eax,eax
0043602A |. 75 08 jnz short CScins.00436034
0043602C |. 6A 10 push 10
0043602E |. E8 B2000000 call CScins.004360E5
00436033 |. 59 pop ecx
00436034 |> 33F6 xor esi,esi
00436036 |. 8975 FC mov dword ptr ss:[ebp-4],esi
00436039 |. E8 0D600000 call CScins.0043C04B
0043603E |. FF15 08C24600 call dword ptr ds:[46C208] ; [GetCommandLineA
00436044 |. A3 58724800 mov dword ptr ds:[487258],eax
00436049 |. E8 CB5E0000 call CScins.0043BF19
0043604E |. A3 185B4800 mov dword ptr ds:[485B18],eax
00436053 |. E8 745C0000 call CScins.0043BCCC
00436058 |. E8 B65B0000 call CScins.0043BC13
0043605D |. E8 E7110000 call CScins.00437249
00436062 |. 8975 D0 mov dword ptr ss:[ebp-30],esi
00436065 |. 8D45 A4 lea eax,dword ptr ss:[ebp-5C]
00436068 |. 50 push eax ; /pStartupinfo
00436069 |. FF15 68C24600 call dword ptr ds:[46C268] ; \GetStartupInfoA
0043606F |. E8 475B0000 call CScins.0043BBBB
00436074 |. 8945 9C mov dword ptr ss:[ebp-64],eax
00436077 |. F645 D0 01 test byte ptr ss:[ebp-30],1
0043607B |. 74 06 je short CScins.00436083
0043607D |. 0FB745 D4 movzx eax,word ptr ss:[ebp-2C]
00436081 |. EB 03 jmp short CScins.00436086
00436083 |> 6A 0A push 0A
00436085 |. 58 pop eax
00436086 |> 50 push eax
00436087 |. FF75 9C push dword ptr ss:[ebp-64]
0043608A |. 56 push esi
0043608B |. 56 push esi ; /pModule
0043608C |. FF15 30C24600 call dword ptr ds:[46C230] ; \GetModuleHandleA
00436092 |. 50 push eax
00436093 |. E8 2FF70000 call CScins.004457C7
00436098 |. 8945 A0 mov dword ptr ss:[ebp-60],eax
0043609B |. 50 push eax
0043609C |. E8 D5110000 call CScins.00437276
004360A1 |. 8B45 EC mov eax,dword ptr ss:[ebp-14]
004360A4 |. 8B08 mov ecx,dword ptr ds:[eax]
004360A6 |. 8B09 mov ecx,dword ptr ds:[ecx]
004360A8 |. 894D 98 mov dword ptr ss:[ebp-68],ecx
004360AB |. 50 push eax
004360AC |. 51 push ecx
004360AD |. E8 91590000 call CScins.0043BA43
004360B2 |. 59 pop ecx
004360B3 |. 59 pop ecx
004360B4 \. C3 retn
将断点设置在00435FB8处,按F9,用插件里的OllyDump脱壳在当前调试的进程,再启动Import REConstructor v1.6 FINAL,找到我们正在调试的进程,在OEP里面输入我们找到的入口地址00435FB8-00400000=00035fb8,按IAT自动搜索,提示发现原始的IAT地址,确定后,按获得输入表按钮,找到所有的输入函数表,再按修理Dump找到我们刚才脱壳的文件,修复OK!
注意的是如果用LordPE脱壳,再用ImportREC修复将不能正常执行。
脱壳后的文件不再受日期限制。
以上只是我的一些操作过程,因为花指令太多,并且不能修改代码为NOP(因为有些地方指令要交叉复用),所以只能采用这些肤浅的办法脱壳,并没有深入分析。希望大家把脱PC Guard的壳的教程写点出来让大家学习学习。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!