此函数库提供了 Visual Fortran 上获取硬盘ID,CPU编号,windows安装时间及文件头部校验的四个函数。可用于简单的程序加密。(但切勿用于商业性很强的地方)
近期,不少朋友向笔者询问 Fortran 如何获得网卡地址,硬盘ID,CPU编号等。对此,笔者给出一个自己书写的简单的函数库。 fcForHard 是面向 Visual Fortran(Intel,Compaq等)编译器的一个函数库,包含四个函数: 1. GetSectionCheckSum 用于获取exe头部校验。通过此校验数据,可判断 exe 是否被加壳或脱壳。 2. GetCPUID 用于获取 CPU 标识。 3. GetHardDiskSerialNumber 用于获取第一硬盘的 SN 标识。 4. GetWinInstallDate 用于获取 windows 首次安装日期(时间戳) 由于 MAC 地址是非常不确定的因素,一般用户也可能会修改MAC地址以达到使用路由等目的,因此,已经不再推荐使用 MAC 地址来判断硬件。 请注意: 1. 此函数库不包含源代码(由汇编语言书写,且公布源代码会降低安全性) 2. 此函数库仅用于简单的加密手段!!!!对于商业险很强的工作,建议您购买正式的 dongle 许可管理软件。 3. 部分函数可能需要管理员身份才能获得正确的值。 以下为笔者身边三台电脑的运行结果:
以下为调用的范例代码:
Program www_fcode_cn !// 此代码示范 fcForHard 函数库的调用 !// 安全性不高,请合理使用! !// www.fcode.cn 发布 use Kernel32 , only : GetModuleHandle use Advapi32 Implicit None Interface Integer Function GetSectionCheckSum( iAddBase , ilpNum ) !DEC$ ATTRIBUTES DEFAULT, STDCALL, ALIAS:'_GetSectionCheckSum@8' :: GetSectionCheckSum Integer iAddBase ,ilpNum End Function GetSectionCheckSum Subroutine GetCPUID( ilpID ) !DEC$ ATTRIBUTES DEFAULT, STDCALL, ALIAS:'_GetCPUID@4' :: GetCPUID Integer ilpID End Subroutine GetCPUID Integer Function GetHardDiskSerialNumber( ilpHardDisk , ilpID ) !DEC$ ATTRIBUTES DEFAULT, STDCALL, ALIAS:'_GetHardDiskSerialNumber@8' :: GetHardDiskSerialNumber Integer ilpHardDisk , ilpID End Function GetHardDiskSerialNumber Integer Function GetWinInstallDate() !DEC$ ATTRIBUTES DEFAULT, STDCALL, ALIAS:'_GetWinInstallDate@0' :: GetWinInstallDate End Function GetWinInstallDate End Interface character(36) :: cHDcode = '\@\t.s\tPgh#yRs?i]c(aPl&D6rtiBvWe\0z' Character(48) :: cCPUID , cHDID , cHD , cTemp Integer i , k call GetCPUID( Loc(cTemp) ) cTemp = adjustl(cTemp) i = index( cTemp , char(0)) cTemp(i:) = "" cCPUID = cTemp write(*,'(a)',advance='no') 'CPUID:' write(*,*) Trim(cCPUID) Do i = 1 , 18 cHD(i:i) = cHDcode( i*2-1 : i*2-1 ) EndDo cHD(19:19) = char(0) cTemp = "" i = GetHardDiskSerialNumber( Loc(cHD) , Loc( cTemp ) ) cTemp = adjustl(cTemp) cHDID = cTemp write(*,'(a)',advance='no') 'DISKSN:' write(*,*) Trim(adjustl(cHDID)) write(*,'(a)',advance='no') 'Win Install Date:' write(*,'(z8)') GetWinInstallDate() i = GetModuleHandle(0) i = GetSectionCheckSum( i , Loc(k) ) write(*,'(a,g0)') 'Sum of PE Header:' , k read(*,*)End Program www_fcode_cn