关于Access97的密码破解,在很多的网站和杂志上都有过介绍。在这里我简单重复一下。

 

在mdb文件第0x42字节处的13个字节分别与0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13异或后即可得到数据库的密码。但在Access 2000和2002的版本里密钥不再是固定的13个字节.而且加密的方式也有了变化。

 

经过ccrun用一下午的时间研究,终于将Access2000的加密方式搞清楚了。嘿嘿。在此将偶的心得发布,希望对大家有用。

 

我用的分析工具是UltraEdit32 v10.00,编程工具是C++ Builder 6.0。

 

经过用UltraEdit32分析,发现Access2000和Access2002的数据库加密方式相同,所以以下只针对Access2000的mdb文件。还有就是我用的是16进制的数表示,所以前面加了0x,如果你用的是VB或其他,要注意数值哦。

 

首先用AccessXP创建了一个空密码的数据库文件db1.mdb,包含一个表,其中有一个字段,没有填任何数据。保存退出然后复制一份为db2.mdb,以独占方式打开2.mdb,并加上密码1324567890123 保存退出。

 

用UltraEdit32打开这两个数据库,并进行比较。我比较的方法也很简单。在UltraEdit32中,快速的来回点击被打开文件的选项卡(就是在两个文件间来回切换,呵呵。笨办法吧),发现从文件头开始0x42字节处发生变化。

 

 

db1.mdb
00000040h:BC 4E BE 68 EC 37 65 D7 9C FA FE CD 28 E6 2B 25 ;
00000050h:8A 60 6C 07 7B 36 CD E1 DF B1 4F 67 13 43 F7 3C ; 


00000060h:B1 33 0C F2 79 5B AA 26 7C 2A 4F E9 7C 99 05 13 ;
db2.mdb
00000040h:BC 4E 8F 68 DE 37 56 D7 A8 FA CB CD 1E E6 1C 25 ;
00000050h:B2 60 55 07 4B 36 FC E1 ED B1 7C 67 13 43 F7 3C ;

00000060h:B1 33 0C F2 79 5B AA 26 7C 2A 4F E9 7C 99 05 13 ;

 

为了看的清楚些,我把不同的字节加了颜色。看出门道了吧,Access97以后的版本里,密码字节不再是连续存放,而是隔一个字节存一个。并且经过加密。到于解密的方法嘛,还是用老办法“异或”!0xBE ^ 0x8F = 0x31,这正好是Ascii码"1"哦。下一个0xEC ^ 0xDE = 0x32 正好是Ascii码"2",呵呵。一直到最后一个不同的0x4F ^ 0x7C =0x33,将取得的字符合成字符串,便是密码明文“1234567890123",千万不要以为这样就收工了。因为这一次是正好碰对了。呵呵。我刚开始也以为就这么简单,于是用CB做了个小程序,试着解了几个mdb密码都还行,可是试到动网论坛的mdb文件时发现取出来的密码不对,晕了。于是用另外一个取mdb密码的工具看了一下,发现人家的就可以正确的取出密码,是Access2000的格式,于是感觉微软加密的方式还是没研究完。继续工作,用UltraEdit32打开动网论坛的数据库dvbbs.mdb,和我前面的加过密的数据库做比较,发现不同的地方很多。只好一个字节一个字节的试。。。。nnn次以后发现第0x62处的这个字节起着关键作用,暂称之为加密标志。

 

 

db1.mdb //空密码
00000040h:BC 4E BE 68 EC 37 65 D7 9C FA FE CD 28 E6 2B 25 ;
00000050h:8A 60 6C 07 7B 36 CD E1 DF B1 4F 67 13 43 F7 3C ;

00000060h:B1 33 0C F2 79 5B AA 26 7C 2A 4F E9 7C 99 05 13 ;

db2.mdb //密码为:1234567890123
00000040h:BC 4E 8F 68 DE 37 56 D7 A8 FA CB CD 1E E6 1C 25 ;
00000050h:B2 60 55 07 4B 36 FC E1 ED B1 7C 67 13 43 F7 3C ;

00000060h:B1 33 0C F2 79 5B AA 26 7C 2A 4F E9 7C 99 05 13 ;

dvbbs.mdb //密码为:yemeng.net

00000040h:BC 4E DB 6A 89 37 14 D5 F9 FA 8C CF 4F E6 19 27 ;

00000050h:E4 60 15 05 0F 36 D1 E3 DF B1 53 65 13 43 EB 3E ;

00000060h:B1 33 10 F0 79 5B B6 24 7C 2A 4A E0 7C 99 05 13 ;

 

怎么试呢,还是异或。取0x42处开始的字节0xDB与空密码文件的0x42处字节异或,取0x62处的加密标志与空密码文件0x62处字节异或,然后再把取得的两个值相异或:

 

(0xDB^0xBE)^(0x10^0x0C)=0x79 嘿嘿。这个值是Ascii的"y",然后取下一个字节(记得隔一个字节取一个)

 

(0x89^0xEC)^(0x10^0x0C)=0x79 咦,本来这个字节应该是"e"的,怎么变成"y"了?试着不与后面的两个异或值相异或,只计算0x89^0xEC=0x65 得到"e",哈。这下对了。下一个

 

(0x14^0x65)^(0x10^0C)=0x6D 得到"m",下一个

 

(0xF9^9C)=0x65 得到"e",注意这里只是这两个数异或。后面的大家可以自己试。

 

这样就总结出规律来了。

 

解密时,先取出加密文件从文件头开始0x62处的字节,与空密码数据库文件第0x62处相异或,得到一个加密标志。

 

再从0x42处开始每隔一个字节取一个字节,取得13个加密后的密码字节,分别与空密码数据库文件0x42处每隔一个字节取得的13个字节想异或,得到13个密码半成品。为什么说是半成品呢,因为还要将13个字节的密码每隔一个字节,就与加密标志相异或,最后得到的13个字节才是真正的密码。当然,如果中间有0x0的字节,则说明密码位数不够13位。直接show出来就可以了。

 

另外我发现加密标志会随着时间或机器不同而不同,所以也没有万能的,不过有一个参照的就可以了。以下代码是我在写这个程序的时候取得的数,和我写这篇文章不是一个时间,所以数值不一样,但最终解密的结果是一样的。大家可以参考一下。

 

对了,还有个重要的就是先得判断数据库的版本,我用了个简单的办法,取0x14处的字节,如果为0就判断为是Access97,如果为1就认为是Access2000或2002的。只是目前没有研究出判断2000和2002的办法,如果哪位知道的话,请指点。

 

代码:

 

//这里定义的是13个字节作为Access2000异或的源码。与之相对应的加密标志是0x13,ccrun特此注明

 

//当然你可以用这一组:BE EC 65 9C FE 28 2B 8A 6C 7B CD DF 4F 与这一组相对应的加密标志是0x0c

 

//呵呵.程序有些乱,希望大家能看的懂。

 

 

char PassSource2k[13]=
{0xa1,0xec,0x7a,0x9c,0xe1,0x28,0x34,0x8a,0x73,0x7b,0xd2,0xdf,0x50}; //Access97的异或源码 char PassSource97[13]=
{0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};   void __fastcall TMainForm::GetMdbPass() { char PassStrTemp[26],Ver,EncrypFlag,t1; int FileHandle; String MdbPassword,MdbVersion,MdbFileName; FileHandle=FileOpen(MdbFileName,fmOpenRead); if(FileHandle<0) { ShowMessage("文件打开错误!"); return; } //取得数据库版本 FileSeek(FileHandle,0x14,0); FileRead(FileHandle,&Ver,1); //取得加密标志 FileSeek(FileHandle,0x62,0); FileRead(FileHandle,&EncrypFlag,1); //读取加密后的密码到缓冲区 FileSeek(FileHandle,0x42,0); FileRead(FileHandle,&PassStrTemp,26); FileClose(FileHandle); if(Ver<1) { MdbVersion="Access 97"; if(int(PassStrTemp[0]^PassSource97[0])==0) MdbPassword="密码为空!"; else { MdbPassword=""; for(int i=0;i<13;i++) MdbPassword=MdbPassword+char(PassStrTemp^PassSource97); } } else { MdbVersion="Access 2000 or 2002"; MdbPassword=""; for(int i=0;i<13;i++) { if(i%2==0) t1=char(0x13^EncrypFlag^PassStrTemp[i*2]^PassSource2k); //每隔一个字节就与加密标志相异或。这里的加密标志为0x13 else t1=char(PassStrTemp[i*2]^PassSource2k); MdbPassword=MdbPassword+t1; } } if(MdbPassword[1]<0x20||MdbPassword[1]>0x7e) MdbPassword="密码为空!"; EditMdbFileName->Text=MdbFileName; EditMdbPassword->Text=MdbPassword; EditMdbVersion->Text=MdbVersion; }


影响共享软件发展的因素很多,被非法破解可以说是共享软件的头号大敌。那么造成共享软件生存困难的cracker们到底用了那些武器呢?今天就让我让带您去看看神秘的cracker常用的十类软件,它们就是共享软件的十大杀手!

  一. 调试类工具soft-ice和trw2000

  soft-ice是目前公认最好的跟踪调试工具。使用soft-ice可以很容易的跟踪一个软件、或是监视软件产生的错误进行除错,它有dos、window3.1、win95/98/nt/2000/各个平台上的版本。这个本是用来对软件进行调试、跟踪、除错的工具,在cracker手中变成了最恐怖的破解工具;trw2000是中国人自己编写的调试软件,完全兼容soft-ice各条指令,由于现在许多软件能检测soft-ice存在,而对trw2000的检测就差了许多,因此目前它成了很多cracker的最爱。trw2000专门针对软件破解进行了优化,在windows下跟踪调试程序,跟踪功能更强;可以设置各种断点,并且断点种类更多;它可以象一些脱壳工具一样完成对加密外壳的去除,自动生成exe文件,因此它的破解能力更强,在破解者手中对共享软件的发展威胁更大。它还有在dos下的版本,名为tr。

  二. 反汇编工具wdasm8.93黄金版和hiew

  cracker常将soft-ice和trw2000比作屠龙刀,将wdasm8.93则比作倚天剑。wdasm8.93可方便地反汇编程序,它能静态分析程序流程,也可动态分析程序。在原有的普通版的基础上,一些破解者又开发出了wdasm8.93黄金版,加强了对中文字符串的提取。对国产共享软件的威胁也就更大了。例如开心斗地主这个很好玩的共享软件,用黄金版对其反汇编可以直接看到注册码,普通版不能,您说它厉害不?hiew是一个十六进制工具,它除了普通十六进制的功能外,它还有个特色,能反汇编文件,并可以用汇编指令修改程序, 用它修改程序,方便快捷!这也是cracker们常用的静态反汇编工具。

  三. visual basic程序调试工具smartcheck

  这是专门针对visual basic程序的调试程序,由于vb程序执行时从本质上讲是解释执行,它们只是调用 vbrunxxx.dll 中的函数 ,因此vb 的可执行文件是伪代码,程序都在vbxxx.dll 里面执行。若用soft-ice跟踪调试只能在vbdll里面用打转转,看不到有利用价值的东西,而且代码质量不高,结构还很复杂。当然只要了解其特点用soft-ice也可破解 ,但smartcheck的出现,大大方便了cracker。smartcheck 是 numega 公司出口的一款出色的调试解释执行程序的工具,目前最新版是v6.03。它非常容易使用,你甚至于不需要懂得汇编语言都能轻易驾驭它。它可将vb程序执行的操作完全记录下来,使破解者轻而易举的破解大部分vb程序。

  四. 十六进制编辑器ultraedit

  十六进制编辑器可以用十六进制方式编辑文件,修改文件的内容。虽然hiew就是一款是十六进制工具,但它是dos界面,因此很多破解者又准备了一款windows下的工具,这样的工具很多,如:ultraedit、winhex、hex workshop 等,其中ultraedit比较有特色,操作方便,更有汉化版可用,它是非常出色的十六进制编辑器,建议您也找一个用用。

  五. 注册表监视工具

  主要有regshot、regmon或regsnap等。在微软操作系统中,众多的设置都存放在注册表中,注册表是windows的核心数据库,表中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的正常运行。在应用软件安装时,有可能将一些必要的信息放进去,如安装时间、使用次数、注册码等。regshot、regmon或regsnap就是监视注册表变化的工具,通过它可以了解、监视应用程序在注册表中的动作,破解者常利用它们来监视应用程序在注册表中的变化。

六. 文件监视工具filemon

  可监视系统中指定文件运行状况,如指定文件打开了哪个文件,关闭了哪个文件,对哪个文件进行了数据读取等。通过它,任何您指定监控的文件有任何读、写、打开其它文件的操作都能被它监视下来,并提供完整的报告信息。破解者经常利用filemon监控文件系统,以便了解程序在启动、关闭或验证注册码时做了哪些手脚,并由此进行相应的解密。

  七. 脱壳工具procdump

  现在许多软件都加了壳,“壳”是一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。经过加壳的软件在跟踪时已无法看到其真实的十六进制代码,因此可以起到保护软件的目的。procdump就是个对付软件加壳的脱壳工具,它可剥去许多种壳,还文件本来面目,这样再修改文件内容就容易多了。由于它还允许使用者自己编写脚本文件,因此利用它能脱去新版加壳软件的壳。它同时还是一款优秀的pe格式修改工具,是脱壳必备工具!

  八. 侦测文件类型工具

  这样的工具有typ、gtw、fileinfo和冲击波2000等。它们被用来侦测软件被加壳类型,其中冲击波2000能轻易的找到任何加密壳的入口点,包括asprotect以及幻影的加密壳都可以。这类软件一般是配合procdump和调试软件使用的,用它们找到程序加壳类型,用procdump或soft-ice、trw2000脱壳。

  九. 资源修改器 exescope

  exescope是一个可以修改软件资源的工具,功能强大。 exescope能在没有资源文件的情况下分析、显示不同的信息,重写可执行文件的资源,包括(exe,dll,ocx)等。它可以直接修改用 vc++ 及 delphi 编制的程序的资源,包括菜单、对话框、字串表等,是汉化软件的常用工具。在破解者手中,它常被用来修改文件资源中的菜单、对话框、字串表等,用以显示破解者需要的信息(例如更改版权信息等),以此达到修改软件的目的。

  十. api调用查询工具api spy

  顾名思义,这个程序是用来侦测软件都调用了哪些api。 api就是windows程序执行时所呼叫的函数,跟dos下的int(中断)差不多,windows 提供了很多这样的函数让程序设计者套用,主要目的是为了节省软件开发的时间,方便大家开发软件。api spy就是这样一个监控api调用的软件,它可以查看应用程序调用了哪些api,从而得出对破解者有用的api调用信息,通过这些api调用来设定断点,达到破解软件的目的。它可以工作在windows95/98/nt/2000平台下。

  好了,共享软件的十大杀手为您介绍完了,如何对付它们就是您的事了。需要说明的一点是,以上提到的软件都是“正当”软件,只是在不同的使用者手中发挥了不同的用途。就犹如一把枪,在人民军队手中就是保家卫国的武器,在为非作歹的坏人手中就是一把凶器了,千万不能此就对这些软件产生成见哦!

How to Create RHEL-4 DVD from CDs Reply with quote
*Setting up the build directory:*

The first thing to do is to copy all the cdrom ISOs to one location:
mkdir -p /mnt/disk{1,2,3,4}
mount -o loop RHEL4-U1-i386-AS-disc1.iso /mnt/disk1
mount -o loop RHEL4-U1-i386-AS-disc2.iso /mnt/disk2
mount -o loop RHEL4-U1-i386-AS-disc3.iso /mnt/disk3
mount -o loop RHEL4-U1-i386-AS-disc4.iso /mnt/disk4

We now copy all the files from the directories to a single directory:
mkdir -p /data/isobuild
rsync -rv /mnt/disk{4,3,2,1}/* /data/isobuild/

We also need to copy across the .diskinfo file that is not caught by our *:
cp /mnt/disk1/.diskinfo /data/isobuild/

The .diskinfo file identifies the CD as being a correct Red Hat Installer disk
and is checked by anaconda during the start of the install.

We could now build the DVD as it is but we really should have a fiddle first Smile

*Adding more software to the DVD*
We could add some of our own rpms to /data/isobuild/RedHat/RPMS; however by just
doing this does not make them available at install time. There is an XML file
that is read and ensures that the packages are installed in the correct order.

So let us throw a few random packages into the mix:

Add some java:
cp jre-1_5_0_03-linux-i586.rpm /data/isobuild/RedHat/RPMS/

Some encryption for GAIM:
cp gaim-encryption-2.36-3.rf.i386.rpm /data/isobuild/RedHat/RPMS/

*Updating the comps.xml file*
We need to ensure that the host computer has anaconda and anaconda-runtime installed:
up2date anaconda anaconda-runtime

Before we update the XML dependency file we need to sort out package orders.
If you have added a lot of new packages you may need to remove some old
packages that you have replaced with newer versions to stop conflicts.

So the first command is:
PYTHONPATH=/usr/lib/anaconda /usr/lib/anaconda-runtime/pkgorder /data/isobuild/ i386 > /data/isobuild/xander-pkgorder

This creates a list of files in the order it needs to install them
in the file /data/isobuild/xander-pkgorder. Sometimes an occasional
RPM will not provide the information anaconda needs. You can edit
the file manually and insert your RPMs at the end.

Next we need to generate the dependency file:

/usr/lib/anaconda-runtime/genhdlist –fileorder /data/isobuild/xander-pkgorder /data/isobuild/

You will probably have a few hiccoughs the first time you run these commands.
Most may be resolved by adding the missing entries to the pkgorder file or
deleting duplicate packages.

*Creating an automated installer*
We could *now* if we wanted to build our DVD; however we can make an
automated installer.

So crack open system-config-kickstart and create a kickstart file with
all the packages and partitioning etc you need for your systems.

copy the resulting file to /data/isobuild/ks.cfg

we can now edit the file /data/isobuild/isolinux/isolinux.cfg

copy or change the three lines:
label linux
kernel vmlinuz
append initrd=initrd.img ramdisk_size=8192

to
label xander
kernel vmlinuz
append initrd=initrd.img ramdisk_size=8192 ks=cdrom:/ks.cfg

Then change the default at the top of the file to xander. This means that
the default action is to install directly from the DVD using your kickstart file.

*Building the DVD iso*
Now to build the iso:

cd /data/isobuild

chmod a+w isolinux/isolinux.bin

mkisofs -r -T -J -V "Custom RHEL4 Build" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o /data/custom-RHEL4-dvd.iso /data/isobuild/

*Buring the DVD*
Now we can burn the image to the CD. I assume the CD writer is already
set up on your system. We use cdrecord below, but you can use other
programs as well. The command is invoked as:

cdrecord -v speed=4 dev=0,0,0 /data/custom-RHEL4-dvd.iso

The speed and dev options depend on your system. The device for the dev
argument can be determined by using the -scanbus option to cdrecord:

cdrecord -scanbus

Using the DVD

Once the image is burned onto the DVD, insert the DVD into the target
machine and boot the machine. You should get the custom message that
you created earlier. At this point, you can either press Enter at the
boot prompt or let it timeout. When it times out it uses the default
label, which we specified as ks (Kickstart).

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace BaseStationPDA
{
 class GPS
 {

  public string PortNum;
  public int BaudRate;
  public byte ByteSize;
  public byte Parity; // 0-4=no,odd,even,mark,space
  public byte StopBits; // 0,1,2 = 1, 1.5, 2
  public int ReadTimeout;
  
  //comm port win32 file handle
  private int hComm = -1;
  
  public bool Opened = false;
  
  //win32 api constants
  private const uint GENERIC_READ = 0x80000000;
  private const uint GENERIC_WRITE = 0x40000000;
  private const int OPEN_EXISTING = 3;  
  private const int INVALID_HANDLE_VALUE = -1;
  
  [StructLayout(LayoutKind.Sequential)]
   public struct DCB
  {
   //taken from c struct in platform sdk
   public int DCBlength;           // sizeof(DCB)
   public int BaudRate;            // 指定当前波特率 current baud rate
   // these are the c struct bit fields, bit twiddle flag to set
   public int fBinary;          // 指定是否允许二进制模式,在windows95中必须主TRUE binary mode, no EOF check
   public int fParity;          // 指定是否允许奇偶校验 enable parity checking
   public int fOutxCtsFlow;      // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。 CTS output flow control
   public int fOutxDsrFlow;      // 指定CTS是否用于检测发送控制 DSR output flow control
   public int fDtrControl;       // DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手" DTR flow control type
   public int fDsrSensitivity;   // 当该值为TRUE时DSR为OFF时接收的字节被忽略 DSR sensitivity
   public int fTXContinueOnXoff; // 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。 FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。XOFF continues Tx
   public int fOutX;          // TRUE时,接收到XoffChar之后便停止发送接收到XonChar之后将重新开始 XON/XOFF out flow control
   public int fInX;           // TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 XON/XOFF in flow control
   public int fErrorChar;     // 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 enable error replacement
   public int fNull;          // eTRUE时,接收时去掉空(0值)字节 enable null stripping
   public int fRtsControl;     // RTS flow control
   /*RTS_CONTROL_DISABLE时,RTS置为OFF
            RTS_CONTROL_ENABLE时, RTS置为ON
            RTS_CONTROL_HANDSHAKE时,
            当接收缓冲区小于半满时RTS为ON
             当接收缓冲区超过四分之三满时RTS为OFF
            RTS_CONTROL_TOGGLE时,
            当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF*/

   public int fAbortOnError;   // TRUE时,有错误发生时中止读和写操作 abort on error
   public int fDummy2;        // 未使用 reserved
   
   public uint flags;
   public ushort wReserved;          // 未使用,必须为0 not currently used
   public ushort XonLim;             // 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 transmit XON threshold
   public ushort XoffLim;            // 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数 transmit XOFF threshold
   public byte ByteSize;           // 指定端口当前使用的数据位 number of bits/byte, 4-8
   public byte Parity;             // 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY  0-4=no,odd,even,mark,space
   public byte StopBits;           // 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS  0,1,2 = 1, 1.5, 2
   public char XonChar;            // 指定用于发送和接收字符XON的值 Tx and Rx XON character
   public char XoffChar;           // 指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
   public char ErrorChar;          // 本字符用来代替接收到的奇偶校验发生错误时的值 error replacement character
   public char EofChar;            // 当没有使用二进制模式时,本字符可用来指示数据的结束 end of input character
   public char EvtChar;            // 当接收到此字符时,会产生一个事件 received event character
   public ushort wReserved1;         // 未使用 reserved; do not use
  }

  [StructLayout(LayoutKind.Sequential)]
   private struct COMMTIMEOUTS
  { 
   public int ReadIntervalTimeout;
   public int ReadTotalTimeoutMultiplier;
   public int ReadTotalTimeoutConstant;
   public int WriteTotalTimeoutMultiplier;
   public int WriteTotalTimeoutConstant;
  }  

  [StructLayout(LayoutKind.Sequential)] 
   private struct OVERLAPPED
  {
   public int  Internal;
   public int  InternalHigh;
   public int  Offset;
   public int  OffsetHigh;
   public int hEvent;
  } 
  
  [DllImport("coredll.dll")]
  private static extern int CreateFile(
   string lpFileName,                         // 要打开的串口名称
   uint dwDesiredAccess,                      // 指定串口的访问方式,一般设置为可读可写方式
   int dwShareMode,                          // 指定串口的共享模式,串口不能共享,所以设置为0
   int lpSecurityAttributes, // 设置串口的安全属性,WIN9X下不支持,应设为NULL
   int dwCreationDisposition,                // 对于串口通信,创建方式只能为OPEN_EXISTING
   int dwFlagsAndAttributes,                 // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
   int hTemplateFile                        // 对于串口通信必须设置为NULL
   );
  [DllImport("coredll.dll")]
  private static extern bool GetCommState(
   int hFile,  //通信设备句柄
   ref DCB lpDCB    // 设备控制块DCB
   ); 
  [DllImport("coredll.dll")]
  private static extern bool BuildCommDCB(
   string lpDef,  // 设备控制字符串
   ref DCB lpDCB     // 设备控制块
   );
  [DllImport("coredll.dll")]
  private static extern bool SetCommState(
   int hFile,  // 通信设备句柄
   ref DCB lpDCB    // 设备控制块
   );
  [DllImport("coredll.dll")]
  private static extern bool GetCommTimeouts(
   int hFile,                  // 通信设备句柄 handle to comm device
   ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
   ); 
  [DllImport("coredll.dll")] 
  private static extern bool SetCommTimeouts(
   int hFile,                  // 通信设备句柄 handle to comm device
   ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
   );
  [DllImport("coredll.dll")]
  private static extern bool ReadFile(
   int hFile,                // 通信设备句柄 handle to file
   byte[] lpBuffer,             // 数据缓冲区 data buffer
   int nNumberOfBytesToRead,  // 多少字节等待读取 number of bytes to read
   ref int lpNumberOfBytesRead, // 读取多少字节 number of bytes read
   ref OVERLAPPED lpOverlapped    // 溢出缓冲区 overlapped buffer
   );
  [DllImport("coredll.dll")] 
  private static extern bool WriteFile(
   int hFile,                    // 通信设备句柄 handle to file
   byte[] lpBuffer,                // 数据缓冲区 data buffer
   int nNumberOfBytesToWrite,     // 多少字节等待写入 number of bytes to write
   ref int lpNumberOfBytesWritten,  // 已经写入多少字节 number of bytes written
   ref OVERLAPPED lpOverlapped        // 溢出缓冲区 overlapped buffer
   );
  [DllImport("coredll.dll")]
  private static extern bool CloseHandle(
   int hObject   // handle to object
   );
  [DllImport("coredll.dll")]
  private static extern uint GetLastError();
  
  public void Open()
  {
  
   DCB dcbCommPort = new DCB();
   COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS(); 
    
   // 打开串口 OPEN THE COMM PORT.
   hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
   // 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
   if(hComm == INVALID_HANDLE_VALUE)
   {
    throw(new ApplicationException("非法操作,不能打开串口!"));
   }
  
   // 设置通信超时时间 SET THE COMM TIMEOUTS.
   GetCommTimeouts(hComm,ref ctoCommPort);
   ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
   ctoCommPort.ReadTotalTimeoutMultiplier = 0;
   ctoCommPort.WriteTotalTimeoutMultiplier = 0;
   ctoCommPort.WriteTotalTimeoutConstant = 0; 
   SetCommTimeouts(hComm,ref ctoCommPort);
  
   // 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
   GetCommState(hComm, ref dcbCommPort);
   dcbCommPort.BaudRate=BaudRate;
   dcbCommPort.flags=0;
   //dcb.fBinary=1;
   dcbCommPort.flags|=1;
   if (Parity>0)
   {
    //dcb.fParity=1
    dcbCommPort.flags|=2;
   }
   dcbCommPort.Parity=Parity;
   dcbCommPort.ByteSize=ByteSize;
   dcbCommPort.StopBits=StopBits;
   if (!SetCommState(hComm, ref dcbCommPort))
   {
    //uint ErrorNum=GetLastError();
    throw(new ApplicationException("非法操作,不能打开串口!"));
   }
   //unremark to see if setting took correctly
   //DCB dcbCommPort2 = new DCB();
   //GetCommState(hComm, ref dcbCommPort2);
   Opened = true;
  }
  
  public void Close()
  {
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    CloseHandle(hComm);
   }
  }
  
  public byte[] Read(int NumBytes)
  {
   byte[] BufBytes;
   byte[] OutBytes;
   BufBytes = new byte[NumBytes];
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    OVERLAPPED ovlCommPort = new OVERLAPPED();
    int BytesRead=0;
    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
    try
    {
     OutBytes = new byte[BytesRead];
     Array.Copy(BufBytes,0,OutBytes,0,BytesRead);
    }
    catch
    {
     return BufBytes;
    }
    
   }
   else
   {
    throw(new ApplicationException("串口未打开!"));
   }
   return OutBytes;
   //   return BufBytes;
  }
  
  public void Write(byte[] WriteBytes)
  {
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    OVERLAPPED ovlCommPort = new OVERLAPPED();
    int BytesWritten = 0;
    WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
   }
   else
   {
    throw(new ApplicationException("串口未打开!"));
   }  
  }

  public string GetGPS(string strGPS,string strFind)
  {
   ///从GPS中读取的数据中,找出想要的数据
   ///GPSstring原始字符串,
   ///strFind要查找的内容,X:经度,Y:纬度,T:时间,V:速度,是数字从1开始,即以“,”分隔的位置
   ///返回查找到指定位置的字符串
   string handerStr="$GPRMC";//GPS串头
   int findHander=strGPS.IndexOf(handerStr);//看是否含有GPS串头
   if (findHander<0)
   {
    return "-1";
   }
   else
   {
    strGPS=strGPS.Substring(findHander,strGPS.Length-findHander);
    string[] ArryTmp=strGPS.Split(",".ToCharArray());
    try
    {
     if(ArryTmp[2]=="V")
     {
      return "V";//没有信号
     }
     else
     {
      switch(strFind)
      {
       case "X":
        return DM2DD(ArryTmp[5]);
        
       case "Y":
        return DM2DD(ArryTmp[3]);
        
       case "T":
        return T2Time(ArryTmp[9],ArryTmp[1]);
        
       case "V":
        return Convert.ToString(Convert.ToDouble(ArryTmp[7])* 1.852);
        
       default:
        return "V";
        
      }
     }
    }
    catch
    {
     return "V";
    }
   }
  }

  public string T2Time(string strDate,string strTime)
  {
   string dT="20"+strDate.Substring(4,2)+"-"+strDate.Substring(2,2)+"-"+strDate.Substring(0,2);
   string TT=Convert.ToString(Convert.ToInt32(strTime.Substring(0,2)))+":"+strTime.Substring(2,2)+":"+strTime.Substring(4,2);
   DateTime T=Convert.ToDateTime(dT+" "+TT);
   T=T.AddHours(8);
   return T.ToString();
  }

  public string DM2DD(string DegreeMinutes)
  {
   //转换NMEA协议的“度分”格式为十进制“度度”格式
   string sDegree;
   string sMinute;
   string sReturn="";
   if(DegreeMinutes.IndexOf(".")==4)
   {
    //DegreeMinutes = Replace(DegreeMinutes, ".", "")
    //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) – 2)) / 60), 8)) / 10000
    DegreeMinutes=DegreeMinutes.Replace(".","");
    double sDegree1=Convert.ToDouble(DegreeMinutes.Substring(0,2));
    double sDegree2=Convert.ToDouble(DegreeMinutes.Substring(2,DegreeMinutes.Length-2));
    string sTmp=Convert.ToString(sDegree2/60);
    sDegree2=Convert.ToDouble(sTmp.Substring(0,sTmp.Length));
    sDegree2=sDegree2/10000;
    sDegree=Convert.ToString(sDegree1+sDegree2);
    if(sDegree.Length>11)
     sDegree=sDegree.Substring(0,11);
    sReturn=sDegree;
   }
   else if(DegreeMinutes.IndexOf(".")==5)
   {
    //DegreeMinutes = Replace(DegreeMinutes, ".", "")
    //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) – 2)) / 60), 8)) / 10000
    DegreeMinutes=DegreeMinutes.Replace(".","");
    double sMinute1=Convert.ToDouble(DegreeMinutes.Substring(0,3));
    double sMinute2=Convert.ToDouble(DegreeMinutes.Substring(3,DegreeMinutes.Length-2));
    string sTmp=Convert.ToString(sMinute2/60);
    sMinute2=Convert.ToDouble(sTmp.Substring(0,sTmp.Length));
    sMinute2=sMinute2/10000;
    sMinute=Convert.ToString(sMinute1+sMinute2);
    if(sMinute.Length>10)
     sMinute=sMinute.Substring(0,10);
    sReturn=sMinute;
   }
   return sReturn;
  }

  public bool ScanPort()
  {
   
   try
   {
    if (Opened)
    {
     Close();
     Open();
    }
    else
    {
     Open();//打开串口
     
    }
    byte[] bytRead=Read(512);
    Close();
    if(Encoding.ASCII.GetString(bytRead,0,bytRead.Length).IndexOf("$GP")>=0)
     return true;
    else
     return false;
   }
   catch
   {
    return false;
   }

  }
 }

 class HexCon
 {
  // 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串 converter hex string to byte and byte to hex string
  public static string ByteToString(byte[] InBytes)
  {
   string StringOut="";
   foreach (byte InByte in InBytes)
   {
    StringOut=StringOut + String.Format("{0:X2} ",InByte);
   }
   return StringOut;
  }
  public static byte[] StringToByte(string InString)
  {
   string[] ByteStrings;
   ByteStrings = InString.Split(" ".ToCharArray());
   byte[] ByteOut;
   ByteOut = new byte[ByteStrings.Length-1];
   for (int i = 0;i==ByteStrings.Length-1;i++)
   {
    ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
   }
   return ByteOut;
  }
 }
}

在别的class中调用时如Frmlogoin(是通过一个时间控件来循环的)

public class Frmlogin : System.Windows.Forms.Form
 {

private GPS ss_port=new GPS();

}

#region 读取GPS
  private void opengps(string ComPoint)
  {
   ss_port.PortNum = ComPoint;
   ss_port.BaudRate = 4800;
   ss_port.ByteSize = 8;
   ss_port.Parity = 0;
   ss_port.StopBits = 1;
   ss_port.ReadTimeout = 1000;

   try
   {
    if (ss_port.Opened)
    {
     ss_port.Close();
     ss_port.Open();
     timer1.Enabled=true;
    }
    else
    {
     ss_port.Open();//打开串口
     timer1.Enabled=true;
    }
    
   }
   catch
    
   {
//    MessageBox.Show("读取GPS错误!" ,"系统提示");
    
   }
  }
  private void timer1_Tick(object sender, System.EventArgs e)
  {
   
   if (ss_port.Opened)
    gpsread();
   else
    ss_port.Open();//打开串口
  }
  
  private void gpsread()
  {
   byte[] aa=ss_port.Read(512);
   string gpsinfo =System.Text.Encoding.ASCII.GetString(aa,0,aa.Length);
   GetParam.GpsLongitude=ss_port.GetGPS(gpsinfo,"X");
   GetParam.GpsLatitude=ss_port.GetGPS(gpsinfo,"Y");
   GetParam.GpsSpeed=ss_port.GetGPS(gpsinfo,"V");
   GetParam.GpsTime=ss_port.GetGPS(gpsinfo,"T");
   if(GetParam.GpsLongitude=="-1")
    GetParam.GpsState="0";
   if(GetParam.GpsLongitude=="V" && GetParam.GpsLatitude=="V")
    GetParam.GpsState="0";
   if(GetParam.GpsLongitude!="-1" && GetParam.GpsLongitude!="V")
    GetParam.GpsState="1";

    GetParam.GpsLongitude=(GetParam.GpsLongitude=="V") ? "0" : GetParam.GpsLongitude;
    GetParam.GpsLatitude=(GetParam.GpsLatitude=="V") ? "0" : GetParam.GpsLatitude;
    GetParam.GpsSpeed=(GetParam.GpsSpeed=="V") ? "0" : GetParam.GpsSpeed;
    GetParam.GpsTime=(GetParam.GpsTime=="V") ? "0" :GetParam.GpsTime;
   
  }
  private void GpsClose()
  {
   timer1.Enabled=false;
   if (ss_port.Opened)
    ss_port.Close();
  }
  #endregion

昆明的天气还真是奇怪,今天下班的时候看着还出着太阳,而且还是很刺眼的那种。结果才走了一段路就开始下雨了,还下得好大。

这个是不是就是传说中的秋天的天气了:又出太阳又下雨,栽黄秧,吃白米。呵呵

 

图片附件:
image_319.jpg
图片附件:
image_320.jpg

  硬盘有价而数据无价,现在越来越多的用户有这样的概念,但是只有在真正遇到数据危机时才会有切身的感受,尽管存储在各种磁盘中的计算机数据如此重要,但由于技术和工艺的原因,任何存储设备都存在毁损的风险。运行环境的改变和恶化,违规操作或折磨式操作,病毒的破坏和黑客的入侵,以及难以避免的各种异常情况,都可能导致存储设备报废和软件系统崩溃。

  不少朋友都认为,数据恢复是一项专业性很强的工作,需要对磁盘结构和文件系统有透彻的了解,真的有那么神秘么?其实针对一些简单的软件类数据丢失,我们自己动手就能解决问题,不仅可以省下一大笔费用,而且对自己的电脑水平的提高也是一个难得的机会。今天小编就和大家聊一下关于一些数据回复的解决办法。

  一旦遭遇数据危机,保持一份从容不迫的心态非常重要,出现手忙脚乱的情况则很可能造成更大的破坏,让本来可以恢复的数据变得无法挽救。事实上,自己独立挽救万元价值的数据并非是天方谭谈,只要掌握一些操作技巧并方法得当,大家完全可能会扮演拯救数据危机的英雄角色。

  ■数据丢失,对症下药

  对症下药,哪些数据可以挽救?数据出现问题主要包括两大类:逻辑问题和硬件问题,相对应的恢复也分别称为软件恢复和硬件恢复。软件恢复是指通过软件的方式进行数据修复,整个过程并不涉及硬件维修。而导致数据丢失的原因往往是病毒感染、误格式化、误分区、误克隆、误删除、操作断电等。
  
 软件类故障的特点为:无法进入操作系统、文件无法读取、文件无法被关联的应用程序打开、文件丢失、分区丢失、乱码显示等。事实上,造成软件类数据丢失的原因十分复杂,每种情况都有特定的症状出现,或者多种症状同时出现。一般情况下,只要数据区没有被彻底覆盖,个人用户通过一些特定的软件,基本上都可以顺利恢复。

  以最普通的删除操作为例,实际上此时保存在硬盘中的文件并没有被完全覆盖掉,通过一些特定的软件方法,能够按照主引导区、分区、DBR、FAT,最后文件实体恢复的顺序来解决;当然也应客观承认的是,尽管软件类数据恢复有很多细节性的技巧与难以简单表达的经验,但是也的确存在现有软件恢复技术无能为力的情况。如果硬盘中的数据被完全覆盖或者多次被部分覆盖,很可能使用任何软件也无法修复。

  ■开机时突然断电,重启后找不到系统

  相信不少朋友都遇到过这种情况,在我们使用电脑是突然断电,重新开机时能够检测到硬盘,但是不能进入到系统,或者提示“DISK BOOT FAILURE,INSERT SYSTEN DISK AND PRESS ENTER”。

  像这种情况一般都是硬盘主引导区故障,其实只需要几分钟便可以搞定。此类故障大约占据整体软件故障的30%以上,所以学会对付这类问题的解决方法可谓掌握了一个有效的杀手锏。另外要提醒大家的是,如果开机自检后提示“Miss operation system”而且DOS下可以看到C盘完整内容,这也是属于主引导区故障。

  对于这一类软件故障,我们完全可以自已解决。大家可以用软盘启动系统。然后键入“C:”,看看能否读取C盘的内容。造成这一情况比较复杂,根据主引导区破坏程度的不同,C盘能否被读取也不能确定。如果C盘中的数据可以读出的话,那么大家只要使用Fdisk/mbr命令进行无条件重写主引导区一般都能成功,而且可以保留原有的数据。值得注意的是,运行 Fdisk/mbr命令时系统是没有任何反应的,但实际上它已经起了作用,因为硬盘分区表的数据量很小,写入时间几乎让人感觉不到。

  当然,即便不能读取C盘,我们也可以使用Fdisk/mbr命令。事实上Fdisk/mbr的作用十分明显,也能对付一些主引导区病毒,大家可以好好利用,这堪称是对付硬盘在BIOS中可以识别而DOS下无法操作的第一件工具;除了Fdisk的这一隐藏参数,大家还可以使用Fixmbr这款DOS下的小工具。在DOS下直接执行该文件之后,系统会自动检查分区表结构,经过用户确认之后,它就开始自动修复。与Fdisk/mbr命令相比,Fixmbr具有更好的效果,很多Fdisk/mbr命令不能解决的主引导区问题都能被它轻松搞定。

  ■使用PQ Magic合并分区,文件丢失

  故障:硬盘空间分配不合理,使用分区软件从新分区,或者合并分区,导致文件丢失,或者无法打开。

  这种故障一般都是分区表错误引起的,分区表故障在各种软件故障中也属于常见的,这里推荐大家使用由我们国产的DiskGenius软件。该软件可以直接在纯DOS环境下运行,而且采用直观的中文界面,因此它对于英文不好的用户而言是最佳的选择。

  将DiskGenius软件复制到DOS启动盘之后可以直接运行,进入DiskGenius的主界面后,按下F10就能轻松地自动恢复硬盘分区表,而且这一招非常有效。DiskGenius将首先搜索0柱面0磁头从2扇区开始的隐含扇区,寻找被挪动过的分区表。然后搜索每个磁头的第一个扇区,其中搜索过程可以采用“自动”与“交互”两种方式进行。

  自动方式适用于大多数情况,建议大家选择这种方案。通过以上对主引导区以及分区表的修复,大家才可能让一个遭受严重破坏的硬盘得以在Windows下正确看到分区,进而为其他操作打下坚实的基础。

  手动修复:在部分情况下,可能任何软件都无法找到备份的分区表,此时只能手动修改。手动修改将完全凭借经验,在WinHex等软件下直接操作分区表数据。使用WinHex打开磁盘后。其中从“80”开始到“55AA”结束的DPT硬盘分区表相当关键,我们这里截图展示的硬盘分区表是完好的,因此并不需要修改。

  但是对于一个已经被破坏的分区表而言,其结束位置可能完全错乱,此时大家可以通过寻找下一个“55AA”标志来确定,因为下一个分区开始的位置向前推移一个扇区就是上一个分区的结束的位置。根据所得到的磁头、扇区和柱面数字再折算成16进制,然后使用WinHex回写即可。此外,在寻找下一个“55AA”的过程中可能会碰到很多干扰项,建议根据硬盘分区的容量结合判断。手写恢复分区表的整个过程需要拥有大量的实战经验,大家可以进一步深入学习。

  ■无法打开分区,提示“该分区未格式化”

  故障:正常使用时突然某个盘符不能打开,提示“该分区未格式化”

  毫无疑问,直接重新格式化就能够解决问题,所以如果这个分区里没有比较重要的文件资料等,小编强烈建议您直接格式化硬盘,既简单,但是如果里面有比较重要的文件不能丢失的话,这里还有一个捷径,但是不一定都有效,大家可以找另外一台电脑,将坏的硬盘当作从盘挂在那台电脑上,进入系统后看一下可不可以打开,如果还不行的话,那我们就要用到WinHex改写DBR模板了。

  使用时建议将存在问题的硬盘作为从盘挂接。然后直接打开 WinHex后选择该硬盘,而不要选择分区,这样就能使用硬盘中分区表信息来处理分区,从而巧妙绕过DRB信息。接下来的任务就非常简单了,直接在右上方的“访问”下拉列表中选择DBR故障的分区,然后打开“起始扇区模板”。需要注意的是对于FAT32和NTFS分区,其标准模板都是不同的,要看准了再选。

  ■零磁道损坏,硬盘无法启动

  对于磁盘而言,零磁道是最为关键的地方,因为硬盘的分区表信息就在其中。一旦零磁道损坏,那么硬盘将无法启动。其实零磁道损坏只是物理坏道的特殊情况,所不同的只是损坏之处十分敏感。

 这里推荐给大家的是一款名为效率源的磁盘访问工具。它是目前对付坏道时比较常用的软件其特点在于能够针对扇区进行复制。以一块80GB硬盘为例,如果我们已经知道所需要的重要数据在最后一个分区,且最后一个分区的容量为20GB,那么在效率源软件中直接让起始复制扇区定位在大约70%的位置,终止位置为最后,这样在复制过程中将会避开前面的部分。

 很多时候,物理坏道都是连续出现,而我们所需要的数据可能并没有存储在危险的坏道上。然而操作系统对于硬盘的读取过程比较特殊,一旦存在大量坏道就有可能无法识别硬盘分区。通过效率源软件,大家可以轻而易举地突破这些限制,而且该软件本身就带有强力复制功能和相应的校验算法。

  ■分区被误操作格式化或者误克隆

  当我们发现文件丢失或文件被同名文件覆盖,甚至分区被误操作格式化以及误克隆之后,就需要采用磁盘扫描的方法来进行数据恢复。

  由于误操作而导致的文件丢失在软件类数据恢复中很常见,当在磁盘上删除一些数据后,被删除的地方只不过做了一个可覆盖标记,数据并没有真正被删除。但是再次写入的话,不一定立即覆盖刚刚删除的地方,因此可以使用磁盘扫描的方法来恢复数据,但数据一旦被其他数据所覆盖,就很难做到将被删除数据完全恢复。

  这里推荐大家使用Easy Recovery和Final Data。由于Easy Recovery和Final Data在针对分区表等故障时有着一套独特的处理方法,可以自动使用内定的方式来扫描文件,因此结合起来使用往往可以带来惊喜。

  EasyRecovery使用Ontrack公司复杂的模式识别技术找回分布在硬盘上不同地方的文件碎块,并根据统计信息对这些文件碎块进行重整。接着 EasyRecovery在内存中建立一个虚拟的文件系统并列出所有的文件和目录。哪怕整个分区都不可见或者硬盘上只有非常少的分区维护信息, EasyRecovery仍然可以高质量地找回文件。

  能用EasyRecovery找回数据、文件的前提就是硬盘中还保留有文件的信息和数据块。但在进行删除文件、格式化硬盘等操作后,再对该分区内写入大量新信息时,这些需要恢复的数据就很有可能被覆盖了!这时,无论如何都是找不回想要的数据了。所以,为了提高数据的修复率,就不要再对要修复的分区或硬盘进行新的读写操作。如果要修复的分区恰恰是系统启动分区,就要马上退出系统,用另外一个硬盘来启动,然后在用软件进行回复。

  ■小编总结

  以上的几条硬盘数据丢失,基本上我们用户都可以自己尝试一下,使用不同的软件进行恢复,不一定全部管用,但是如果我们不试的话就完全没有机会,或者说需要花钱进行专业恢复,但是小编感觉,前提是我们硬盘里有对于我们比较重要的数据或者文件等,否则如果只是一些正常的电影或者MP3文件的话小编建议,就不要进行数据恢复了,直接格式化重做系统最简单了。

1、Windows Mobile Team Blog
http://blogs.msdn.com/windowsmobile/

2、Microsoft Technical Forums  –>Smart Device Development —— 强烈推荐
http://forums.microsoft.com/msdn/default.aspx?siteid=1

3、微软中文社区 -> Windows Mobile
 —>Smartphone & Pocket PC 使用交流区
 —>Smartphone & Pocket PC 开发交流区
http://bbs.mscommunity.com/forums/default.aspx

3、VCHelp –> eVC/.NET Compact嵌入式平台
http://www.vchelp.net/cndevforum/subject_list.asp?forum_id=33

4、MSDN 英文网站  –>Mobile
http://msdn.microsoft.com/mobility/

5、MSDN中文网站 –>移动与嵌入式技术
http://www.microsoft.com/china/MSDN/library/Mobility/default.mspx
以及 Webcast 网络讲座
http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx

6、移动技术网 –>WinCE开发讨论区
http://www.msale.net/Forum/viewforum.php?f=7

7、天极网 嵌入式开发 版块
http://club.yesky.com/bbs/jsp/list.jsp?forumID=378
以及  天极网软件频道–>移动开发
http://dev.yesky.com/devydkf/

8、CSDN.NET –>移动–>Windows Mobile 资源
http://mobile.csdn.net/List.aspx?Column=80bacd07-4d58-4507-9f32-c142b51c401a

9、CSDN社区 
http://community.csdn.net/
—>硬件/嵌入开发—> 嵌入开发(WinCE)
—>移动平台—>Windows Mobile

10、Smartphone—技术天地—赛迪网
http://tech.ccidnet.com/col/1130/1130.html

11、Pocket PC Developer Network
http://www.pocketpcdn.com/

12、嵌入式世界网
http://www.embedworld.com/forum_list.asp?forum_id=5

13、PocketPC FAQ
http://www.pocketpcfaq.com/

14、MoDaCo » Forum Home » Smartphone » Smartphone Development
http://www.modaco.com/Smartphone_Development-f113.html

15、CodeProject
http://www.codeproject.com/ce/
与该网站类似的有:
CodeGuru
http://www.codeguru.com/

16、移动开发网(资料很多)
http://www.biplip.com/default.aspx
开发论坛—>Windows CE与Pocket PC软件开发讨论区 
http://www.biplip.com/Forums/default.asp?CAT_ID=3

17、嵌入式研究网
http://www.cnemb.com/
—>微软嵌入式开发版
http://www.cnemb.com/index.php?name=PNphpBB2&file=index&c=1

18、MVP Blog
http://blog.csdn.net/aawolf/

19、Smartphone Developer  Network
http://www.smartphonedn.com/

20、PDA 发烧友论坛
http://bbs.pdafans.com
—移动设备软件开发版

21、OpenNETCF.org
http://www.opennetcf.org/CategoryView.aspx?category=Home

22、嵌入者之家论坛
http://www.embeder.com/bbs/index.asp
—WinCE讨论区
—PocketPC讨论区

23、NET Compact Framework Team
http://blogs.msdn.com/netcfteam/

24、中国JAVA手机网
http://www.cnjm.net

25、IOICN 中文数码论坛
http://61.145.126.169/bbs/index.php

26、手机论坛_手机之家
http://bbs.imobile.com.cn/forumdisplay.php?fid=55491

27、Smartphone Thoughts
http://www.smartphonethoughts.com/forums/index.php

28、In the Hand
http://www.inthehand.com/forums/

29、Smartphone Dubai Forums
http://smartphonedubai.com/groupee/forums

30、SourceForge.NET
http://sourceforge.net/

31、新的论坛:
Mobile 应用开发
http://mobile.winfans.net/CCS/Default.aspx
移动开发者
http://www.justmobiler.com/

32、TOM PDA (PDA设备的软硬件交流,并提供PDA新闻订阅)
http://www.tompda.com/bbs/
 ——PocketPC及SmartPhone智能手机讨论区
 ——CE软件讨论区

33、阿YAYA微软智能手机网——Windows Mobile
http://www.aryaya.com/forumdisplay.php?fid=109

34、91mobile
http://91mobile.com/bbs/index.asp
——PocketPC 开发经验交流
——Smartphone 开发经验交流

35、Hi PDA
http://www.hi-pda.com/forum/

36、小胖熊的酷数码乐园
http://www.sosaw.com/

37、数码墟
http://www.01outlet.com/

38、酷派数码
http://www.pxdxa.com/

39、Windows Mobile Developers Wiki
http://channel9.msdn.com/wiki/default.aspx/MobileDeveloper.HomePage

40、  MSDN2(United States) —— 强烈推荐
http://msdn2.microsoft.com/library/default.aspx

The MSDN Library is an essential resource for developers using Microsoft tools, products, and technologies. It contains a bounty of technical programming information, including sample code, documentation, technical articles, and reference guides.

This site, MSDN2, contains the documentation for two new products, Visual Studio 2005 and SQL Server 2005. Use this site to access the latest developer documentation for these tools and technologies and to preview some of the upcoming changes to the MSDN Library interface. In the coming months, the documentation hosted here will be consolidated into the MSDN Library.

41、Visual Studio For Devices
http://blogs.msdn.com/vsdteam/

42、STL For EVC
http://www.syncdata.it/stlce/index.html

43、GotDotNet
http://www.gotdotnet.com
 is a .NET Framework Community Web site providing Visitor with access to code Samples and other resources for Create .NET Solutions.

44、嵌入式开发网络
http://www.embeddedhelp.com/Index.asp

45、翻译《Windows CE 程序设计(3rd版本)》的BLOG
http://blog.csdn.net/tellmenow/category/138980.aspx

46、南方数码掌上软件开发部(留言本)
http://www.lzh.cn/

47、斯普智能手机网
http://www.downpda.com

48、Embedded Development and Research
http://www.buzzdev.net

49、msmobiles.com forums
http://msmobiles.com/f/

50、pdaPhoneHome.com – Pocket PC pdaPhones
http://www.pdaphonehome.com/forums/index.php?s=75bdbcdc0e5a68d010852fac1a0a3e29

51、嵌入式开发网
http://www.palmheart.net/

52、Windows CE Base Team Blog
http://blogs.msdn.com/ce_base/default.aspx

53、Windows Mobile Portal
http://www.winbile.net/

54、Home [PocketMartix >> Mobile Device]
http://www.pocketmatrix.com

55、开发者之家〉移动平台〉Windows Mobile
http://www.vkfz.com/Windows-Mobile-1l216.htm

原文地址:http://www.cnblogs.com/mengshu-lbq/archive/2005/11/16/windows_mobile_develop_resource.html

魔兽世界6月份开始登陆中国网络游戏市场,在很短的时间内就占据了国内网游市场,在国内形成了一股魔兽世界风暴。在这款网游流行的背后却有一只黑手慢慢的伸向他,魔兽世界最终也和其他网游一样没有逃脱盗号的恶运。到目前为止,魔兽世界的盗号事件已经是层出不穷,这里我就带大家一起来揭开魔兽世界的盗号之迷,同时本文中笔者也将给大家介绍相应的防范技巧。

  黑客如何窃取魔兽世界帐号

  首先盗号者需要准备魔兽世界木马一只,这是最基本的了,所有帐号密码都是有他来盗取了。魔兽世界木马种类也有很多种,有公开的也有没公开的,公开的魔兽世界木马在各大黑客网站都有下载,这里我推荐天龙工作室开发的魔兽世界木马,界面如下:

p1.jpg

图一

  其中邮件地址处填的就是我们接收帐号密码的邮件地址,下面几项就是邮件服务器设置项,右边就是用来发送帐号密码的邮箱地址,用户名密码,全部设置完后点击生成程序生成木马服务端。

  接下来就是最重要的环节了,如何让对方不知不觉中中的你木马了,这里将给大家讲解两种利用方式。第一种是捆绑法,为了使中魔兽世界木马的大部分都是魔兽世界玩家,我们可以这个木马捆绑在魔兽世界插件上,然后向外界发布你这个捆绑了木马的插件说是最新插件,这样一定会有不少玩家依靠baidu和google找到你向各大网站发布的这个被动了手脚的插件了,这样玩家就会在体验插件的同时毫无知觉的中魔兽世界木马。至于如何捆绑木马到其他程序上,这里可以用到一些专门的文件合并工具,这里我们选用水晶情缘开发的“EXE文件合并粉碎机”进行文件合并,软件界面如下:

p2.jpg

图二

把2个程序选择进去,然后提取正常程序的图标点击开始合并即可完成捆绑工作,接下来你就可以把捆绑好木马的程序到各大软件下载网站发布了,加点迷惑信息,就声称是最新的魔兽世界插件,这样就会有大量的玩家来下载插件用了,当然也在悄然无息中运行你的魔兽世界木马了。曾经在前一段时间,大脚(bigfoot)合作站点NGACN已经发布公告承认大脚被种入木马的事实,但大脚(bigfoot)官方站http://www.wowinside.net对此事只字未提,而月光宝盒(17cube)至今为止没有对此事做出任何说明和道歉。让人不得对这两大插件提供商感到遗憾,一方面不遗余力的推广自己的插件获取用户。一方面却不能保障插件的安全性。甚至在出现如此严重的盗号事件后也仅仅是一笔带过。完全没意识到事件的严重性。据悉,国内三大整合插件大脚和月光宝盒以及这次幸免于难的魔兽精灵(WoWshell)使用用户加起来超过150万用户,一旦客户端被种入木马,后果不堪设想。此次事件也暴露出国内整合插件提供商安全性完全没有保障的事实。Bigfoot,17cube,WoWshell等整合插件提供商都属于个人网站,其存放插件下载的服务器都属于租用的服务器,安全防范意识相对较差。一旦被黑,使用这些整合插件的用户更新插件就可能被种上木马,造成大规模的帐号被盗。在这次提供插件下载的官方网站服务器被黑,到致使一部分玩家帐号不翼而飞,整个过程就是盗号者对捆绑插件的利用,当然他们的捆绑方法要远远高于上面介绍的捆绑方法。

  第二种方法就是利用网页木马来传播你的魔兽世界木马了,这样你需要一个个人的网页空间,网站提供各种与魔兽世界相关的软件动画下载,不过我们在网站首页加上一句的代码,这样别人在浏览你的网页的同时也就悄然无息的中了你配置好的木马了。如果你有一定的黑客技术的话,就可以黑掉一些第三方的魔兽世界交易网站在他首页上加上这么一句,那么魔兽帐号就会源源不断的跑到你的邮箱里来。就算你没有一定的黑客技术的话也不要紧,找一些和魔兽世界有关的游戏论坛,因为到目前为止所有的论坛都有一个通性,就是允许用户在论坛贴flash动画,这样也就无形中给木马提供了藏身的温床,我们可以制作一个特殊的flash张贴到各大魔兽世界讨论论坛,其flash的制作方法也很简单,先到网上下载一个十分火热的flash动画,然后在本地对下载回来的flash进行编辑,接下来打开flash制作工具,选择文件菜单下的导入到库选项把刚下载下来后缀为swf的flash文件导入到库中,接下来选择窗口菜单下的库选项打开库面板,再双击刚导入进来的swf的影片剪辑进入编辑状态,接下来再选择时间轴上的第一祯,再点击场景下面的动作面板将动作面板展开,如下图所示:

p3.jpg

图三

  再选择动作面板下的浏览器网络下的getURL,然后我们在右侧的URL文本框中写下我们的木马网页,这时时间轴的第一祯上就会出现一个符号,这就说明我们的动作脚本添加好了,影片剪辑编辑好了,我们再把这个影片剪辑拖到主场景中,重新生成一个flash即可。把生成的flash上传到你的空间,最后就是到各大论坛上去张贴你的flash了,这样当别人浏览你发的帖时就会自动访问你的木马网页了,这样也就自动执行了你做好的木马了。至于前面所说的网页木马制作,我们可以使用动鲨网页木马生成器,其界面如下:

p4.jpg

图四

首先把你前面配置好的魔兽世界木马的服务端上传到你空间,并记下他的地址,然后在图三中的最下面文本框输入你的木马地址,再点击生成网页木马就可以傻瓜式的生成网页木马了,把生成的所有文件再上传到你的空间里,最后把iframe里的网页木马地址改成刚生成的网页木马地址即可。

  现在这里我再给大家演示下盗取魔兽世界帐号密码的效果,如下图所示的,魔兽世界登陆界面:

p5.jpg

图五

  其中帐号密码我随便填的,事先我已在这台电脑上种植了魔兽世界木马,我们点击登陆以后,再到我们接收帐号密码的邮箱里去看,我们会发现我们的邮箱里多了这样一封邮件:

p6.jpg

图六

  看见了吧,输入的用户名密码都在里面了,是不是很爽。

经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:
 exec GetRecordFromPage news,newsid,10,100000
 news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。
*/

/*
 函数名称: GetRecordFromPage
 函数功能: 获取指定页的数据
 参数说明: @tblName   包含数据的表名
      @fldName   关键字段名
      @PageSize   每页记录数
      @PageIndex  要获取的页码
      @OrderType  排序类型, 0 – 升序, 1 – 降序
      @strWhere   查询条件 (注意: 不要加 where)
 作  者: 铁拳
 邮  箱: [email protected]
 创建时间: 2004-07-04
 修改时间: 2004-07-04
*/
CREATE PROCEDURE GetRecordFromPage
  @tblName   varchar(255),    — 表名
  @fldName   varchar(255),    — 字段名
  @PageSize   int = 10,      — 页尺寸
  @PageIndex  int = 1,      – 页码
  @OrderType  bit = 0,      – 设置排序类型, 非 0 值则降序
  @strWhere   varchar(2000) = "" – 查询条件 (注意: 不要加 where)
AS

declare @strSQL  varchar(6000)    — 主语句
declare @strTmp  varchar(1000)    — 临时变量
declare @strOrder varchar(500)    – 排序类型

if @OrderType != 0
begin
  set @strTmp = "<(select min"
  set @strOrder = " order by [" + @fldName + "] desc"
end
else
begin
  set @strTmp = ">(select max"
  set @strOrder = " order by [" + @fldName +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " * from ["
  + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
  + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
  + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
  + @strOrder

if @strWhere != ""
  set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
    + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

if @PageIndex = 1
begin
  set @strTmp = ""
  if @strWhere != ""
    set @strTmp = " where (" + @strWhere + ")"

  set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "]" + @strTmp + " " + @strOrder
end

exec (@strSQL)

GO