在检验注册码中
..
RegisterCode:=ReadString('posn');//读取注册表项'posn'的值
..
if shlstr(Encrypt(RegisterCode)) <> shlstr((Encrypt(GetDiskSN))) then
begin
MessageBox(self.Handle,'未注册版本,请与作者联系!','错误',MB_OK or MB_ICONASTERISK);
Application.Terminate;
end;
//GetDiskSN 取硬盘序列号后生产的注册码
//Encrypt 加密字符串
//shlstr 字符移位
//函数摘自CSDN帖子用OD(OllyDBG)打开程序,当程序弹出未注册对话框时,在 OD 可以看到所有的 字符串:
..
0012DE18 |023F01EC UNICODE "NKT58D40" 硬盘序列号 GetDiskSN 中另一函数取得
0012DE1C |01B1FBEC UNICODE "731E83E3045402" GetDiskSN (注册码)
0012DE20 |01B1FB74 UNICODE "2?10>J:@01:7<12N<;=?
0012DE30 |02441BCC UNICODE "'posn'"
..
怎样字符串才不会在内存中被看到
//shlstr 字符移位操作,避免注册码在内存当中就可以直接看到了。//函数摘自CSDN帖子
..
RegisterCode:=ReadString('posn');//读取注册表项'posn'的值
..
if shlstr(Encrypt(RegisterCode)) <> shlstr((Encrypt(GetDiskSN))) then
begin
MessageBox(self.Handle,'未注册版本,请与作者联系!','错误',MB_OK or MB_ICONASTERISK);
Application.Terminate;
end;
//GetDiskSN 取硬盘序列号后生产的注册码
//Encrypt 加密字符串
//shlstr 字符移位
//函数摘自CSDN帖子用OD(OllyDBG)打开程序,当程序弹出未注册对话框时,在 OD 可以看到所有的 字符串:
..
0012DE18 |023F01EC UNICODE "NKT58D40" 硬盘序列号 GetDiskSN 中另一函数取得
0012DE1C |01B1FBEC UNICODE "731E83E3045402" GetDiskSN (注册码)
0012DE20 |01B1FB74 UNICODE "2?10>J:@01:7<12N<;=?
0012DE30 |02441BCC UNICODE "'posn'"
..
怎样字符串才不会在内存中被看到
//shlstr 字符移位操作,避免注册码在内存当中就可以直接看到了。//函数摘自CSDN帖子
不过这样也不是很用效
用OD很容易跟到的
程序编译后可以用UPX或者ASPack加个壳
不过脱壳也很容易
原来看到过一篇文件讲用dll加密的
没实践过
去网上查查吧
0012DE18 |023F01EC UNICODE "NKT58D40" 硬盘序列号 GetDiskSN 中另一函数取得
0012DE1C |01B1FBEC UNICODE "731E83E3045402" GetDiskSN (注册码)
0012DE20 |01B1FB74 UNICODE "2?10>J:@01:7 <12N <;=?
0012DE30 |02441BCC UNICODE "'posn'" "731E83E3045402" 加密前的, "2?10>J:@01:7 <12N <;=? 加密后的
OD 都有看得到,
试过UPX , ASProtect等加壳后 OD还是看得到,
shlstr((Encrypt(GetDiskSN)))
函数:
GetDiskSN 取硬盘序列号后生产的注册码
//Encrypt 加密字符串
//shlstr 字符移位
夜车........
...
VMprotect:
代码中加入SDK标记代码,VM...,结果一样,VM保护不了线程堆栈中内容.
//
..
找到函数WriteProcessMemory
PCSN:=GetDiskSN;
if RegisterCode<>PCSN then
WriteProcessMemory(hprocess,Pointer(pcsn),@newres,SizeOf(newres),iwrite);
..
再用OD打开,已经找不到"731E83E3045402" 了。。