Help&Help (200分)

  • 主题发起人 主题发起人 zhoufujin
  • 开始时间 开始时间
Z

zhoufujin

Unregistered / Unconfirmed
GUEST, unregistred user!
Procedure &nbsp;MyPROC;<br>Begin<br>//若干语句<br>....<br>End;<br>Procedure encrypt;<br>Begin<br>//对MyProc 加密<br>End;<br><br>Procedure Decrypt;<br>Begin<br>//对MyProc 解密<br>End;<br>在运行MyProc前先解密(Decrypt)然后执行,然后再次加密(encrypy)<br>问题:<br>1 这个思路行吗?<br>2 EnCrypt和Decrypt怎么写?最好给个Demo
 
对代码加密?不懂
 
直接在程序内这样子加密可能是不行的,除非用汇编...你可以将MyProc放到<br>一个DLL中,然后对那个DLL进行加密,那应该是没问题的...
 
哪有对代码加密的,听听高人怎么说吧.
 
MyProc 是注册号码的算法,不加密<br>别人静态分析注册机就会出现了<br>加了密就无法静态分析了<br>有别的思路吗?体点建议也成.200分谁拿?
 
好想法!应该是对编译完成后的代码加密吧?<br>不过你的加密代码在什么时候运行呢?
 
搜索一下,简单的加密很多的。<br><br>卷起千堆雪tyn (2001-11-02 22:33:00) &nbsp;<br>唉~~~~自己整理吧~~~~<br>const<br>&nbsp; C1 = 52845;<br>&nbsp; C2 = 22719;<br><br>function Encrypt(const S: String; Key: Word): String;<br>var<br>&nbsp; I: byte;<br>begin<br>&nbsp; Result[0] := S[0];<br>&nbsp; for I := 1 to Length(S) do begin<br>&nbsp; &nbsp; Result := char(byte(S) xor (Key shr 8));<br>&nbsp; &nbsp; Key := (byte(Result) + Key) * C1 + C2;<br>&nbsp; end;<br>end;<br><br>function Decrypt(const S: String; Key: Word): String;<br>var<br>&nbsp; I: byte;<br>begin<br>&nbsp; Result[0] := S[0];<br>&nbsp; for I := 1 to Length(S) do begin<br>&nbsp; &nbsp; Result := char(byte(S) xor (Key shr 8));<br>&nbsp; &nbsp; Key := (byte(S) + Key) * C1 + C2;<br>&nbsp; end;<br>end;<br><br>var<br>&nbsp; S: string;<br>begin<br>&nbsp; Write('&gt;');<br>&nbsp; ReadLn(S);<br>&nbsp; S := Encrypt(S,12345);<br>&nbsp; WriteLn(S);<br>&nbsp; S := Decrypt(S,12345);<br>&nbsp; WriteLn(S);<br>end.<br><br>&nbsp;<br>Temp (2001-11-02 22:52:00) &nbsp;<br>再麻烦卷起千堆雪tyn大侠:<br>&nbsp; &nbsp;<br>&nbsp; &nbsp;请问您的源程序是如何防止加密后的字符出现回车或者换行符号呢?<br>(因为我用readln读写文本文件,如果出现这两个字符,读写可能会出现错误)<br>非常不好意思再麻烦大侠,请再帮一把~~~~<br>&nbsp;<br>晴天 (2001-11-02 23:51:00) &nbsp;<br>这很容易啊:<br>第一步:先将待加密字符换码,比如将一个字符变成两个只含0~9,a~f的字符,<br>回车就是“0d”,换行就是“0a”,等等,换码后源字符就不含回车或换行符了;<br>第二步:对加密后的字符判断,如果加密后的字符是回车或换行,就用加密前的字符替换,<br>也就是该字符与没有加密一样。解密时遇到该字符,解密结果必定也是回车或换行,同样<br>用加密前的字符替换,相当于这个字符既未加密也未解密。<br>第三步:再将解密后的两两字符换码回来,就是你原始的(可能含有特殊字符的)文本。<br><br>我做加密解密程序就是用上述方法,效果很满意。:)<br>&nbsp;<br><br>还有,麻烦老兄以后提问的时候把标题写清楚点。别只是Help。Help什么啊?
 
我有一个笨办法,供参考:<br>第一步:从正常编译完成的程序中把Procedure &nbsp;MyPROC;这个过程机器代码取出来,单独存成<br>一个文件;可以用UltraEdit-32或者Winhex之类的工具完成;<br>第二步:再新建一个工程,在这个程序中用Procedure encrypt;过程完成对保存的机器代码<br>的加密并保存到一个新的文件中;<br>第三步:将加密后的机器代码加到你的程序的exe文件中;<br>&nbsp; &nbsp; 方法一:如果Procedure &nbsp;MyPROC;这个过程在加密前后长度不变,可以用第二步所用工具<br>替换MyPROC的代码;(如变短了可以加‘90’补足);<br>&nbsp; &nbsp; 方法二:如果加密后MyPROC过程的代码长度增加了,则可以将其定义为一个常量,然后<br>做如下处理:<br>const<br>&nbsp; MyCode = '加密后的机器代码';<br><br>procedure DoMyPROC(ACode: string; AVar: Integer);<br>var<br>&nbsp; S: string;<br>&nbsp; P: Pointer;<br>begin<br>&nbsp; S := ACode;<br>&nbsp; //用Decrypt(S)执行解密;<br>&nbsp; P := @S[1];<br>&nbsp; asm<br>&nbsp; &nbsp; mov eax, AVar &nbsp; &nbsp;//传入口参数;<br>&nbsp; &nbsp; call P<br>&nbsp; end;<br>end;<br><br>调用:<br>DoMyPROC(MyCode, 0);<br><br>当然这里用串来保存机器代码是不妥的,仅用来说明原理;<br>
 
thx1180:<br>您的思路我比较欣赏,但是在调用MyProc<br>时如何先解密这段代码很难,以前<br>我曾先算出MyProc的地址和大小,<br>然后强行修改这段代码(解密),然后再调用,在IDE下很好,<br>但是脱离IDE就出错了,友人建议用ReadProcessMemory<br>WriteProcessMemory,我不会,请大虾指点。<br>各位兄弟,如果这个问题解决了,我再加300分,决不食言<br>
 
我原来理解错了。<br>不知道为什么要对编译后的代码加密?为了防止破解?关注
 
防止破解
 
代码变换的确是防止破解的一种方法,在DOS下用的比较多,主要是为了防止跟踪,一般兼做代码的覆盖,<br>在windows下我建议你还是多做一些转向分支,这样代价小一些。
 
如何先解密这段代码确实很难,你说的我也考虑过,<br>关于用ReadProcessMemory和WriteProcessMemory函数来处理,<br>好像是对另一个进程空间操作,不能对自己的进程空间操作,<br>可以看看这个帖子:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=872164<br><br>另我所说的第三步中的方法二的示例过程我是做过测试的,可行,<br>但有一些限制,如果MyPROC调用其它的函数如系统函数可能无法<br>正确定位。可能全部用汇编处理好一些。<br><br>不过,我个人的看法,防止破解的关键在如何隐藏你的判断点即<br>程序的转向点,找到后一个jmp指令就可以跳过你的所有加密处理,<br>除非你解密后的数据作为正常数据的一部分。<br><br>
 
zhoufujin:<br>你的思路好像有问题,encrypy程序段一般说来不应该放到你的程序中,除非你想将他做成<br>一个变型引擎(我想你不想做病毒:)。你不会在程序运行时先encrypy再decrypy吧,<br>那样的话,就是说你的原始代码是以明文方式存在文件中,在运行时先加密,在解密,<br>既没必要又不能防止静态分析,对不。<br>你说你做的强行修改代码的程序在IDE下很好,但是脱离IDE就出错,我也做过类似的东西,<br>不过不会出错,或许能帮上你:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=1732441<br><br>不过我不同意thx1180说得如果MyPROC调用其它的函数如系统函数可能无法<br>正确定位。只要特殊处理一下就可以,例如在MyPROC中动态获取所调用的函数地址<br>通过地址来调用,具体实现的方法可以很多的。<br>我同意thx1180说得全部用汇编处理好一些,不过这不仅使你处理方便些,也使<br>cracker能够更方便的了解你的思路,作出注册机。毕竟asm写出的程序太“明了”了。<br><br>你说你想防治破解,不过我认为这样做没太大意义。毕竟你的程序要运行,只要你的<br>MyPROC解密完成,别人就可以挂起你的程序,然后dump下来,就可以分析你的代码了。<br>即使你的程序当不下来,也可以动态跟踪,破掉程序,想避免被破解我想不是我们能作<br>得出来的。建议你用现成的加密软件,同时使用强加密算法,在算法,程序自身验证的<br>方面下功夫。<br>
 
tt.t:<br>先谢谢您:<br>“”你的思路好像有问题,encrypy程序段一般说来不应该放到你的程序中,除非你想将他做成<br>一个变型引擎(我想你不想做病毒:)。你不会在程序运行时先encrypy再decrypy吧,<br>那样的话,就是说你的原始代码是以明文方式存在文件中,在运行时先加密,在解密,<br>既没必要又不能防止静态分析,对不。”您说的对,我想先编译EXE后找到要加密的的部分<br>进行encrypy,程序运行中Decrypy.<br>那么如何给Cracker作注册机增加难度?您的思路是什么?<br><br>
 
破解一般说来有2种途径:通过注册机算出正确地注册号;爆破。<br>对于注册机,我想可以通过使用强加密算法来阻止。具体实现上,我想可以采用一机一码的注册方式,使用如des,blowfish之类的不可逆算法通过对机器码计算得到注册码。我想可以将机器码分成几部分,分别使用不同的算法进行验证,实现时可以同时建立几个线程,对各个部分同时计算验证,同时记录各线程运行时间,如果时间超过正常范围(如5秒),责程序出错推出。<br>对于爆破,我想比较好的办法应该是设立很多的”暗桩“,如果发现错误责过一段不定长的时间在出错。暗桩的设立应足够分散,可以是对程序完整性的测试也可以是对注册码的检测。这里,我想可以在注册码中增加几位校验码(要分散在注册码中),来和通过机器码计算出的注册码相互验证,也就是前面说得在暗桩中对注册码的检测。<br>总的来说,应该注意的问题很多,如不要用全局变量设置注册标记,不要显示注册失败的提示,注册算法中应加入一些无用的但能起到干扰作用的代码,验证算法应分散的插入到功能代码中,不要将校验部分做成函数调用,要在程序中分散的、很多的次对注册码进行无用的读取,转移等。<br>能想到的也就这么多了,剩下的就靠你自己了。<br>btw,你做的是什么软件,要如此费心怕人破解?
 
http://aiming.ynxx.com/WriteCodeSeg.htm
 
后退
顶部