功能选单
首 页
日志首页
发表日志
我的Blog
资源分享
生活随笔
黑客技术
VC学习
WebService
ASP学习
Linux学习
VS and C#
Oralce
GIS相关
网络通信
工作学习
功能选单
站点日历
97 2008 - 7 8:
  12345
6789101112
13141516171819
20212223242526
2728293031
站点统计
日志:922 篇
评论:81 篇


使用RSS邮天下订阅
站点归档
2008年6月日志:12 篇
2008年5月日志:14 篇
2008年4月日志:22 篇
2008年3月日志:36 篇
2008年2月日志:17 篇
最新评论
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
浣犱笉鍙啀閿欒繃鐨...
日志搜索

 标题   内容

浏览模式: 正常 | 列表| 阅读次数

[置顶] 为H31家园创建的一个QQ群!欢迎大家加入学习!   [ 2005-3-22 |  本站原创 ]
[置顶] 提供H31 Access2.0美化版下载   [ 2005-3-6 |  本站原创 ]
晴天 .NET软件保护与破解浅析[转]   [ 2008-6-21 |  本站原创 ]
 
魔法表情

.NET软件保护与破解浅析     网上很少看到有关.NET软件保护与破解的文章,刚好分析了几款有一定代表性的.NET软件,于是便将他们的保护措施和如何破解方法记录下来,以便和大家交流。在开始之前,首先申明:本文中反编译和破解的软件只是为学习和研究的目的,请勿非法使用。


    .NET平台下的软件(exe,dll文件)叫做程序集。它使用一种扩展的PE格式文件来保存。.NET程序集与以往的应用程序不同,它保存的是Microsoft中间语言指令(MSIL)和元数据(Metadata),而不是机器指令和数据。.NET程序集在运行的时候才会动态将Microsoft中间语言编译成机器指令执行。所以我们不能简单的使用反汇编来解读程序逻辑。初学者明白这点很重要。不过幸运的是,.NET程序集是一种自描述的组件,可以用它自描述的特性反编译出高级程序代码(如c#,vb.net),这比汇编代码更容易读懂得多。即使不反编译成高级程序代码,Microsoft中间语言本身也是一种抽象、基于堆栈的面向对象伪汇编语言。它本身也比汇编代码更容易读懂。在代码易阅读这点上,.NET程序更容易遭到破解。不过,有矛必有盾,现在有很多产品都可以混淆.NET代码,使得反编译出来后的结果也同样没有可读性。

    .NET程序集与以往的应用程序另一个不同点在于它可以使用强名称签名来防止自身被篡改。使用强名称签名的程序集包含公钥和数字签名信息。.NET在执行具有强名称的程序集前会对它进行安全检查,以防止它被非法篡改。这一点很厉害,它限制了我们通过修改程序代码(爆破)来破解程序的方法。

    .NET平台还提供了很多安全相关的类库,利用这些类库可以写成很强壮的注册算法(如使用RSA对注册文件签名,只有使用私钥才能产生正确的注册码)。这些算法破解者很难破解。

    另外,现在还出现了很多其他的保护措施,如流程混淆,元数据加密,加密壳,虚拟机技术,编译为本地代码等保护手段。综合使用这些保护手段,会使破解难道大幅度提高。

    软件破解一般有两种方式。一种方式为不对软件做出修改,只是分析软件注册算法,根据注册算法写出生成正确注册码的注册机程序完成注册过程。第二种方式需要对软件逻辑作出修改,使软件正常判断注册逻辑失效,总是认为软件已经注册成功。这种方式就是通常说的“爆破”。由于第二种方法需要修改软件逻辑,不能保证软件修改后的行为和原来一样,故一般只有在第一种方式尝试失败后才使用第二种方式。

    下面,我将通过对两款软件的分析来讲解.NET平台下软件的保护措施和破解方法。

准备的工具:
1,Reflector http://www.aisto.com/roeder/dotnet/
.NET平台下极好的反编译工具。


阅读全文……
作者:admin | 分类:VS and C# | 评论:0 | 查看:46 | 
晴天 关于CAB在ASP内的调用与使用[转]   [ 2008-6-21 |  本站原创 ]
 
魔法表情

具体代码如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<% on error resume next%>
<!--#include file="../Connections/ds.asp" -->


阅读全文……
作者:admin | 分类:ASP学习 | 评论:0 | 查看:30 | 
晴天 SQLServer2000的“数据库维护计划”[转]   [ 2008-6-21 |  本站原创 ]
 
魔法表情

具体实现步骤
  目录
  第一步:打开SQL Server“企业管理器”窗体
  第二步:找到“数据库维护计划”功能


阅读全文……
作者:admin | 分类:Oralce | 评论:0 | 查看:57 | 
晴天 重装grub的方法及grub相关配置   [ 2008-6-6 |  本站原创 ]
 
魔法表情

  重装系统的时候,MBR都会被重写,这样原来的GRUB或LILO 就会不见了,或者由于某些原因使原来的GRUB不见了,就得重装GRUB.
        重装GRUB的方法,任选一种试试:
        1.用安装光盘启动,选择升级安装,再只选安装GRUB.
        2.用安装光盘启动,到BOOT 那里输入 linux rescue     进入救援模式,到出现#命令提示符时输入 chroot   /mnt/sysimage   之后再输入 grub-install   /dev/hda


阅读全文……
作者:admin | 分类:Linux学习 | 评论:0 | 查看:76 | 
晴天 于梯度方向图的汽车牌照定位[收集]   [ 2008-6-6 |  本站原创 ]
 
魔法表情

         由梯度公式获取梯度纹理方向图
用Sobel算子分别求取水平方向、垂直方向、倾斜方向(包括45度和135度)的梯度分量,分别用Gx、Gy、Gxy、Gyx表示。
将车牌灰度图分成若干块WxW(5x5)进行分块处理,其计算量减少为对整幅图象的25倍,速度快、计算少能满足系统的实时性要求。
再分别对分块的灰度图利用已求取的Gx、Gy、Gxy、Gyx求取每块的局部方向vx、vy。

?根据反正切函数求取车牌图象的方向角度值。


阅读全文……
作者:admin | 分类:VC学习 | 评论:0 | 查看:66 | 
晴天 基于四叉树空间划分的地形实时渲染方法[收集]   [ 2008-6-6 |  本站原创 ]
 
魔法表情

地形是计算机图形的一个重要组成部分,而它又具有特殊的形态。地形往往覆盖面积极广,且精度要求很高,使得我们必须用许多多边形来描述。这样的特点使得我们不能像对待其他普通模型那样对待地形。要想实时地渲染地形,我们需要一些特殊的方法。
    地形渲染一直以来都是计算机图形学中一个重要的研究领域。并且在这一方面已经诞生了许多优秀的算法。其中包括基于体素的渲染方法,也有基于多边形的渲染方法。早期的游戏,如三角洲特种部队就是采用体素渲染法的成功例子。体素法类似光线追踪渲染,它从屏幕空间出发,找到地形与屏幕像素发出的射线交点,然后确定该像素的颜色。这种方法不依赖具体的图形硬件,整个渲染过程完全使用CPU处理,因此它不能使用现代硬件来加速,并且对于一个场景来说,往往不只是地形,还有其他使用多边形描述的物体,体素法渲染的图像很难与硬件渲染的多边形进行混合,因此这种方法现在用得极少。而多边形渲染方法则成为一种主流。选择多边形来描述和渲染地形有很多的理由和优点。最重要的是它能够很好地使用硬件加速,并且能够和其他多边形对象一起统一管理。

    已有大量优秀的基于多边形的地形渲染算法。比较经典的算法有M. Duchaineau等人提出ROAM算法。这个算法采用一棵三角二*树来描述整个地形。一个地形在最初的层次上由两个较大的等腰直角三角形组成,这两个等腰直角三角形可以被不断地细分来展现地形的更多细节。每一次细分过程都向直角三角形的斜边的中点处增加一个由高程数据所描述的顶点,该点将所在的直角三角形一分为二,同时该算法也定义了一些规则来保证地形中不会因相邻两个三角形细节层次的不同而出现裂缝。这个算法已被许多游戏所采用。还有一类算法,通过将地形在X-Z投影面上不断地规则细分来得到不同的细节,这就是本文要介绍的四*树空间划分算法。另外,最新提出的一个地形算法也不得不提,Hugues Hoppe在2004年提出的几何裁剪图方法(Geometry Clipmaps),算法使用了最新硬件所支持的顶点纹理来定义地形的外观,并且对于距离摄影机不同远近的地方采用不同的纹理层,最大限度地使用硬件加速了地形渲染的过程。这个方法听起来非常美妙,但它目前只被较少的硬件支持。因为顶点纹理是Shader Model 3.0才支持的功能,也就是说只有DirectX 9.0c级别的显卡才能支持这种算法。这对于某些有普及性要求的图形应用程序,尤其是对游戏来讲不是一件好的事情。因此大多数人现在还在使用经典的地形渲染方法。

    首先,基于四*树的地形渲染方法使用高程数据作为数据源。且算法要求高程数据的大小必须为2n+1的正方形。所谓高程数据,即色彩范围在0-255的灰度图片,不同的灰度代表了不同的高度值。如果某高程数据指出这个高程数据最高处的Y坐标值是4000,那么在高程数据中一个值为255的像素点就表示这个点所代表的地形区域的高度是4000,同理如果该像素值是127那么就表示这个点所代表的地形区域的高度是4000×(127/255)=2000。高程数据的每个像素都对应所渲染网格中的一个顶点。另外还有一个参数描述顶点与顶点之间的水平距离,以及一个描述最大高度的参数。因此地形的基本数据结构如下:

    struct Terrain
    {
        char **DEM; //一个描述高程数据的二维数组


阅读全文……
作者:admin | 分类:VC学习 | 评论:0 | 查看:56 | 
晴天 Linux环境进程间通信-共享内存[收集]   [ 2008-6-6 |  本站原创 ]
 
魔法表情

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。linux发行版本如Redhat 8.0支持mmap()系统调用及系统V共享内存,但还没实现Posix共享内存,本文将主要介绍mmap()系统调用及系统V共享内存API的原理及应用。

一、内核怎样保证各个进程寻址到同一个共享内存区域的内存页面

1、page cache及swap cache中页面的区分:一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述。struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构。page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的。

2、文件与address_space结构的对应:一个具体的文件在打开后,内核会在内存中为之建立一个struct inode结构,其中的i_mapping域指向一个address_space结构。这样,一个文件就对应一个address_space结构,一个address_space与一个偏移量能够确定一个page cache 或swap cache中的一个页面。因此,当要寻址某个数据时,很容易根据给定的文件及数据在文件内的偏移量而找到相应的页面。

3、进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。因此,第一次访问该空间时,会引发一个缺页异常。

4、对于共享内存映射情况,缺页异常处理程序首先在swap cache中寻找目标页(符合address_space以及偏移量的物理页),如果找到,则直接返回地址;如果没有找到,则判断该页是否在交换区(swap area),如果在,则执行一个换入操作;如果上述两种情况都不满足,处理程序将分配新的物理页面,并把它插入到page cache中。进程最终将更新进程页表。
注:对于映射普通文件情况(非共享映射),缺页异常处理程序首先会在page cache中根据address_space以及数据偏移量寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新。

5、所有进程在映射同一个共享内存区域时,情况都一样,在建立线性地址与物理地址之间的映射之后,不论进程各自的返回地址如何,实际访问的必然是同一个共享内存区域对应的物理页面。
注:一个共享内存区域可以看作是特殊文件系统shm中的一个文件,shm的安装点在交换区上。

上面涉及到了一些数据结构,围绕数据结构理解问题会容易一些。

 

二、mmap()及其相关系统调用

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。

1、mmap()系统调用形式如下:


阅读全文……
作者:admin | 分类:Linux学习 | 评论:0 | 查看:59 | 
晴天 内存池设计[收集]   [ 2008-6-6 |  本站原创 ]
 
魔法表情

     也许有人会问:内存池是什么呢? 主要用来干什么的?
     大家都知道,C++可以使用指针来操作堆内存以获得高效率的内存访问,一般会使用全局new, delete的内存管理函数来申请和分配内存,但在大量使用内存分配的程序里----比如:网络游戏服务器的消息,每一条消息就分配一块内存,等消息处理完后,又要释放内存,这样来来回回的new, delete操作,效率会大大折扣,因为new,delete函数不可能预先知道你的对象要分配多大空间,每一个都要从当前的堆中寻找一块可用的空间来分配一个对象,最要命的是当你delete后,内存还要重新整理内存块,这样频繁操作将造成低效率结果。
  于是,一个新的思想诞生了,如果当你满足以下条件时,你可以使用内存池来提高效率:
       (1) 当你频繁地操作一类对象时,即你老是new 和 delete


阅读全文……
作者:admin | 分类:网络通信 | 评论:0 | 查看:65 | 
分页:1/92页 97 [1] [2] [3] [4] ... 8: 
返回 前进 回首页 个人控制板 Blog天地 BBS天地 查看文章 Google搜索 联系我们

鄂ICP备05023051号