----赖格英-----

记忆不好了,记录工作中的点点滴滴....

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
此函数库提供了 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  

 

posted on 2018-09-11 21:29  向北方  阅读(1522)  评论(0编辑  收藏  举报