windycandy 发表于 2006-9-2 17:58:46

PEncrypt 3.1 Final手动修复函数,去自效检简单脱文

【破解作者】 windycandy
【使用工具】 OD,Peid0.94,LordPE,ImportREC F1.6
【破解平台】 WinXP
【软件名称】 winzip 9.0汉化版
【下载地址】 www.hanzify.org
【软件简介】 这个软件没有人不知道吧,此汉化版是企业注册版,本文只是将手动修复的过程写出来与大家分享,希望大家喜欢。
【加壳方式】 PEncrypt 3.1 Final -> junkcode
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】


1.前言

本软件是汉化世纪吕达嵘前辈的汉化版本,最近看到论坛有朋友写脱这个壳的教程,再写上一个简单
的手动修复无效函数及去自效检的文章做灌水。献给象我一样的菜鸟,高手则略国。

2.过程

OD 载入加壳程序

004A0D42 W> $B8 00506B00         mov eax,WINZIP32.006B5000
004A0D47    .FFD0                            call eax
004A0D49    .78 62                            js short WINZIP32.004A0DAD
004A0D4B    .2D 0000BF94            sub eax,94BF0000
004A0D50    .0000                            add byte ptr ds:,al
004A0D52    .008B C7E8A60A         add byte ptr ds:,cl
004A0D58    .0000                           add byte ptr ds:,al

用网友snetluck提供的方法
https://www.chinapyg.com/viewthread.php?tid=7068&extra=page%3D1
直接在命令行下 hr eip

F9运行,中断在

006B52A7   F3:A4                   rep movs byte ptr es:,byte ptr ds>----------中断在这里
006B52A9   59                        pop ecx
006B52AA   5F                        pop edi
006B52AB   5E                        pop esi
006B52AC   C3                        retn-------------------返回OEP

F8几下就到达OEP了

004A0D42 W> $6A 60                   push 60
004A0D44    ?68 F8634C00         push WINZIP32.004C63F8
004A0D49    .E8 622D0000         call WINZIP32.004A3AB0
004A0D4E    ?BF 94000000         mov edi,94
004A0D53    ?8BC7                        mov eax,edi
004A0D55    ?E8 A60A0000         call WINZIP32.004A1800
004A0D5A    .8965 E8                  mov dword ptr ss:,esp
004A0D5D    .8BF4                         mov esi,esp
004A0D5F    .893E                        mov dword ptr ds:,edi
004A0D61    .56                              push esi

到这里用LordPE纠正大小后dump

不关OD,直接用ImportREC F1.6填入OEP:A0D42,自动查找IAT,发现有一个无效函数
rva:000BC0E0   ptr:006B5337

Level 1无法修复,直接剪掉后修复,但是运行修复后的程序出错并退出运行。
看来这个无效函数是不能直接剪掉的。好的,让我们来寻找并修复这个函数

ctrl+F2重新载入加壳程序
先在命令行下he eip (这是为了方便找到OEP)
命令行下dd 4BC0E0 (即上面无效函数的rav+基址)
你在数据窗口看到了什么?4BC0E0上的函数是不是好好的在那里吗?

004BC0E0 >77C4889DGDI32.CreateFontIndirectA-----------------就是这个东东
004BC0E4 >77C6DC9CGDI32.UpdateColors
004BC0E8 >77C436D1GDI32.CreateCompatibleBitmap

现在有这个函数,为什么在脱壳后不能修复呢?很简单,加壳程序肯定对这个函数进行处理了
跟踪一下就知道了, let's go!!!
在数据窗口单击鼠标右键------>断点------->硬件访问断点------>Dword

F9运行程序,硬件中断

006B5223   8956 24             mov dword ptr ds:,edxGDI32.CreateFontIndirectA-------断在这里
006B5226   E8 06010000   call WINZIP32.006B5331
006B522B   8B56 75             mov edx,dword ptr ds:
006B522E   8902                   mov dword ptr ds:,eax
006B5230   8B56 28            mov edx,dword ptr ds:
006B5233   8956 75            mov dword ptr ds:,edx

F8往下走,注意数据窗口数值的变化

004BC0E0 >77C4889DGDI32.CreateFontIndirectA---------------这是原来的数值
004BC0E4 >77C6DC9CGDI32.UpdateColors
004BC0E8 >77C436D1GDI32.CreateCompatibleBitmap
004BC0EC >77C4217CGDI32.CreateSolidBrush
004BC0F0 >77C42945GDI32.IntersectClipRect

当F8到006B522E时,OD中间的窗口可以看到以下两个数值。
eax=006B5337 (WINZIP32.006B5337)
ds:=77C4889D (GDI32.CreateFontIndirectA)

当F8步过006B522E后,数据窗口的数值发生了变化

004BC0E0 >006B5337WINZIP32.006B5337----------------------原来的函数被这个数值代替了
004BC0E4 >77C6DC9CGDI32.UpdateColors
004BC0E8 >77C436D1GDI32.CreateCompatibleBitmap
004BC0EC >77C4217CGDI32.CreateSolidBrush
004BC0F0 >77C42945GDI32.IntersectClipRect

到这里,我们可以知道加壳程序在006B522E   8902            mov dword ptr ds:,eax处对函数进行处理
要避开其对函数的处理,将其NOP掉即可。

OD重新载入加壳程序,用以上方法到006B522E,将其nop掉,
F9运行(hr eip)中断
006B52A7   F3:A4                   rep movs byte ptr es:,byte ptr ds>---------中断在这里
006B52A9   59                      pop ecx
006B52AA   5F                      pop edi
006B52AB   5E                      pop esi
006B52AC   C3                      retn

然后一路F8到OEP

004A0D42 W> $6A 60               push 60
004A0D44    ?68 F8634C00         push WINZIP32.004C63F8
004A0D49    .E8 622D0000         call WINZIP32.004A3AB0
004A0D4E    ?BF 94000000         mov edi,94
004A0D53    ?8BC7                  mov eax,edi
004A0D55    ?E8 A60A0000         call WINZIP32.004A1800
004A0D5A    .8965 E8               mov dword ptr ss:,esp

现在看看用ImportREC F1.6是不是可以找到所有有效函数了?!!!

运行修复后的程序,出错了,将修复后的程序改名为脱壳前程序的名字,可以正常运行!哈哈看来这个程序有自效检。

现在来对付这个自效检:

OD载入脱壳后的程序

下bp CreateFileA断点, F9运行中断后,Alt+F9返回程序
一路F8,到以下call时弹出错误信息

00444304   |.E8 27EA0200         call dumped_.00472D30---这里出错
00444309   |.84C0                  test al,al
0044430B   |.0F84 B6010000         je dumped_.004444C7

重新载入,并来到444304,F7进入00444304 处的call,并一路F8来到

00472E63   |.E8 BB140000         call dumped_.00474323
00472E68   |.83C4 0C               add esp,0C
00472E6B   |.84C0                  test al,al
00472E6D   |.74 0A               je short dumped_.00472E79-------------------------------注意这个跳转
00472E6F   |.893D C0704E00         mov dword ptr ds:,edi
00472E75   |.B3 01               mov bl,1

脱壳后的程序在00472E6D处的跳转已经实现,而OD在入没脱壳程序跟踪到这里的跳转不实现。
将00472E6D处的跳转NOP掉,另存为另一个程序后运行依然出错,看来nop是不能解决这个自效检的问题,
向上找到00472E63的call,看来这个call 有问题。F7跟踪进去

0047446C   |.E8 43FEFFFF         call dumped_.004742B4
00474471   |.84C0                         test al,al
00474473   |.59                              pop ecx
00474474   |.59                              pop ecx
00474475   |.75 26                         jnz short dumped_.0047449D

跟踪脱壳后的程序到00474475处的跳转没有实现,而在跟踪没脱壳前的到这里时跳转是实现的,
将脱壳后程序词处的jnz改为JMP即刻解除程序的自效检。







--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

haiyun 发表于 2006-9-3 00:19:19

很详细的分析,学习了。

okman 发表于 2006-9-3 07:27:31

谢谢LZ了。。。

woainioo7 发表于 2006-9-3 09:30:09

学习了更喜欢你做个动画在旁边一边解释一边做/:D

Nisy 发表于 2007-9-28 17:12:35

学习一下对付壳的API加密 可惜找不到原程序了 ~~

zhaoyafei19 发表于 2007-10-6 19:35:01

很详细的
再此谢谢了
页: [1]
查看完整版本: PEncrypt 3.1 Final手动修复函数,去自效检简单脱文