找到了软件读取硬盘物理序列号的代码特征,帮助兄弟们少走弯路!
是这样的,楼主正在想办法破解某软件的算法{:301_998:}软件是重启验证,楼主揣摩着肯定是在执行验证前就会读取机器码
这个软件的机器码就是硬盘的物理序列号
于是楼主苦苦寻找,想找到它在那一部分读取了序列号
这里直接贴图,楼主一个个排查进call
看到了这样的界面,经过查询,知道了这个就是读取硬盘的序列号的特征!
给大家提供一个借鉴~
00495621 .6A 00 push 0x0 ; /hTemplateFile = NULL
00495623 .6A 00 push 0x0 ; |Attributes = 0
00495625 .6A 03 push 0x3 ; |Mode = OPEN_EXISTING
00495627 .6A 00 push 0x0 ; |pSecurity = NULL
00495629 .6A 03 push 0x3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0049562B .68 000000C0 push 0xC0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00495630 .68 54574900 push dumped.00495754 ; |\\.\PhysicalDrive0
00495635 .E8 6212F7FF call <jmp.&kernel32.CreateFileA> ; \CreateFileA
0049563A .8985 ECFDFFFF mov dword ptr ss:,eax
00495640 .EB 1C jmp short dumped.0049565E
00495642 >6A 00 push 0x0 ; /hTemplateFile = NULL
00495644 .6A 00 push 0x0 ; |Attributes = 0
00495646 .6A 01 push 0x1 ; |Mode = CREATE_NEW
00495648 .6A 00 push 0x0 ; |pSecurity = NULL
0049564A .6A 00 push 0x0 ; |ShareMode = 0
0049564C .6A 00 push 0x0 ; |Access = 0
0049564E .68 68574900 push dumped.00495768 ; |\\.\SMARTVSD
00495653 .E8 4412F7FF call <jmp.&kernel32.CreateFileA> ; \CreateFileA
00495658 .8985 ECFDFFFF mov dword ptr ss:,eax
0049565E >83BD ECFDFFFF>cmp dword ptr ss:,-0x1
00495665 .0F84 DC000000 je dumped.00495747
0049566B .33C0 xor eax,eax
0049566D .55 push ebp
0049566E .68 1F574900 push dumped.0049571F
00495673 .64:FF30 push dword ptr fs:
00495676 .64:8920 mov dword ptr fs:,esp
00495679 .8D85 C7FDFFFF lea eax,dword ptr ss:
0049567F .33C9 xor ecx,ecx
00495681 .BA 20000000 mov edx,0x20
00495686 .E8 25D6F6FF call dumped.00402CB0
0049568B .8D85 F0FDFFFF lea eax,dword ptr ss:
00495691 .33C9 xor ecx,ecx
00495693 .BA 10020000 mov edx,0x210
00495698 .E8 13D6F6FF call dumped.00402CB0
0049569D .33C0 xor eax,eax
0049569F .8985 E8FDFFFF mov dword ptr ss:,eax
004956A5 .C785 C7FDFFFF>mov dword ptr ss:,0x200
004956AF .C685 CCFDFFFF>mov byte ptr ss:,0x1
004956B6 .C685 CDFDFFFF>mov byte ptr ss:,0x1
004956BD .C685 D0FDFFFF>mov byte ptr ss:,0xA0
004956C4 .C685 D1FDFFFF>mov byte ptr ss:,0xEC
004956CB .6A 00 push 0x0 ; /pOverlapped = NULL
004956CD .8D85 E8FDFFFF lea eax,dword ptr ss: ; |
004956D3 .50 push eax ; |pBytesReturned = 000001B4
004956D4 .68 10020000 push 0x210 ; |OutBufferSize = 210 (528.)
004956D9 .8D85 F0FDFFFF lea eax,dword ptr ss: ; |
004956DF .50 push eax ; |OutBuffer = 000001B4
004956E0 .6A 20 push 0x20 ; |InBufferSize = 20 (32.)
004956E2 .8D85 C7FDFFFF lea eax,dword ptr ss: ; |
004956E8 .50 push eax ; |InBuffer = 000001B4
004956E9 .68 88C00700 push 0x7C088 ; |IoControlCode = SMART_RCV_DRIVE_DATA
004956EE .8B85 ECFDFFFF mov eax,dword ptr ss: ; |
004956F4 .50 push eax ; |hDevice = 000001B4 (window)
004956F5 .E8 BA11F7FF call <jmp.&kernel32.DeviceIoControl> ; \DeviceIoControl第一个CreateFile是读取了硬盘一般是主硬盘(物理意义)
第二个CreateFile是读取了SMARTVSD 也就是硬盘的s.m.a.r.t 信息 SMARTVSD这个文件,里面就储存有硬盘的物理序列号信息!
第三个DeviceIoControl是控制硬盘,使得硬盘操作 SMART_RCV_DRIVE_DATA从而获得序列号!
希望以后的致力与寻找软件在哪一步读取了硬盘序列号的兄弟萌可以少走弯路!
大家可以自己去找一找
如果有违规,请勤劳的论坛管理团队予以删除!小弟在这里给你们磕头了!{:301_973:} 兄弟们继续努力了,我找到算法了,太难了,光靠od能难到我吐血!
我吐了
这程序是这样的
先读取硬盘的物理序列号
然后通过一段算法将序列号转换成生成注册码的原料
然后再通过注册算法将原料两位两位的组成30位的注册码 柳暗花明又一村。 jefel 发表于 2020-6-2 18:39
柳暗花明又一村。
谢谢您的赞誉!{:301_997:} 找到读取机器码的位置了,找到算法语句还会远吗?兄弟萌奥里给!{:301_997:} 这个不错! 一种新的解题方法。。。 感谢分享方法 前来打卡学习了