飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4078|回复: 5

奇思妙想:让同一个KEY在不同的硬盘上照样使用

[复制链接]

该用户从未签到

发表于 2006-6-24 17:01:57 | 显示全部楼层 |阅读模式
现在很多软件采用一机一码的注册方式,其中又以取硬盘ID的注册方式居多

我们知道,WIN32下的应用程序与系统打交道,都是通过调用API实现的,那么注册软件是通过什么来取得

硬盘ID的呢?我想也是通过API吧?

   如果我们挂勾这个API,也就是常说的API HOOK技术,让这个API返回我们指定的硬盘ID号,不就

变相地达到了修改硬盘ID号的目地!我相信这个也应该很容易实现的.

   好,假如我们现在有一个软件的正版KEY,它对应的硬盘ID号是159544386,我们写一个DLL(key.dll)

它的作用是修改载体(注册程序)取硬盘ID的API,使注册程序调用它时只返回我们指定的硬盘ID号(159544386)

  我们现在要做的是,怎么让注册程序加载这个DLL,不知道这样可以吗?

我们先用Stud_PE查看注册程序入口点和Functions中LoadLibraryA的地址,记下,同时也记下这个地址,

用OD载入程序,点右键,搜索→二进制字符,出现一个搜索栏,在HEX栏里输入大量的0,点确定找到程序空

白代码处,我找到了这个地址:"00545B7E 0000 add byte ptr ds:[eax],al" ,下面有很多这样的空白行

就用它了,记下先,来看看我记下的东西:

LoadLibraryA的地址为:0054641C,原入口点为004FF657:,空白代码为00545B7E;

然后我们在找到的空间处顺序出写入下面的代码:

00545B7E   push 00545B90 ;参数入饯

00545B83   call dword ptr[0054641C] ;调用LoadLibrary加载key.dll

00545B89   jmp 004FF657   ;跳到原来的入口点

00545B90   ascii "key.dll",0   ;和第一句代码对应



修改后,用keymake做个注册机,和key.dll以及KEY一起发布,放在要破解的程序的相同目录,运行注册机就OK了.


已上是我用汇编写HOOK API时忽然想到的,不知道行的通吗?

我本来是想用汇编写个这样的DLL,但汇编的一些基本用法我还没搞清楚,正在论坛请教呢.

还有取硬盘ID的API具体是什么?

如果那位大虾知道答案的话请一定要告诉我哦,我好写一个这样的DLL,

我以易语言4.03版做了个实验,插入key.dll成功,如果我们在key.dll里面勾住取硬盘ID的API,那么

呵呵,不用我说就知道结果了吧!放上实验品供大家研究:
e4.03.GIF

e4.03完美补丁.rar

12.38 KB, 下载次数: 24, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-24 17:24:54 | 显示全部楼层
再帖上取硬盘ID的API供大家研究


GetVolumeInformation

VB声明
Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
说明
获取与一个磁盘卷有关的信息
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpRootPathName String,欲获取信息的那个卷的根路径
lpVolumeNameBuffer String,用于装载卷名(卷标)的一个字串
nVolumeNameSize Long,lpVolumeNameBuffer字串的长度
lpVolumeSerialNumber Long,用于装载磁盘卷序列号的变量 lpMaximumComponentLength Long,指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度
lpFileSystemFlags Long,用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下:
FS_CASE_IS_PRESERVED 文件名的大小写记录于文件系统
FS_CASE_SENSITIVE 文件名要区分大小写
FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式
FS_PERSISTANT_ACLS 文件系统支持文件的访问控制列表(ACL)安全机制
FS_FILE_COMPRESSION 文件系统支持逐文件的进行文件压缩
FS_VOL_IS_COMPRESSED 整个磁盘卷都是压缩的
lpFileSystemNameBuffer String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他)
nFileSystemNameSize Long,lpFileSystemNameBuffer字串的长度

Top












===========================

0012F930  /CALL 到 GetVolumeInformationA 来自 e.00518D61
0012F934  |RootPathName = "D:\"
0012F938  |VolumeNameBuffer = NULL
0012F93C  |MaxVolumeNameSize = 0
0012F940  |pVolumeSerialNumber = NULL
0012F944  |pMaxFilenameLength = 0012FA9C
0012F948  |pFileSystemFlags = 0012FAA4
0012F94C  |pFileSystemNameBuffer = NULL
0012F950  \pFileSystemNameSize = NULL




希望大家可以写出个KEY.DLL

[ 本帖最后由 hacker0058 于 2006-6-24 17:27 编辑 ]
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-24 17:31:09 | 显示全部楼层
算了,我先用易的DLL(易写DLL要在装了易语言的机器上才能用)写个先用用

HOHO

也希望那个汇遍大虾能写个改写内存的汇编(Masm)代码给我学习学习

谢谢了

[ 本帖最后由 hacker0058 于 2006-6-24 17:52 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-6-24 19:03:35 | 显示全部楼层
不错不错,支持一下。。。
PYG19周年生日快乐!

该用户从未签到

发表于 2006-6-24 22:58:12 | 显示全部楼层
HOOK API,强!!!
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-26 18:24:34 | 显示全部楼层
实际上调用了这个

0012F670  /CALL 到 DeviceIoControl 来自 ADVAPI32.77DA966C
0012F674  |hDevice = 00000050 (window)
0012F678  |IoControlCode = 390008
0012F67C  |InBuffer = ADVAPI32.77E162C0
0012F680  |InBufferSize = 100 (256.)
0012F684  |OutBuffer = 0012F700
0012F688  |OutBufferSize = 100 (256.)
0012F68C  |pBytesReturned = 0012F6F4
0012F690  \pOverlapped = NULL
0012F694  ADVAPI32.77E162A0
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表