首页 > 教程 > 正文

阅读排行

一个获取硬件系统信息的函数库
2015-04-29 17:47:17   来源:Fcode研讨团队   评论:0 点击:

此函数库提供了 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  

相关热词搜索:硬盘 ID 编号 CPUID

上一篇:堆栈(stack)的故事
下一篇:FAQ之 三种数组传递方式

分享到: 收藏