科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道扭曲变换加密 防止软件破解全攻略(3)

扭曲变换加密 防止软件破解全攻略(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

加壳工具的工作原理,就是把可执行文件的代码与数据都进行加密变换,作为数据存放。生成的目标文件入口代码是加壳软件准备好的防跟踪代码。

作者:论坛整理 来源:zdnet网络安全 2007年12月18日

关键字: 杀毒软件 破解 加密

  • 评论
  • 分享微博
  • 分享邮件

这里出现了call和ret,但又不是一般所期望的那种。这里的call不代表你发现了一个函数调用。这里的ret不代表是一个函数的结束。

* 使用堆栈代替寄存器。比如:

MOV     EAX, DWORD PTR [ECX+0AD8h] 
PUSH    EAX 
MOV     ECX, DWORD PTR [EAX]可以写作: 
PUSH    EAX 
PUSH    ECX 
MOV     EAX, DWORD PTR [ESP] 
ADD     EAX, 0AD8h 
MOV     EAX, DWORD PTR [EAX] 
MOV     DWORD PTR [ESP+04h], EAX 
PUSH    DWORD PTR [ESP+04h] 
MOV     EAX, DWORD PTR [ESP] 
MOV     DWORD PTR [ESP+08h], EAX 
MOV     EAX, DWORD PTR [ESP] 
MOV     EAX, DWORD PTR [EAX] 
MOV     DWORD PTR [ESP+04h], EAX 
MOV     EAX, DWORD PTR [ESP] 
MOV     ECX, DWORD PTR [ESP+04h] 
      ADD     ESP, 08h

你能看懂吗?很明显,这个变换是不可逆变换。因为它本来使用了哪个寄存器,已经没有办法知道了。

* ……还可以想出很多扭曲变换的方法。化繁为简只有一种方法,化简为繁可以有无穷多种方法。还有一些功能:

* 在C语言中,使用 #pragma code_seg(".code$curve_NoChange") 来指示后面的代码不做任何加密。因为有时候有些代码含有大量的循环,加密它会严重影响效率。

* 在C语言中,使用 #pragma code_seg(".code$curve_Max") 来指示后面的代码重点加密。比如后面是与注册算法相关。

现在的扭曲变换器我叫它1.0版,已经非常稳定了。我用它把VC6的库文件LIB都处理了一遍,再用LIB.exe工具写回LIB文件中,我们就有了一套加密后的库。如果用这套库来LINK你的软件,分析者就很难从汇编中找到哪个是printf哪个是strcpy,IDA也无法识别MFC静态链接的库函数了。能把VC6的库都加密一遍不出错,我相信它已经很强壮很稳定了。

用它来加密我们做的一个共享软件,就再也没人写出注册机了。去读懂大量的经过以上变换的代码是不可想象的。但还是有人暴破了,真佩服他。我会不断丰富加密方法,让暴破者都放弃。

现在的扭曲变换器还只支持VC6使用的COFF格式的OBJ,下一步,要分析一下VS2005的OBJ格式,尽快支持它。

有几点:

* 本软件暂时不对外发布,只自己使用。如果有朋友想对自己的代码加密,可以把OBJ文件发给我加密。防止所有的软件都用这个加密,我们会IDA的就没饭吃了 :(

* 现在只支持VC6的OBJ格式,就是 COFF. 下一步想支持VS2005的OBJ格式,遇到了问题。VS2005的debug编译OBJ还是 COFF, 但 release 编译的OBJ就不知道是什么格式了,找不到资料。有哪位朋友能帮助解决一下这个问题?谢谢。

我们以用户名 12345678 错误的注册码 33333333 为例题,在40147E处下断。我们可以看到,程序把我们的注册码算成了16进制的 12 12 12 12 AF AF AF AF 然后后面继续,在40180A处把我们的注册码算成 15 16 17 18 B6 B7 B8 B9。然后在 405310 把我们的用户名展成 31 32 33 34 35 36 37 38。

到此处为止,在堆栈里,把我们的用户名、注册码展成堆栈地址 12FF18。

假注册码部分16进制:32 12 12 12 AF AF AF AF 15 16 17 18 B6 B7 B8 B9 1D 1E 1F 20 BE BF C0 C1 25 26 27 28 C6 C7 C8 00。

用户名部分:31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38 31 32 33 34 35 36 37。

展开后就是用户名与注册码混合运算了,在40226A 处可以看到运算的结果(这个过程最为复杂,的确没时间仔细分析,所以没细看)在 4083DD 处我们可以看到 SUB EAX,3467ABDE 这就是爆破口,把他改成 MOV EAX,00爆破成功!!!!反正就是爆破 4083DD处,把他改为 B8 00 00 00 00, 运行就OK了!!!

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章