现在位置:主页>基础知识> 文章内容

与破解过招,保护你的共享软件

我要投稿更新日期:2008-07-03 点击:


   0167:005B9F70  MOV     EAX,[EBP-10]
   0167:005B9F73  CALL    00404000
   0167:005B9F78  PUSH    EAX
   0167:005B9F79  MOV     EAX,[EBP-10]
   0167:005B9F7C  CALL    004041C4
   0167:005B9F81  LEA     ECX,[EBP-14]
   0167:005B9F84  POP     EDX
   0167:005B9F85  CALL    004B860C

  当然,最好把Hash算法也全部改名,给会给他们制造更多的困难。但注意,MD5和SHA之类的Hash的初始值会被Cracker从内存中找到,这样他就知道了你用的Hash了。所有建议同时使用MD5的变形算法Ripe-MD(RMD)128或160和其它的Hash,如Tiger, Haval等算法。
 
  另外,请注意要经常效验你的程序是否被修改(Hash效验),如果被修改则退出。但请注意,有些病毒会修改进程的句柄表和它指向的内核对象,这样病毒就可以直接修改运行中的PE文件而感染之了,另外还有网络传输错误的问题也会导致软件CRC出错。因此请不要认为可执行文件的CRC不符而此时程序已被脱壳了。
 
  其实,程序被脱壳最明显的标志是其大小明显大于脱壳前。1M的PE文件被UPX、ASPack之类的软件压缩后通常只有400左右。如果你的软件在运行中发现自己的大小大于800K,我想你应该知道如何做了吧?呵呵...
 
  还有一点,调试器对我们的威胁很大,我们不会肯定让Cracker们舒舒服服地使用SoftICE、TRW和OllyDbg来调试我们的程序。除了常用的MeItICE方法外,这里我给一个我写的方法:

 { 检查自己的进程的父进程是否为Explorer.exe,否则是被调试器加载了 }
 { 不过注意,控制台程序的父进程在WinNT下是Cmd.exe哦!}
 { 注意加载TlHelp32.pas单元 }
 
 procedure CheckParentProc;
 var //检查自己的进程的父进程
   Pn: TProcesseNtry32;
   sHandle: THandle;
   H, ExplProc, ParentProc: Hwnd;
   Found: Boolean;
   Buffer: array[0..1023] of Char;
   Path: string;
   begin
     H := 0;
     ExplProc := 0;
     ParentProc := 0;
     //得到Windows的目录
     SetString(Path,
               Buffer,
               GetWindowsDirectory(Buffer, Sizeof(Buffer) - 1));
     Path := UpperCase(Path) + '\EXPLORER.EXE'; //得到Explorer的路径
     //得到所有进程的列表快照
     sHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
     Found := Process32First(sHandle, Pn); //查找进程
     while Found do //遍历所有进程
     begin
       if Pn.szExeFile = ParamStr(0) then //自己的进程
       begin
         ParentProc := Pn.th32ParentProcessID; //得到父进程的进程ID
         //父进程的句柄
         H := OpenProcess(PROCESS_ALL_ACCESS, True, Pn.th32ParentProcessID);
       end
       else if UpperCase(Pn.szExeFile) = Path then
         ExplProc := Pn.th32ProcessID;      //Explorer的PID
       Found := Process32Next(sHandle, Pn); //查找下一个
     end;
     //嗯,父进程不是Explorer,是调试器……
     if ParentProc <> ExplProc then
     begin
       TerminateProcess(H, 0); //杀之!除之而后快耶!
       //你还可以加上其它什么死机代码来消遣消遣这位可爱的Cracker
     end;
   end;

  你可以在Delphi或者VC中试试,呵呵,是不是把Delphi和VC杀掉了,因为你现在用的是Delphi和VC的内置调试器来运行你的程序的,当然它会六亲不认了,呵呵!调试的时候你还是把它注释掉吧,发布时别忘记激活哟!
 
  最后一个问题,这也是一个非常重要的问题:保护你的字符串!!!字符串在注册模块中非常重要!当一个富有经验的Cracker破解你的软件时,首先做的就是摄取你的字符串。比如他会输入错误的注册码,得到你关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或者“Invalid key, please input again!”等等,然后用OllyDbg下断点调试或者用WinDASM、IDA Pro等静态分析工具在被他脱壳后的程序中查找那个字符串,找到后进行分析。因此,请一定加密你的字符串!!!一定!!!使用时再临时解密出来,而且要尽量少使用消息提示框,避免被Cracker找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。

上一页 1 2 34 下一页
所有评论

评论列表


我也评论来评论! 点击此处参与本文评论

注意:本站采用匿名评论,请各位网友注意自己的言行