- UID
- 2466
注册时间2005-7-22
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
【破解作者】 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即刻解除程序的自效检。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! |
|