| 
注册时间2005-7-22
阅读权限20
最后登录1970-1-1UID2466 以武会友  
 
 该用户从未签到 | 
 
| 【破解作者】 windycandy[PYG] 【使用工具】 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:[eax],al
 004A0D52    .  008B C7E8A60A         add byte ptr ds:[ebx+AA6E8C7],cl
 004A0D58    .  0000                           add byte ptr ds:[eax],al
 
 用网友snetluck提供的方法
 https://www.chinapyg.com/viewthr ... &extra=page%3D1
 直接在命令行下 hr eip
 
 F9运行,中断在
 
 006B52A7     F3:A4                   rep movs byte ptr es:[edi],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:[ebp-18],esp
 004A0D5D    .  8BF4                         mov esi,esp
 004A0D5F    .  893E                          mov dword ptr ds:[esi],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 >77C4889D  GDI32.CreateFontIndirectA-----------------就是这个东东
 004BC0E4 >77C6DC9C  GDI32.UpdateColors
 004BC0E8 >77C436D1  GDI32.CreateCompatibleBitmap
 
 现在有这个函数,为什么在脱壳后不能修复呢?很简单,加壳程序肯定对这个函数进行处理了
 跟踪一下就知道了, let's go!!!
 在数据窗口单击鼠标右键------>断点------->硬件访问断点------>Dword
 
 F9运行程序,硬件中断
 
 006B5223     8956 24             mov dword ptr ds:[esi+24],edx  GDI32.CreateFontIndirectA-------断在这里
 006B5226     E8 06010000     call WINZIP32.006B5331
 006B522B     8B56 75             mov edx,dword ptr ds:[esi+75]
 006B522E     8902                   mov dword ptr ds:[edx],eax
 006B5230     8B56 28              mov edx,dword ptr ds:[esi+28]
 006B5233     8956 75              mov dword ptr ds:[esi+75],edx
 
 F8往下走,注意数据窗口数值的变化
 
 004BC0E0 >77C4889D  GDI32.CreateFontIndirectA---------------这是原来的数值
 004BC0E4 >77C6DC9C  GDI32.UpdateColors
 004BC0E8 >77C436D1  GDI32.CreateCompatibleBitmap
 004BC0EC >77C4217C  GDI32.CreateSolidBrush
 004BC0F0 >77C42945  GDI32.IntersectClipRect
 
 当F8到006B522E时,OD中间的窗口可以看到以下两个数值。
 eax=006B5337 (WINZIP32.006B5337)
 ds:[004BC0E0]=77C4889D (GDI32.CreateFontIndirectA)
 
 当F8步过006B522E后,数据窗口的数值发生了变化
 
 004BC0E0 >006B5337  WINZIP32.006B5337----------------------原来的函数被这个数值代替了
 004BC0E4 >77C6DC9C  GDI32.UpdateColors
 004BC0E8 >77C436D1  GDI32.CreateCompatibleBitmap
 004BC0EC >77C4217C  GDI32.CreateSolidBrush
 004BC0F0 >77C42945  GDI32.IntersectClipRect
 
 到这里,我们可以知道加壳程序在006B522E     8902            mov dword ptr ds:[edx],eax处对函数进行处理
 要避开其对函数的处理,将其NOP掉即可。
 
 OD重新载入加壳程序,用以上方法到006B522E,将其nop掉,
 F9运行(hr eip)中断
 006B52A7     F3:A4                   rep movs byte ptr es:[edi],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:[ebp-18],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:[4E70C0],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即刻解除程序的自效检。
 
 
 
 
 
 
 
 --------------------------------------------------------------------------------
 【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
 | 
 |