如何使软件不被破解,或很难破解? 请看下面代码。(100分)

  • 主题发起人 主题发起人 ptfjy
  • 开始时间 开始时间
to :cslotus
我也想看一下你是怎样破解的。我试了一下,可以找到提示框处的代码,
但提示框以上的代码比较乱,像是数据,不是代码。我试了一个下午都不行。
教教我吧!谢谢!
 
qufo你好:
Cracker 就把 if 加密(123)=加密(123) then
改为 if 加密(123)<>加密(123),
你想想看到底是怎么才叫注册。改动一个字节呀。
----------------------------------------------------------------
1、Cracker用什么工具将'='改为'<>'呢?
2、字符比较不安全,那么能否用这种方法:
if 过程函数 then
begin
注册用户
end;
---函数内容如下:
将用户输入的机器码加密后生成100位长的密文,
for i:=1 to Length(密文长度100位) do
begin
“电脑算出的注册码的第X位”与“密文的第X位”比较
if 不同即退出
end;
-----上面的函数可多几个检查, 如:XXXXX-XXXXX-XXXXX-XXXXX
这种形式。
-----------------------------------------------
这样我现在唯一担心的是:
if 过程函数 then

这句“过程函数”是否容易被发现?
 
你的第二种方法也不是安全。
如果这样,反汇编后一般是这样的:
mov eax , xxx
mov edx, xxx // 参数
call xxxx // 调用参数
test eax ,eax
je a: //------------------------> 这是就是关键 一般这里是两个字节,改为两个 NOP (90H) 就破了。
// -- 注册用户 操作
a:
retn
一般是方法就是加一个壳,像你之前的那个软件,没有加壳,
又有一个提示框:没有注册云云。
别人打开它一搜索"注册" 就可看到你的提示框处的代码。
如果..... 就不如果了。总之就是破了。
不过以我现在的水平, 我也还是破不了你的那个程序 ;-)
因为我刚学。
但我自己写试了自己写的几个例子是没有问题的。
总之小心。
 
在它调用的每一个功能之前都验证一下,不要只在开始时验证一次
 
http://www.efile.com.cn/eFile/kimlon/portspy/kpsd.htm
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2269422
软件保护库
保护你的软件不被调试破解。效果不错。
 
to QSmile:你看到的地方可能是数据段。我看了那个地方也有很多跳转,不过因为是用delphi写的,它的调用很多,也就不足为奇。那个按钮是TBitBtn,跳转后找System.StrCmp()函数的入口就可以了
to ptfjy:昨天不好意思,没时间了。有时间再聊:)
 
首先得声明,我没有多少加密解密方面的经验,只是曾经听一个解密高手传授过一些知识,也是借花献佛,再详细我也说不清。
1、我也认为比较操作容易给破解发现, 请问如何才能避免比较操作?
我见过一些算法是通过将输入的字符串与内部的一个值进行一系列逻辑运算之后看是否为0,然后跳转,最好在做这些之前绕一些路,做一些无关的操作,比如系统初始化之类的,然后再判断密码。而且有些软件可以识别出比如C的RTL库中strcmp函数的代码段,字符串比较的操作很容易被识别出来。
大概的流程是:
var
i: Integer;
Value: DWORD;
begin
// 下面的数学变幻算法你自己设计,越复杂越好,而且不能封装为函数。
Value := 0;
for i := 1 to Length(Password) - 1do
Value := Value * Ord(password) - Ord(Password[i + 1]) * Ord(Password[i + 1])
// 做一些和加密解密无关的操作
...
// 如果使用比较方式则判断运算后的值
case Value of
18701: // 你根据实际的password运算的结果
// 开始正常的业务逻辑
else
Halt;
end;
或者
// 如果使用跳转方式则把Value转换成函数地址直接调用
TFarProc(Value)();
end;

不过实际的算法需要比这个复杂的多。
2、“对输入的字符串进行某些操作之后作为跳转地址跳转过去”,
这句话是什么意思,是不是,不要用 “if 123=123 then
”, 将其改为
“if 加密(123)=加密(123) then
”这种形式呢?
这种方法其实和前面的差不多,只是他们运算之后结果不是0,而是一个地址或者相对偏移,得出这个结果之后用一个jmp语句或者call语句跳转过去,如果密码正确则跳转到正确地址,否则是一个随机地址,程序出错后退出。不过……密码错误而且倒霉的话没准产生破坏性效果。
代码在前面有示意。
3、您是否认为在注册处,最好不要调用“serialNum.Dll”这样的动态库呢?
当然要避免调用动态链接库,否则我只要写一个导出和你的动态链接库相同接口的动态链接库,然后在判断注册的那个返回true……就破解了。不过有些采用动态链接库的加密方法把一部分业务逻辑也放在动态链接库里面,所以破解困难一些。总的来说,采用动态链接库会降低加密强度。
4.不要在判断的地方调用MessageBox或者其他API是最起码的要求,否则对方只要在上面设置一个断点就可以很容易找出你的加密代码。
 
我从没考虑过这个问题不可能破解不了的。绝不可能,,不要在这方面下功夫想想怎么把,软件做好就行了
 
多人接受答案了。
 

Similar threads

后退
顶部