SafeNet讲座学习笔记
2005-06-29 15:30
239 查看
上周五参加了SafeNet公司的“2005 SafeNet软件保护日”活动并听了相关技术讲座。
通过参加这次讲座,学习到了一些加密狗使用的知识和技巧,总结如下:
一:软件加密中的注意事项:
1.访问狗之后不要立即做判断,可以适当加入一些“垃圾代码”,在判断
狗不正确后,不要立即提示或不提示。例如,许多共享软件是重启程序
后进行验证。
2.重要的字符串不要在程序中以明文出现,应该使用算法动态生成。
例如MyDoom蠕虫的做法:
char rot13c(char c)
{
char u[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char l[] = "abcdefghijklmnopqrstuvwxyz";
char *p;
if ((p = xstrchr(u, c)) != NULL)
return u[((p-u) + 13) % 26];
else if ((p = xstrchr(l, c)) != NULL)
return l[((p-l) + 13) % 26];
else
return c;
}
void rot13(char *buf, const char *in)
{
while (*in)
*buf++ = rot13c(*in++);
*buf = 0;
}
/* "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\Version" */
rot13(tmp, "Fbsgjner\\Zvpebfbsg\\Jvaqbjf\\PheeragIrefvba\\Rkcybere\\PbzQyt32\\Irefvba");
3.应该将从加密狗中读出的数据进行一定运算后,再和相应的数据
做比较。
4.在不影响程序效率的情况下,尽量多写一些查狗的函数,彼此要有区别而且
要使用不同的算法,多一些查狗出错的标志,让这些标志参与运算,在不同
的模块中,使用不同的查狗函数。
5.试用版和正式版要分开,试用版不提供的功能,代码要删掉,使得不可能
利用破解试用版来得到正式版。
6.不要使用明显的接口名称,这样会使解密者更容易找到加密点。可以利用
一些没有明显含义或含义相反的名字来迷惑解密者,尤其是Dll,引出函数
时甚至可以不用函数名。
7.不要固定加密点。固定的加密点容易被解密者跟踪和破解。要给查狗函数
加入一定的随机性,例如,随机的执行某一API函数,或者在狗的存储区中
划定一小块区域作随机读写,读写地址,读写内容,读写长度都可以是随机取值。
8.加密时要把API方式和Shell方式联合使用,这样,能够达到更高的加密强度。
(API方式:即使用加密接口函数的方式。加密接口函数主要是指调用硬件的
接口函数。调用API函数进行加密,可以灵活的设置加密点,隐蔽性较好,
可以具有很高的加密强度。调用API函数进行加密又称内嵌式加密。采用
内嵌式加密还能够方便的做成限制使用次数,使用时间等功能的试用版软件。
接口函数的文件类型包括:OBJ,DLL,OCX,ARX。
Shell方式:外壳技术主要是针对可执行程序而言,使用外壳工具直接对可执行
文件处理后,可执行程序运行时必须依赖某种安全硬件或者许可证,这种方式
同时支持加密重要代码,数字常量和字符串。)
二.安全厂商建议的好的加密方案:
1.作为软件设计的一部分以文字的形式体现出来。即作为软件配置的一部分。
2。文档中要详细说明所使用的软件保护产品情况以及加密点如何设置。
3.文档中要说明使用的加密技巧。
4.能够有效控制硬件狗的初始化过程。
5.能够有效控制硬件狗的分发过程。
三.我自己的一个防止解密者分析程序的方法:
1.将真正的程序加壳(最好是少见的壳或自己写的壳,一般不要用aspack
或UPX之类)后,改掉文件名和相应的扩展名,例如,改为index.dat。
2.写一个引导程序main.exe,调用WinExec函数或CreateProcess函数来运行
index.dat程序,然后引导程序退出,真正的主程序index.dat开始运行。
可将此引导程序中加入大量垃圾数据例如在资源中加入多媒体数据(
mp3,jpeg图片等),尽量使程序看起来大一些,然后再把此引导程序加壳,
最好是和index.dat文件不一样的壳。
3.制作安装程序时,将main.exe设为主程序,包括各种快捷方式等都指向它,
而index.dat只作为一个附带数据文件。
通过参加这次讲座,学习到了一些加密狗使用的知识和技巧,总结如下:
一:软件加密中的注意事项:
1.访问狗之后不要立即做判断,可以适当加入一些“垃圾代码”,在判断
狗不正确后,不要立即提示或不提示。例如,许多共享软件是重启程序
后进行验证。
2.重要的字符串不要在程序中以明文出现,应该使用算法动态生成。
例如MyDoom蠕虫的做法:
char rot13c(char c)
{
char u[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char l[] = "abcdefghijklmnopqrstuvwxyz";
char *p;
if ((p = xstrchr(u, c)) != NULL)
return u[((p-u) + 13) % 26];
else if ((p = xstrchr(l, c)) != NULL)
return l[((p-l) + 13) % 26];
else
return c;
}
void rot13(char *buf, const char *in)
{
while (*in)
*buf++ = rot13c(*in++);
*buf = 0;
}
/* "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\Version" */
rot13(tmp, "Fbsgjner\\Zvpebfbsg\\Jvaqbjf\\PheeragIrefvba\\Rkcybere\\PbzQyt32\\Irefvba");
3.应该将从加密狗中读出的数据进行一定运算后,再和相应的数据
做比较。
4.在不影响程序效率的情况下,尽量多写一些查狗的函数,彼此要有区别而且
要使用不同的算法,多一些查狗出错的标志,让这些标志参与运算,在不同
的模块中,使用不同的查狗函数。
5.试用版和正式版要分开,试用版不提供的功能,代码要删掉,使得不可能
利用破解试用版来得到正式版。
6.不要使用明显的接口名称,这样会使解密者更容易找到加密点。可以利用
一些没有明显含义或含义相反的名字来迷惑解密者,尤其是Dll,引出函数
时甚至可以不用函数名。
7.不要固定加密点。固定的加密点容易被解密者跟踪和破解。要给查狗函数
加入一定的随机性,例如,随机的执行某一API函数,或者在狗的存储区中
划定一小块区域作随机读写,读写地址,读写内容,读写长度都可以是随机取值。
8.加密时要把API方式和Shell方式联合使用,这样,能够达到更高的加密强度。
(API方式:即使用加密接口函数的方式。加密接口函数主要是指调用硬件的
接口函数。调用API函数进行加密,可以灵活的设置加密点,隐蔽性较好,
可以具有很高的加密强度。调用API函数进行加密又称内嵌式加密。采用
内嵌式加密还能够方便的做成限制使用次数,使用时间等功能的试用版软件。
接口函数的文件类型包括:OBJ,DLL,OCX,ARX。
Shell方式:外壳技术主要是针对可执行程序而言,使用外壳工具直接对可执行
文件处理后,可执行程序运行时必须依赖某种安全硬件或者许可证,这种方式
同时支持加密重要代码,数字常量和字符串。)
二.安全厂商建议的好的加密方案:
1.作为软件设计的一部分以文字的形式体现出来。即作为软件配置的一部分。
2。文档中要详细说明所使用的软件保护产品情况以及加密点如何设置。
3.文档中要说明使用的加密技巧。
4.能够有效控制硬件狗的初始化过程。
5.能够有效控制硬件狗的分发过程。
三.我自己的一个防止解密者分析程序的方法:
1.将真正的程序加壳(最好是少见的壳或自己写的壳,一般不要用aspack
或UPX之类)后,改掉文件名和相应的扩展名,例如,改为index.dat。
2.写一个引导程序main.exe,调用WinExec函数或CreateProcess函数来运行
index.dat程序,然后引导程序退出,真正的主程序index.dat开始运行。
可将此引导程序中加入大量垃圾数据例如在资源中加入多媒体数据(
mp3,jpeg图片等),尽量使程序看起来大一些,然后再把此引导程序加壳,
最好是和index.dat文件不一样的壳。
3.制作安装程序时,将main.exe设为主程序,包括各种快捷方式等都指向它,
而index.dat只作为一个附带数据文件。
相关文章推荐
- 如何成为最好的工程师---吴军讲座学习笔记
- 深度学习讲座笔记:Deep Learning for Computer Vision - Andrej Karpathy at Bay Area Deep Learning School
- 孙鑫关于DLL(Dynamic Link Library)动态链接库的视频讲座笔记和学习小结
- C++知识点辨析 孙鑫讲座笔记学习
- 黎怡兰老师讲座——IT人学习、职业规划 笔记
- 如何成为最好的工程师---吴军讲座学习笔记
- Labview学习笔记_如何更改Numberic Control的基数显示
- 【支付系统学习笔记】-二支付系统设计(支付网关设计)
- HTTP 的报文格式和工作流程 学习笔记
- Java学习笔记(18)--关键字this详解
- 学习笔记:利用markdown写readme文档 (Udacity学城)
- python学习笔记之文件操作
- python 学习笔记
- Html学习笔记(入门)
- ant 学习笔记11
- IDL学习笔记(4)-字体设置
- H.264学习笔记6——指数哥伦布编码
- unity3D-游戏/AR/VR在线就业班 C#入门结构体学习笔记
- SpringMVC 学习笔记(五) 基于RESTful的CRUD
- Deep Learning(深度学习)学习笔记整理系列之(三)