白河愁兄进来领分! ( 积分: 300 )

  • 主题发起人 主题发起人 tseug
  • 开始时间 开始时间
T

tseug

Unregistered / Unconfirmed
GUEST, unregistred user!
欢迎继续介绍有关有关加密破解知识,[:D]
 
嘿嘿,居然有分拿....

我也不知道从哪里说起,最好提问题吧。

说一下现在DFW的朋友写软件注册的最大缺点

function CheckIfRegisted(Name, RegCode: string): boolean;
begin
aa:= 读出储存在注册表或者文件的加密值();
aa:= 超复杂算法解压(aa);

bb:= 超复杂加密算法(Name, RegCode);

if a = b then Result:= True
else Result:= False;
end;

program aaa;
begin
if CheckIfRegisted('白河愁', '12345') then showmessage('注册成功')
else showmessage('注册失败');
end;
 
上面程序包含 2 个致命缺点。

1 明文比较注册。
2 Bool 判断是否注册。

含有以上代码基本就是秒杀。
 
贴些之前的讨论

来自:tseug, 时间:2007-6-13 15:10:58, ID:3797839
to 白河愁:
别光自己研究了,给大家讲讲课,介绍一下软件加密、解密的最新进展,我另外开个帖子
给你分。老咯,10多年不碰这些东西了,落伍了,[:(]


来自:白河愁, 时间:2007-6-13 15:57:04, ID:3797865 | 编辑
我破解只是出于兴趣,如果谁有兴趣,我可以告诉他怎么样加密才算比较有效的。

现在流行的技术是使用 VM, 恐怕不太好解释,上次帮别人写论文那教授完全不懂...


来自:tseug, 时间:2007-6-13 16:48:25, ID:3797924
VM 也是多年前就用的了,当年在DOS下就有人用虚拟机实现一些加密算法,可以有效地
抗静态分析,而且动态跟踪的难度也比较大。

教授不懂你说的很正常,你就当没说明白吧,呵呵。当年上学时我跟教操作系统的老师
谈起386支持保护模式,支持段、页式内存管理、支持任务调度,对他说,如果我们
利用386的功能写点代码实现内存管理、IO管理、任务调度,可以实现一个小小的操作
系统核心了。他居然一脸惊诧地说386就能支持这些?你怎么知道的?从此我再也不
跟他谈论这些了。


来自:白河愁, 时间:2007-6-13 17:10:46, ID:3797948 | 编辑
VM最大的缺点就是缓慢,所以以前流行不起了,强度太小的话分析还是相对容易的,但如果5字节一个语句变成1K,那要分析就真的十分困难了,所以也只有现在的机器配置能实现这个东西。DOS下如果不用保护模式,光是各种限制就十分头痛了,不要说 VM了。

关于老师我多年得出的经验就是无论职称有多高都是一个草包。


来自:tseug, 时间:2007-6-13 17:30:37, ID:3797965
不考虑效率的话,现在用高级语言写一个VM不算太难,不知道现在的加密用的VM多
是基于哪种架构的?目前的一些通用加密软件加壳方式有什么新进展吗?用VM方式
加密的应用程序会不会很容易被分析出来加密模式?


来自:白河愁, 时间:2007-6-13 18:06:02, ID:3797987 | 编辑
写一个不太难,不过难度就在于如何应用于 SDK,比如
{$I ENC_BEGIN.INC}
for i:= 1 to 100 do
sum:= sum + 1;
{$I ENC_END.INC}
这样写后出来的程序编译后,这部分代码可以无缝变成 VM.
这里涉及分析代码增加段区空间等一系列麻烦东西,还要考虑兼容性之类的,很麻烦。

你说的架构是什么?如果是CPU的话一般都是模拟RISC指令集。


来自:tseug, 时间:2007-6-14 7:25:56, ID:3798167
我的意思就是VM模拟的CPU是RISC还是CISC的;是栈式的还是寄存器式的,如果是基于
寄存器方式,他的寄存器是如何约定的;是否需要支持IO,以及IO是采用内存映射还是
独立的IO指令实现等等。
另外,实现时是采用纯软件虚拟,还是利用x86的保护模式特性?


来自:jfzjm, 时间:2007-6-15 13:03:20, ID:3798915
如果大家都来做破解了,那么就会有很多人跟楼主的心一样都拔凉拔凉的了。


来自:白河愁, 时间:2007-6-15 13:40:21, ID:3798928 | 编辑
to tseug:
架构其实不成问题,喜欢RISC还是CISC都可以,反正程序是自己写的,喜欢的话还可以写个混合模式来切换.堆栈和寄存器也是一样,有没有完全是自己决定,不过一般都是两者都有的.
其实就等于自己开发一种新型硬件,但由于是虚拟的,所以完全不受物理和技术限制,所以IO是否支持,多少位一个,有多少个也就是随你喜欢而已,反正映射到内存里就行了.当然独立 IO 也是可以的,但是没有必要吧?一般都是纯软件虚拟,虽然可能比较慢,但是也比较好写.如果用x86特性,想要移植就不那么容易了,还要为这个特性可能某些东西要麻烦些.

to jfzjm:
不可能大家都来做破解的,作为普通程序员 70% 以上不懂汇编,90% 以上不会精通汇编,所以注定不会有大家都来破解的情况.
 
含有以上代码基本就是秒杀。

可否告知怎样秒杀?
 
function CheckIfRegisted(Name, RegCode: string): boolean;

返回值通过 eax 传递。而调用大概是这样
mov eax, [xxxx]
mov ecx, [yyyy]
call CheckIfRegisted
if CheckIfRegisted('白河愁', '12345') then showmessage('注册成功')
else showmessage('注册失败');
cmp eax, 0
jnz xxxxx
.....
改成
nop
nop
mov eax, 1
cmp eax, 0
jnz xxxxx
.....

或者
cmp eax, 0
jmp xxxxx <- 著名的 1 字节 TNT
 
动态跟踪一下,直接把那个74 xx或75 xx改成eb xx
 
首先声明一下本人是个菜鸟!
想要问一下白兄两个问题
1.你是用什么工具改写exe的汇编代码
2.是否所有kernal32.dll中的函数都可以被hook

万分感谢!
 
1 随便什么工具都可以,常用是Winhex, 不过如果你问跟踪的话, Delphi 自己足矣。
2 理论上所有东西都可以 Hook
 
佩服佩服,看来白河悉兄是高手了,白兄的那句,
to jfzjm:
不可能大家都来做破解的,作为普通程序员 70% 以上不懂汇编,90% 以上不会精通汇编,所以注定不会有大家都来破解的情况.
的确是这是样啊,这汇编一般人看起来,头会发麻.
 
所以顺便卖下广告,对加密又哟求的兄弟可以考虑使用我的加密方案,很便宜,半卖半送的。
 
正想请教
我想判断完后,再清掉内存,可发现怎么都清不干净,后来就只好在判断<>的时候退出程序,请问题这样可以吗?我就想,是不是可以判断时中断,请教就什么好的办法吗?
谢谢
 
当然不可以。如果你反汇编来看你写的代码,就知道什么时候某个string会被复制多出一份,就算你清理了一份,可能还会有其它你不知道的有生存周期指针再内存。
解决方法就是只用一份实例,然后全程都在 PChar 中操作。
不过其实也没用,只要在内存中有机会出现明文,就有可能被知道。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部