如何获取电脑机器码?200分急求!(100)

  • 主题发起人 主题发起人 无名爱好者
  • 开始时间 开始时间

无名爱好者

Unregistered / Unconfirmed
GUEST, unregistred user!
何为机器码? CPU? MAC? 硬盘ID? 还是...?
 
你自己生成吧。取硬盘分区码,CUP GUID,显卡参数,等等,综合在一起,然后自己生成就好了
 
那如何取硬盘序列号或分区码、cpu guid、显卡等参数?谢谢!
 
取了也没用,一hook就模拟。
 
unit GetSystemInfo;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TSrbIoControl = packed record HeaderLength : ULONG; Signature : Array[0..7] of Char; Timeout : ULONG; ControlCode : ULONG; ReturnCode : ULONG; Length : ULONG; end; SRB_IO_CONTROL = TSrbIoControl; PSrbIoControl = ^TSrbIoControl; TIDERegs = packed record bFeaturesReg : Byte; // Used for specifying SMART "commands". bSectorCountReg : Byte; // IDE sector count register bSectorNumberReg : Byte; // IDE sector number register bCylLowReg : Byte; // IDE low order cylinder value bCylHighReg : Byte; // IDE high order cylinder value bDriveHeadReg : Byte; // IDE drive/head register bCommandReg : Byte; // Actual IDE command. bReserved : Byte; // reserved. Must be zero. end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs; TSendCmdInParams = packed record cBufferSize : DWORD; irDriveRegs : TIDERegs; bDriveNumber : Byte; bReserved : Array[0..2] of Byte; dwReserved : Array[0..3] of DWORD; bBuffer : Array[0..0] of Byte; end; SENDCMDINPARAMS = TSendCmdInParams; PSendCmdInParams = ^TSendCmdInParams; TIdSector = packed record wGenConfig : Word; wNumCyls : Word; wReserved : Word; wNumHeads : Word; wBytesPerTrack : Word; wBytesPerSector : Word; wSectorsPerTrack : Word; wVendorUnique : Array[0..2] of Word; sSerialNumber : Array[0..19] of Char; wBufferType : Word; wBufferSize : Word; wECCSize : Word; sFirmwareRev : Array[0..7] of Char; sModelNumber : Array[0..39] of Char; wMoreVendorUnique : Word; wDoubleWordIO : Word; wCapabilities : Word; wReserved1 : Word; wPIOTiming : Word; wDMATiming : Word; wBS : Word; wNumCurrentCyls : Word; wNumCurrentHeads : Word; wNumCurrentSectorsPerTrack : Word; ulCurrentSectorCapacity : ULONG; wMultSectorStuff : Word; ulTotalAddressableSectors : ULONG; wSingleWordDMA : Word; wMultiWordDMA : Word; bReserved : Array[0..127] of Byte; end; PIdSector = ^TIdSector;const IDE_ID_FUNCTION = $EC; IDENTIFY_BUFFER_SIZE = 512; DFP_RECEIVE_DRIVE_DATA = $0007c088; IOCTL_SCSI_MINIPORT = $0004d008; IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;function GetIdeDiskSerialNumber : String;Function GetCPUID:String;implementationFunction GetCPUID:String; function GetCpuId:longint;assembler;register; var temp:longint; begin asm PUSH EBX PUSH EDI MOV EDI,EAX MOV EAX,1 DW $A20F MOV TEMP,EDX POP EDI POP EBX end; result:=temp; end;begin Result:=IntToHex(GetCpuId,8);end;procedure ChangeByteOrder( var Data; Size : Integer ); var ptr : PChar; i : Integer; c : Char; begin ptr := @Data; for i := 0 to (Size shr 1)-1 do begin c := ptr^; ptr^ := (ptr+1)^; (ptr+1)^ := c; Inc(ptr,2); end; end;function GetIdeDiskSerialNumber : String;var hDevice : THandle; cbBytesReturned : DWORD; pInData : PSendCmdInParams; pOutData : Pointer; // PSendCmdOutParams Buffer : Array[0..BufferSize-1] of Byte; srbControl : TSrbIoControl absolute Buffer;begin Result := ''; FillChar(Buffer,BufferSize,#0); if Win32Platform=VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000 // Get SCSI port handle hDevice := CreateFile( '//./Scsi0:', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); System.Move('SCSIDISK',srbControl.Signature,8); srbControl.Timeout := 2; srbControl.Length := DataSize; srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; pInData := PSendCmdInParams(PChar(@Buffer) +SizeOf(SRB_IO_CONTROL)); pOutData := pInData; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end else begin // Windows 95 OSR2, Windows 98 hDevice := CreateFile( '//./SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try pInData := PSendCmdInParams(@Buffer); pOutData := @pInData^.bBuffer; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end; with PIdSector(PChar(pOutData)+16)^ do begin ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); end;end;END.给你源代码
 
hook DeviceIoControl it game over!
 
软件如果有价值,就需要法律保护,这才是正道。至于hook如果有必要可以开发驱动,然后deviceiocontrol时,使用自己的协议收发,不满足协议的就认为违法,这样一来hook就是个摆设了。但个人建议你不用这么麻烦,除非你的软件真是非常的抢手。
 
自己协议甚至驱动有什么用,你用deviceiocontrol,我就hook这个就行了。
 
你是可以hook eviceiocontrol函数,但你不知道我传送的是什么,同理你给我的我也不认识,不认识我就可以认为是非法的。当然如果你使用其他方式破解,这个另说,但hook一定是没有用的了。
 
我根本不知道需要知道你传的是什么,只要有一份注册的,把你通信的内容截取下来就行了。
 
驱动中:提取机器码然后进行变换及加密,通过deviceio函数返回给主应用程序,主应用程序接收后首先解密然后进行比对(比如md5),如果过程中有一个不对就认为失败,都成功再次进行编码后与授权号进行比对。同理再完成一次反向的操作(从注册码开始),全部通过认为授权成功,你截获了某个授权码的序列仅可以骗过主应用的检查,但无法通过驱动端的检查。
 
"驱动中:提取机器码然后进行变换及加密,通过deviceio函数返回给主应用程序"然后我只要把你传回给程序的值截取了,在别的机器上无论返回什么值,我都传送这个,就完事了,根本不用管你怎么加密怎么通信,反正你发什么我就发什么,还是不明白吧?
 
我也是为了这个关于注册时遇到的问题!!关注中!
 
反向的是我将你的注册码和通过deviceio得到的码进行变换后再通过deviceio传给驱动检验,驱动会重新生成机器码并比对传送过来的是否是自己生成的,你的hook就没有用处了,因为你发给我的驱动是不认识的,就算你能够在第二次的时候将驱动输入的数据给我也没有用,因为你不知道在主程序中的变换算法。
 
总之你要破解就必须要进行双向算法破解,仅仅拦截是没有用的。
 
就算就如你这样说,你的驱动取硬盘码无非也就是SCSI CMD发送到到端口而已,我HOOK住这个让它返回指定值,而这个制定值是有合适注册码的,再多算法措施都是白搭,除非你自己的注册码都无法注册你自己的程序。如果你懂反汇编的话,就不会再我和争论什么了。你想证明也很简单,你自己写个驱动和程序,公开可编译的代码,我写出相应的HOOK代码告诉你怎么破解。 
 
支持,学习中.[8D](这不是灌水!!!)
 
最简单就是 RESULT :='1';
 

Similar threads

后退
顶部