-
-
[原创]EXCEL服务器2006企业版V6.8的加密思路研究
-
发表于:
2007-5-17 15:24
16949
-
[原创]EXCEL服务器2006企业版V6.8的加密思路研究
EXCEL服务器2006企业版V6.8的加密与解密思路研究
【文章标题】: EXCEL服务器6.8的加密与解密思路研究
【文章作者】: newsoft88
【作者邮箱】: newsoft88@126.com
【软件名称】: 勤哲EXCEL服务器
【软件大小】: 99M
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: KEY文件
【编写语言】: VC
【使用工具】: OD IDA
【操作平台】: 98 XP
【软件介绍】: Excel服务器2006(企业版)电子表格软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
软件简单介绍:
Excel服务器2006(企业版)能够将电子表格软件MS Excel和大型数据库管理系统MS SQL Server 2000集成为一个网络数据业务协同工作平台。在这个平台上,用户可以充分发挥Excel的应用水平,通过图、表、表间公式,实现管理意图,轻松 、快速构建能够适应变化的ERP、OA、CRM、SCM等管理信息系统! 由于可以集成其它软件产品的数据库及具有工作流功能,因此又是一个非常实用的企业应用集成工具EAI。
过程:
有个朋友找我,说看看勤哲EXCEL服务器,我便从网上下了个6。8企业版,初步一看,认为还是以为简单,以前我记得有人解过5.6的版本,但具说是解的不全,过不了试用期! 而且原程序没有加壳,且有一个月的试用期!
还是老规矩,用OD载入EXCEL,运行后,直接启动登录界面,
300019C4 E> $ 6A 74 push 74
300019C6 . 68 101B003>push EXCEL.30001B10
300019CB . E8 4C01000>call EXCEL.30001B1C
300019D0 . 33DB xor ebx,ebx
300019D2 . 895D E0 mov dword ptr ss:[ebp-20],ebx
300019D5 . 53 push ebx ; /pModule => NULL
300019D6 . 8B3D D0140>mov edi,dword ptr ds:[<&KERNEL32.GetM>; |kernel32.GetModuleHandleA
300019DC . FFD7 call edi ; \GetModuleHandleA
300019DE . 66:8138 4D>cmp word ptr ds:[eax],5A4D
此时,设置OD事件中断为:当DLL载入时,我们点登录按扭
当中断在ESSA。DLL 时,我们进入DLL中,
DLL中应该有以下几个加密点:
1)试用版的NAG提示:即30天
2)5 个客户端的限制
3)文件校验;即当你修改了一个或几个文件时,他会让你再也写不了服务器了!
对上述几点的跟踪:首先可以下断:MessageBoxA ,跟到NAG的提示与客户端的限制!
NAG提示的关键代码:本人未做详细记录,有兴趣自己调试!
02C5E5DA . 51 push ecx
02C5E5DB . 8942 08 mov dword ptr ds:[edx+8],eax
02C5E5DE . 8B45 8C mov eax,dword ptr ss:[ebp-74]
02C5E5E1 . 8942 0C mov dword ptr ds:[edx+C],eax
02C5E5E4 . 8D55 A0 lea edx,dword ptr ss:[ebp-60]
02C5E5E7 . 52 push edx
02C5E5E8 . FFD7 call edi ; <&MSVBVM60.__vbaVarIndexLoad>
02C5E5EA . 8B1D 2413B>mov ebx,dword ptr ds:[<&MSVBVM60.__vb>; MSVBVM60.__vbaI2ErrVar
02C5E5F0 . 83C4 1C add esp,1C
02C5E5F3 . 50 push eax
02C5E5F4 . FFD3 call ebx ; <&MSVBVM60.__vbaI2ErrVar>
以下是试用期的检查:
02C2B719 . 8945 B0 mov dword ptr ss:[ebp-50],eax
02C2B71C . 74 56 je short ESSa.02C2B774
02C2B71E . 8B85 E4FEF>mov eax,dword ptr ss:[ebp-11C]
02C2B724 . 8B95 D8FEF>mov edx,dword ptr ss:[ebp-128]
02C2B72A . 8975 BC mov dword ptr ss:[ebp-44],esi
02C2B72D . 8DB8 9C11C>lea edi,dword ptr ds:[eax+2C6119C]
02C2B733 . C702 67040>mov dword ptr ds:[edx],80040467
02C2B739 . 3937 cmp dword ptr ds:[edi],esi
02C2B73B . 75 0C jnz short ESSa.02C2B749
02C2B73D . 57 push edi
02C2B73E . 68 2CA6BE0>push ESSa.02BEA62C
02C2B743 . FF15 8012B>call dword ptr ds:[<&MSVBVM60.__vbaNe>; MSVBVM60.__vbaNew2
02C2B749 > 8B3F mov edi,dword ptr ds:[edi]
文件校验用的是CRC,可以手工改过跳转,也可以修正CRC,任选一种!
以做完后,存为一个全新的essa.dll!
此时我启动都感觉正常了,以为大功告成了! 可当用旧版数据,或数据量达到30天的后的时候,你发现,EXCEL服务器停止工作了!
此时才知道,远没有这么简单,EXCEL服务器,作为一种服务程序的提供,另外一重加密就是在服务提供对SQL数据进行检查定期限!
我们首先打开
ESSvcMgr.exe ,点启动服务后,很快就停止了! 用OD载入
004017C4 E> $ 68 9829400>push ESSvcMgr.00402998
004017C9 . E8 EEFFFFF>call <jmp.&MSVBVM60.#100>
004017CE . 0000 add byte ptr ds:[eax],al
004017D0 . 0000 add byte ptr ds:[eax],al
004017D2 . 0000 add byte ptr ds:[eax],al
004017D4 . 3000 xor byte ptr ds:[eax],al
004017D6 . 0000 add byte ptr ds:[eax],al
004017D8 . 40 inc eax
以下为启动标志
004053B4 . 66:85DB test bx,bx
004053B7 74 07 je short ESSvcMgr.004053C0
004053B9 . C745 E4 FF>mov dword ptr ss:[ebp-1C],-1
004053C0 > 8B1D 48104>mov ebx,dword ptr ds:[<&MSVBVM60.__vb>; MSVBVM60.__vbaHresultCheckObj
004053C6 > 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
00406C40 . 33FF xor edi,edi
00406C42 . 68 9439400>push ESSvcMgr.00403994 ; UNICODE "ESService"
00406C47 . 897D D8 mov dword ptr ss:[ebp-28],edi
00406C4A . E8 E102000>call ESSvcMgr.00406F30
00406C4F . 66:3B46 34 cmp ax,word ptr ds:[esi+34]
00406C53 74 31 je short ESSvcMgr.00406C86
00406C55 . 8B16 mov edx,dword ptr ds:[esi]
00406C57 . 8D4D D8 lea ecx,dword ptr ss:[ebp-28]
00406C5A . 51 push ecx
00406C5B . 50 push eax
00406C5C . 56 push esi
00406C5D . 66:8946 34 mov word ptr ds:[esi+34],ax
本以为在这改后,可以使用的,但实际上搞错了,这个程序只是服务的HOOK的报告,就是侦察服务的运行状态,而非真正的服务控制!
而我们看出,真正的是ESService服务!对ESService用IDA反汇编后,你可以看到以下函数!
名称位于 ESServic, 条目 47
地址=0040600C
区段=.rdata
类型=输入
名称=ADVAPI32.SetServiceStatus
名称位于 ESServic, 条目 51
地址=00406008
区段=.rdata
类型=输入 (已知)
名称=ADVAPI32.StartServiceCtrlDispatcherA
名称位于 ESServic, 条目 41
地址=0040601C
区段=.rdata
类型=输入
名称=ADVAPI32.OpenServiceA
这些才是服务真正的启动点!
服务控制的原型如下:
#include "ntservice.h"
class CMyService : public CNTService
{
public:
CMyService();
virtual BOOL OnInit();
virtual void Run();
virtual BOOL OnUserControl(DWORD dwOpcode);
void SaveStatus();
// Control parameters
int m_iStartParam;
int m_iIncParam;
// Current state
int m_iState;
};
而对于 一个服务的调试,我们常常和附加的方式进行!这点在MSDN中也有描述,
我们对他IDA反汇编后,可以找到相关函数,加密的方式主要是:时间的控制!修改后,再启动。便正常工作了!
本文只对加密方法做个介绍,不汲及软件的破解,欢迎你来和我交流!
--------------------------------------------------------------------------------
【经验总结】
服务的加密应该还是有点特色的,多种方法混合使用,如文件校验、数据时间校验!都会给解密带来难度!由于本人文字水
平有限,写的不好,请不要向我扔石头!
--------------------------------------------------------------------------------
【版权声明】: 谢谢观看, 转载请注明作者并保持文章的完整, 谢谢!http://newsoft88.ys168.com
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)