2007年5月3日星期四

如何读取硬盘的序列号

    硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用 CPU的I/O指令操作硬盘控制器,读取的方法如下面的C语言程序所示:
     static int WaitIde()
     {
        int al;
        while ((al=inp(0x1F7)) >=0x80) ;
        return al;
    }
    static void ReadIDE()
    {
        int al;
        int i;
        WORD pw[256];
        WaitIde();
        outp(0x1F6,0xA0);
        al = WaitIde();
        if ((al&0x50)!=0x50)
            return;
        outp(0x1F6,0xA0);
        outp(0x1F7,0xEC);
        al = WaitIde();
        if ((al&0x58)!=0x58)
            return;
        for (i=0;i< 256;i++)
            pw[i] = inpw(0x1F0);
    } 
 

张志强
2007-05-03

使用OpenSSL实现证书的管理

1 OpenSSL概述
  目前比较流行的认证服务器之一是OpenSSL认证服务器。OpenSSL项目在Eric Young开发的SSLeay包的基础上,开发一个健壮的、商业等级的、开放源码的工具包用强大的加密算法来实现安全的socket层和传输层安全性,这个项目由全世界的志源者管理和开发OpenSSL工具包和相关的文档[6]。它提供了众多而且复杂的API函数,可惜的是,目前它的文档不全,只能够程序员自已多做工作。它的网址是:http://www.openssl.org。
2 为CA创建一个RSA私钥
  #openssl genrsa �Cdes3 �Cout �Cca.key 1024
  系统提示输入PEM pass pharse,也就是密码。生成ca.key文件,可以将文件的属性改为400,并放在安全的地方。
3利用CA的RSA私钥创建一个自签名的CA证书
  创建一个自签名的证书(Selfsigned certificate)运行req命令,该命令生成一个ca.crt。
  #openssl req �Cnew �Cx509 �Cdays 3650 �Ckey ca.key �Cout ca.crt
  然后系统提示输入国家代号、省份名称、城市名称、公司名称、部门名称、你的姓名及Email地址,这样一张自签名的CA证书就制作完成。
4为客户颁发证书
  为客户创建证书,先用genrsa命令生成的私钥,用req命令生成证书签署请求CSR。
  #openssl genrsa �Cdes3 �Cout client.key 1024
  #openssl req �Cnew �Ckey client.key �Cout client.csr这里也要输入个人的信息。
  然后用sign.sh签署证书。
  #./sigh.sh client.crt
  这样由CA签发的证书就制作完成。
5撤消证书
  要吊消证书可以使用openssl的ca命令,它可以对证书进行吊消、加进CRL及CRL有关的其它一些处理。
  要吊消证书可以简单地使用以下命令:
  #openssl ca �Crevoke 证书文件名
  这时数据库被更新证书被标记上吊消的标志,需要生成新的证书吊消列表:
  #openssl ca -gencrl -config /etc/openssl.cnf -out crl/sopac-ca.crl
  证书吊消列表文件要在WEB站点上可以使用,必须将crldays或crlhours和crlexts加到证书中:
  openssl ca -gencrl -config /etc/openssl.cnf -crldays 7 -crlexts crl_ext -out crl/sopac-ca.crl
6证书的更新
  当用户发送他旧的证书证书或要在原有私钥的基础上建新的证书,所以必须吊消旧的证书然后再签发新的证书。要找到证书,可以用户的DN(区别名)在index.txt文件中查到序列号xx,用cert/<xx>.pem做为证书吊消的依据。你必须手动签发证书,因为开始时间和结束时间以便确定新证书的有效性。
  #openssl ca -config /etc/openssl.cnf -policy policy_anything -out newcert.pem -infiles newreq.pem -startdate [now]  -enddate [previous enddate+365days]
  用正确的时间替换 [now]和[previous enddate+365days]。
7查看证书
  #openssl x509 -in cert.pem -noout �Ctext
结束语
  数字证书相当于电子身份证,X.509证书是由CCITT X.509国际标准所规定,目前在电子商务飞速发展的今天应用相当的广泛,交易支付过程中,参与各方必须利用认证中心签发的数码证书来证明各自的身份,数字证书可以进行数字签名,支持不可否认性。电子交易中,无论数字时间戳还是数字证书的发放,都不是靠交易的双方自己来完成,而需要设立一个可靠的第三方机构,进行有效、快速、规范化的认证服务。CA(Certfication Authofity)就是这样一个机构,用openssl论证服务器进行证书发放,证书更新,证书撤销,建立自己的CA论证中心,开发费用低,代码健壮,用强大的加密算法来保证信息传输的安全,它将有力地促进我国电子商务的发展。
 

张志强
2007-05-03

2007年4月27日星期五

如何从DLL文件中导出LIB文件?

    由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或.lib文件,而作为VC隐式链接到DLL (implicitly   link   to   the   DLL)调用,这些却是必需的。本文将主要讨论在没有源文件及.lib输入库文件或欲调用Windows未公开函数的情况下重建.Lib文件的方法。在建立之前,我们首先要了解一下DLL输出函数的几种方式。    
  一、从DLL中输出函数的方式(calling   conventions)    
  _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。    
  _stdcall是Pascal程序的缺省调用方式,通常用于Win32   Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。    
  _fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。    
  用VC建立一个空的动态链接库,并加入以下三个文件:    
  //noname.h     动态链接库头文件    
  extern   "C"   void   _stdcall     stdcallproc(void);    
  extern   "C"   void     _cdecl   cdeclproc(void);    
  extern   "C"   void     _fastcall   fastcallproc(void);    
  //noname.cpp       动态链接库实现文件    
  #include   <windows.h>    
  extern   "C"   void   _stdcall     stdcallproc(void)    
  {   MessageBox(0,"stdcall   function","dll   call",0);    
  }    
  extern   "C"   void     _cdecl   cdeclproc(void)    
  {   MessageBox(0,"cdecl   function   ","dll   call",0);    
  }    
  extern   "C"   void     _fastcall   fastcallproc(void)    
  {   MessageBox(0,"fastcall   function   ","dll   call",0);    
  }    
  //noname.def     动态链接库输出函数定义    
  LIBRARY             "noname"    
  EXPORTS    
  stdcallproc   @1   noname    
  cdeclproc     @2    
  fastcallproc   @3    
  编译后生成noname.lib,输出函数_cdeclproc,_stdcallproc@0,@fastcallproc@0;生成的 noname.dll在Exescope等PE格式的工具中只能看到cdeclproc和fastcallproc函数,因为stdcallproc被指定noname属性,没有名字输出,类似于Windows未公开函数。    
  二、可执行程序调用DLL的方式    
  可执行程序可以采用隐式链接(implicit   linking)或显式链接(explicit   linking)两种方式调用一个DLL。    
  使用显式链接时,使用DLL的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary),因为不是本文重点,具体例程请参考有关文档。显然,在调用大量的函数时这种方法会很不方便。    
  使用隐式链接时,可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。    
  三、重建.Lib输入库文件    
  根据微软的建议,要想隐式地链接到一个DLL,可执行程序必须从DLL的提供者那儿得到一个包含输出函数的头文件(.h文件)、一个用于链接的输入库(.lib文件)。愿望是很好的,但是一般情况下,我们都无法得到第三方动态链接库的输入库文件,或者我们需要调用Windows未公开函数。如果你是使用Delphi或Visual   Basic开发程序,那么,你只要简单的申明一下函数和输出库就可以了。但是,使用VC的朋友们只好重建.Lib文件了。    
  1.删掉第一步中生成的noname.lib(假设我们没有这个文件)。    
  2.用微软的DumpBin.exe:dumpbin   /exports   noname.dll>noname.def,留下noname.def文件的输出段:    
          ordinal   hint   RVA             name    
                      2         0   00001005   cdeclproc    
                      3         1   0000100F   fastcallproc    
                      1             0000100A   [NONAME]    
  修改为:    
  LIBRARY             "noname"    
  EXPORTS    
  cdeclproc         @2    
  fastcallproc   @3    
  nonameproc       @1   //请注意与第一步中noname.def的区别:nonameproc可以自己指定为任何名字    
  再执行lib.exe   /def:noname.def即可生成noname.lib文件(但如果这个动态链接库不仅仅包含_cdecl类型函数,那么这个noname.lib还不是最终可用的.lib文件,具体请看下文)。    
  3.建立一个名为DllCaller的Win32控制台程序,将刚才生成的noname.dll和noname.lib拷入DllCallerdebug目录。    
  //DllCaller.cpp    
  //声明函数原型    
  extern   "C"   void   _stdcall     nonameproc(void);    
  extern   "C"   void     _cdecl   cdeclproc(void);    
  extern   "C"   void     _fastcall   fastcallproc(void);    
  //链接输入库文件    
  #pragma   comment(lib,"debug\noname.lib")    
  int   main(int   argc,   char*   argv[])    
  {    
          nonameproc();    
          cdeclproc();    
          fastcallproc();    
          return   0;    
  }    
  编译器产生如下错误:    
  DllCaller.obj   :   error   LNK2001:   unresolved   external   symbol   @fastcallproc@0    
  DllCaller.obj   :   error   LNK2001:   unresolved   external   symbol   _nonameproc@0    
  根据错误提示信息将noname.def更改如下:    
  @fastcallproc@0   @3    
  nonameproc@0   @1    
  重新生成noname.lib,即可重新编译DllCaller.exe。    
  四、调用Windows未公开函数    
  根据以上分析,下面给出一个简单的调用Window98系统Shell32.DLL中序号为60的未公开函数,执行后将出现重新启动的对话框。    
  //shell32.def,据此生成Shell32.LIB    
  LIBRARY             "shell32"    
  EXPORTS    
  SHShutDownDialog@4   @60    
   
  //   DllCaller.cpp:调用未公开函数的控制台程序    
  //函数声明    
  extern   "C"   long     _stdcall   SHShutDownDialog(long   lShutdown);    
  //链接输入库文件    
  #pragma   comment(lib,"debug\shell32.lib")    
  int   main(int   argc,char*   argv[])    
  {    
        SHShutDownDialog(0);    
  return   0;    
  }     
 
 

张志强
2007-04-27

2007年4月20日星期五

美国枪击案追踪报道:专家准备破解赵承熙电脑

美国刑事侦破电脑专家将对赵承熙生前使用的电脑进行"解剖",使人们可以更多地了解赵承熙在虚拟世界的状态.

专家卡鲁索说,通过调查,他们可以掌握赵承熙上过哪些网站,都干了些什么,是否浏览图片,还可以查看他生前收发过的电子邮件.他们还能恢复那些被删到垃圾箱中的文档.

调查人员将利用这些文件、邮件和聊天记录来研究赵承熙的行为和作案动机.

卡鲁索表示,这是一个较长的过程,他们将彻底检查赵承熙电脑上的一切信息,确保毫无遗漏.

虽然弗吉尼亚理工大学枪击案中遇难者家人无法看到凶手被绳之以法,但从赵承熙电脑上恢复的数据可以帮助解开他们心头的谜团:这一切都是为什么?

 
 

张志强
2007-04-20

2007年4月8日星期日

得到类数据成员的位置

    类的数据成员的布局是按某种顺序的,有一个相对与类的头位子的偏移量,这个偏移量的计算方法如下:
     
        (size_t)&(((classname*)0)->members)

        classname 是一个类名,members是类中任何一个数据成员的名字。0在这里是一个地址,这是一个保留地址,它不能作为左值,但可以作为右值,去提取其中的对象。
        在0地址位,构造了一个classname的结构布局。

        在使用中去每次写这个表达式还是很麻烦的。可以用个宏将其包起来,如下

        #difine offsetof( ClassName, MemberName ) (size_t)&(((classname*)0)->members)

        其实这个宏在windows和linux平台下都以提供了。
 

张志强
2007-04-08

2007年4月6日星期五

如何获得物理内存大小

The GlobalMemoryStatus function obtains information about the system's current usage of both physical and virtual memory.

 

张志强
2007-04-06

2007年4月5日星期四

建行用户网上银行16万巨款被盗案告破

 
网上银行账户内16万余元莫名"流失",原来是被害人网上购物浏览图片时"顺道"将病毒也引进了电脑。日前,本市警方在云南警方的大力协助下,一举侦破"3・10"特大网上盗窃案,犯罪嫌疑人白某和葛某在昆明落入法网。据了解,这是迄今为止本市警方破获的最大一起网上盗窃案。昨天,警方向外界进行了情况通报。

3月10日中午,市民蔡先生像往常一样,上网查看自己银证通账户情况。意想不到的事情发生了,蔡先生发现账户下显示资金余额只有36.62元,而不是本应该有的16万余元。蔡先生马上联系建行,客服小姐说,钱都通过网上银行转账转走了。

卢湾警方接报后,迅速成立专案组。在分析案情和银行反馈信息并向被害人了解了上网情况后,侦查员进行了综合判断,认为被害人的电脑极有可能被黑客侵入并安装木马程序,从而导致银行账号、密码和认证证书被盗,导致账号内存款"流失"。侦查员通过查询银行转账记录,查明被害人的两张信用卡被犯罪嫌疑人通过网上银行分11次转出人民币共计163014元(不包括转账手续费),被盗资金全部转入一个开户在云南昆明的建设银行活期账户内并已被人取走。

据此,警方迅速派员赴云南昆明开展侦查工作。在当地警方的大力协助下,侦查员很快查明犯罪嫌疑人实施网上盗划的行为地在昆明市金沙小区金春苑某室内,并进一步查明该室实际居住人是青年男子白某和青年女子葛某。经与银行监控录像比对,确定白某即为取款人。

2007年3月28日晚,侦查员通过守候伏击顺利抓获了白某和葛某,并查获了作案用的电脑和部分赃物。

经查,犯罪嫌疑人白某今年31岁,葛某今年27岁。其中白某是某公司的软件开发人员。两人到案后,如实供述了经事先预谋,在网上利用发送照片之际,将携带木马程序的病毒植入被害人的电脑,进而获取了被害人的银行账号、密码和认证证书,同时修改了被害人的密码,盗取被害人银行账户内人民币的犯罪事实。

目前,两人已被依法刑事拘留,案件在进一步侦查中。
 
 
 
呵呵,我关心使用了什么取证方法,调查结果在法庭上的认可程度!!
 
 

张志强
2007-04-05