首页
社区
课程
招聘
[原创]PC-Guard 4.03的脱壳
发表于: 2005-11-9 11:27 7688
举报

[原创]PC-Guard 4.03的脱壳

2005-11-9 11:27
7688
虚拟声卡仪器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的壳的教程写点出来让大家学习学习。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 303
活跃值: (476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持下
2005-11-9 11:54
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
Good!!
2005-11-9 19:29
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
天天向上
2005-11-9 21:58
0
游客
返回
//