【破解作者】 B23526
【使用工具】 OD,IDA
【软件名称】由于是国内软件,咱就给点面子隐去软件名
【软件简介】是一个简单的皮肤界面软件.
【下载地址】用猜的吧
【破解声明】只是感兴趣,没有其他目的。失误之处敬请赐教!
一次偶然看到坛子里有人讨论一皮肤软件的破解,说试用版安装了一个驱动,而作者却排除了驱动搞鬼的情况,偶打死也不信一个界面皮肤软件需要驱动程序来运转,所以有了此文
首先下载一份软件软件帮助说有30天试用期,过期后可以免费使用简单皮肤(作者还是很厚道的),先从软的主体一个动态链接库入手,瞅瞅它的30天在哪儿判断的,扔进IDA一番咀嚼之后,查看倒入表发现几个和时间有关的函数
GetSystemTime
GetTimeZoneInformation
FileTimeToLocalFileTime
GetFileTime
GetLocalTime
FileTimeToSystemTime
SetFileTime
SystemTimeToFileTime
发现这几个函数都是CRT的time函数调用的遂追入调用time函数的地方,找到一处最可疑的地方,F5逆为C代码如下
代码:
int __cdecl sub_10056CA0(LPVOID lpOutBuffer, DWORD NumberOfBytesTransferred, const void *a3, unsigned int a4) { LPVOID v4; // ebx@1 int result; // eax@2 const void *v6; // esi@3 unsigned int v7; // eax@3 unsigned int v8; // eax@3 int v9; // eax@3 DWORD v10; // ecx@3 int v11; // esi@5 v4 = lpOutBuffer; if ( lpOutBuffer ) { memset(lpOutBuffer, 0, 0x64u); v7 = time(0); srand(v7); *(_DWORD *)v4 = rand(); v8 = time(0); srand(v8); v9 = rand(); v10 = NumberOfBytesTransferred; v6 = a3; *((_DWORD *)v4 + 1) = v9; *((_DWORD *)v4 + 2) = v10; *((_DWORD *)v4 + 3) = -2042267346; if ( v6 ) memcpy((char *)v4 + 16, v6, a4); sub_100571E0(v4, 100, 1); v11 = 0; sub_10056FA0(&lpOutBuffer); if ( sub_10056FC0(&lpOutBuffer) ) { NumberOfBytesTransferred = 0; v11 = sub_10057120(0x222000u, v4, 0x64u, v4, 0x64u, &NumberOfBytesTransferred); } sub_10056FB0(&lpOutBuffer); result = v11; } else { result = 0; } return result; }
嗯~~~~猜测应该是在驱动里取当前时间加密后传回,打开驱动果然看到KeQuerySystemTime
由于偶对密码算法是属于白痴级别的,所以只能爆破
既然R3层是调用伪随机数填充驱动请求的,再通过驱动加密算法加密后传回所以在伪随机数求取上东手比较合适使请求缓冲区不变,然后截取驱动返回的数据.
把伪随机数函数修改为永远返回1,用OD调试截取到驱动返回的数据,由于主体是DLL所以可以在
加载DLL后勾掉DeviceIoControl,DeviceIoControl返回的数据永远是OD截取的数据就可以无限期试用
调试发现在未安装驱动的机器上并未进入DeviceIoControl.
原来是CreateFileA和驱动通信必须创建驱动符号连接失败导致,遂修改使CreateFileA认为永远不失拜,
为了使程序简洁化使用了一大侠写的内存载入DLL的代码
为了不引起皮肤软件作者不必要的愤怒

