记一次老旧32位软件在win10 64位系统中注册表读取失败问题的解决
双十一把老机子升级了一下,系统也换成win10 64位系统,今天要恢复一张U盘的内容,拿出以前用的挺顺手的易我***恢复软件,竟然提示未注册。在52上搜索了一下,还好有大神的帖子,https://www.52pojie.cn/thread-126396-1-1.html
照着调试了一遍,顺利找到注册码,填写后要求重启验证,竟然提示还是未注册!!!
重新调试一遍,在注册码的下面,看到:
00475D8C | 55 | push ebp |
00475D8D | 8BEC | mov ebp,esp |
00475D8F | 83EC 08 | sub esp,8 |
00475D92 | C745 F8 00000000 | mov dword ptr ss:,0 |
00475D99 | 837D 08 00 | cmp dword ptr ss:,0 |
00475D9D | 74 06 | je drw.475DA5 |
00475D9F | 837D 10 00 | cmp dword ptr ss:,0 |
00475DA3 | 75 07 | jne drw.475DAC |
00475DA5 | 33C0 | xor eax,eax |
00475DA7 | E9 BE000000 | jmp drw.475E6A |
00475DAC | 8D45 F8 | lea eax,dword ptr ss: |
00475DAF | 50 | push eax |
00475DB0 | 68 142D4A00 | push drw.4A2D14 | 4A2D14:"SOFTWARE\\成都易我科技\\易我数据恢复向导V2.1.0\\2.10.000"
00475DB5 | 68 01000080 | push 80000002 |
00475DBA | FF15 10304800 | call dword ptr ds:[<&RegOpenKeyA>] |
00475DC0 | 85C0 | test eax,eax |
00475DC2 | 74 07 | je drw.475DCB |
00475DC4 | 33C0 | xor eax,eax |
00475DC6 | E9 9F000000 | jmp drw.475E6A |
00475DCB | 8B4D 0C | mov ecx,dword ptr ss: |
00475DCE | 51 | push ecx |
00475DCF | 6A 00 | push 0 |
00475DD1 | 8B55 08 | mov edx,dword ptr ss: |
00475DD4 | 52 | push edx |
00475DD5 | E8 F6620000 | call <JMP.&memset> |
00475DDA | 83C4 0C | add esp,C |
00475DDD | 8B45 14 | mov eax,dword ptr ss: |
00475DE0 | 50 | push eax |
00475DE1 | 6A 00 | push 0 |
00475DE3 | 8B4D 10 | mov ecx,dword ptr ss: |
00475DE6 | 51 | push ecx |
00475DE7 | E8 E4620000 | call <JMP.&memset> |
00475DEC | 83C4 0C | add esp,C |
00475DEF | C745 FC 01000000 | mov dword ptr ss:,1 |
00475DF6 | 8D55 0C | lea edx,dword ptr ss: |
00475DF9 | 52 | push edx |
00475DFA | 8B45 08 | mov eax,dword ptr ss: |
00475DFD | 50 | push eax |
00475DFE | 8D4D FC | lea ecx,dword ptr ss: |
00475E01 | 51 | push ecx |
00475E02 | 6A 00 | push 0 |
00475E04 | 68 4C2D4A00 | push drw.4A2D4C | 4A2D4C:"UserName"
00475E09 | 8B55 F8 | mov edx,dword ptr ss: |
00475E0C | 52 | push edx |
00475E0D | FF15 04304800 | call dword ptr ds:[<&RegQueryValueExA>] |
00475E13 | 85C0 | test eax,eax |
00475E15 | 74 0E | je drw.475E25 |
00475E17 | 8B45 F8 | mov eax,dword ptr ss: |
00475E1A | 50 | push eax |
00475E1B | FF15 0C304800 | call dword ptr ds:[<&RegCloseKey>] |
00475E21 | 33C0 | xor eax,eax |
00475E23 | EB 45 | jmp drw.475E6A |
00475E25 | C745 FC 01000000 | mov dword ptr ss:,1 |
00475E2C | 8D4D 14 | lea ecx,dword ptr ss: |
00475E2F | 51 | push ecx |
00475E30 | 8B55 10 | mov edx,dword ptr ss: |
00475E33 | 52 | push edx |
00475E34 | 8D45 FC | lea eax,dword ptr ss: |
00475E37 | 50 | push eax |
00475E38 | 6A 00 | push 0 |
00475E3A | 68 582D4A00 | push drw.4A2D58 | 4A2D58:"RegisterCode"
00475E3F | 8B4D F8 | mov ecx,dword ptr ss: |
00475E42 | 51 | push ecx |
00475E43 | FF15 04304800 | call dword ptr ds:[<&RegQueryValueExA>] |
00475E49 | 85C0 | test eax,eax |
00475E4B | 74 0E | je drw.475E5B |
00475E4D | 8B55 F8 | mov edx,dword ptr ss: |
00475E50 | 52 | push edx |
00475E51 | FF15 0C304800 | call dword ptr ds:[<&RegCloseKey>] |
00475E57 | 33C0 | xor eax,eax |
00475E59 | EB 0F | jmp drw.475E6A |
00475E5B | 8B45 F8 | mov eax,dword ptr ss: |
00475E5E | 50 | push eax |
00475E5F | FF15 0C304800 | call dword ptr ds:[<&RegCloseKey>] |
00475E65 | F7D8 | neg eax |
00475E67 | 1BC0 | sbb eax,eax |
00475E69 | 40 | inc eax |
00475E6A | 8BE5 | mov esp,ebp |
00475E6C | 5D | pop ebp |
00475E6D | C2 1000 | ret 10 |
RegOpenKeyA,和SOFTWARE\\成都易我科技\\易我数据恢复向导V2.1.0\\2.10.000",4A2D4C:"UserName",4A2D58:"RegisterCode"
这说明程序是把注册码和用户名写到注册表了
于是在00475DBA下断点,再次运行的时候,发现RegOpenKeyA返回空,没有读取成功,这是什么情况?
查看RegOpenKeyA的参数说明,RegOpenKeyA(ByVal hKey As Long, ByVal lpszSubKey As String, phkResult As Long)
00475DAF | 50 | push eax |
00475DB0 | 68 142D4A00 | push drw.4A2D14 | 4A2D14:"SOFTWARE\\成都易我科技\\易我数据恢复向导V2.1.0\\2.10.000"
00475DB5 | 68 01000080 | push 80000002
eax接受返回结果,第二个字符串是注册表项,80000002 是hKey
Key hKey(Key Handle)
HKEY_CLASSES_ROOT &H80000000
HKEY_CURRENT_USER &H80000001
HKEY_LOCAL_MACHINE &H80000002
HKEY_USERS &H80000003
HKEY_CURRENT_CONFIG &H80000005
HKEY_DYN_DATA &H80000006
打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWARE下真的没有“成都易我科技”项!奇怪了
于是先自己按要求把注册表写好
在HKEY_LOCAL_MACHINE\SOFTWARE\成都易我科技\易我数据恢复向导V2.1.0\2.10.000项里添加两个字符串变量"UserName","RegisterCode",写好自己的数据
再调试,竟然还是返回空!
继续百度,发现在win10 64位系统中,只有HKEY_CURRENT_USER 子项不受限制注册表可随意读写
原来如此!
赶紧把程序中调用RegOpenKeyA函数的参数80000002都改成80000001,也就2处,一处写,一处读取
填写好注册信息后完美注册!
换64位后,好多东西还是不熟悉,还得学习啊
64位系统下32位的程序读写注册表的位置在HKEY_LOCAL_MACHINE\Software\Wow6432Node下 羡慕你们程序员,有个软件32位win7时用的,到了64位怎么也注册不上了,也不会自己算注册码,怎么也用不了,学习下思路试试。 大佬牛逼 谢谢楼主分享,特别详细,值得学习 原来如此 感谢分享,学习了 {:1_921:}点赞一个 win10把用户可操作权限下调了很多吧 谢谢楼主分享,特别详细,值得学习 特别详细,值得学习 值得学习,大佬就是大佬