在检验注册码中
..
 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帖子
 
    

解决方案 »

  1.   

    比较ascii或相关整数值而别直接比较字符串
      

  2.   

    同意楼上的办法
    不过这样也不是很用效
    用OD很容易跟到的
    程序编译后可以用UPX或者ASPack加个壳
    不过脱壳也很容易
    原来看到过一篇文件讲用dll加密的
    没实践过
    去网上查查吧
      

  3.   

    .. 
    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    字符移位  
      

  4.   

    你如果是不想看到这些字符串的话,用VMProtect吧……
      

  5.   

    ...
    夜车........
    ...
    VMprotect:
    代码中加入SDK标记代码,VM...,结果一样,VM保护不了线程堆栈中内容.
    //
    ..
    找到函数WriteProcessMemory
    PCSN:=GetDiskSN;
    if RegisterCode<>PCSN then
    WriteProcessMemory(hprocess,Pointer(pcsn),@newres,SizeOf(newres),iwrite);
    ..
    再用OD打开,已经找不到"731E83E3045402" 了。。