关于防拷系统研究破解心得:

/*------------------------------------------------------------

                第一部分     综合看防拷系统

/*------------------------------------------------------------
  要破防拷的人越来越多,而破的人几乎很少,这个程序有点霸道,所以,我很讨厌它.又看到了这样的信息:

//下面的内容是转载:
1.SF会安装在第0轨,也就是系统层,此後,除非format或用特殊方式,不然SF无法移除乾净。    
2.SF会取得硬体资源最高控制权,无论是否在进行游戏,永远、随时的监控你的电脑。    
3.SF会经常性读取光碟机,防止有人从该处动手脚,但这样拼命操的後果就是,光碟机损坏率大幅提升。    
4.SF会避过window安全机制,暗中置换USB、1394等系统档,且永远无法修复,即使在安全模式都无法改回原样,
  这种动作同等於病毒所为。    
5.SF监视下,若发现虚拟、盗版相关,有时为防止其正常运作,会造成当机。    
6.SF持续集电脑内所有资料,若SF运作过程中发生错误,会将电脑完整资讯传回给SF设计公司,这资料的内容
  达3千7百多行,里面包含私人资料。    
7.美国已禁止使用该软体,且Ubisoft,绝冬城之夜2,银河文明2等都声明不再使用SF软体了。    
8.银河文明2声明不使用後,在该公司官方讨论版上,遭到SF设计公司的攻击,甚至恶意散布银河文明2的下载点,
  使其知道盗版的利害。 


  无论以上内容是否为真,我无从考证,宁可信其有,也不要相信没有,我至少看到了400KB左右的系统报告,
大致看了看,几乎对你的电脑进行了体检,没有你电脑上不被记录的.
我们先来看看这个被命名为:report.txt的文档里都有什么?

/*----------------------------------------------------
下面是未知序列号,这个到没什么的:
[Support Information Collected] 
MYTMZH-TQBLYD-HRGT59-VLSNW3
B, D, F, 1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

接下来是你的错误报告时间等.也没什么!在下面就是你系统信息:

[System Information] 
系统名称: XX
[系统摘要]

项目  数值  
OS 名称  Microsoft Windows XP Professional  
版本  5.1.2600 Service Pack 2 内部版本号 2600  
OS 制造商  Microsoft Corporation  
系统名称  XX  
系统制造商  XXXX      //这个是我电脑的制造商
系统模式  XXXXXXXX    //电脑的生产序号  
系统类型  基于 X86 的 PC  
处理器          XXXXXXXX    //我处理器
BIOS 版本/日期  XXXXXXXX    //BIOS  
SMBIOS 版本  2.31  
Windows 目录  C:\WINDOWS  
系统目录  C:\WINDOWS\system32  
启动设备  \Device\HarddiskVolume1  
地区  中华人民共和国  
硬件抽象层  版本 = "5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)"  
用户名称  MG\Silly  
时区  中国标准时间  
总的物理内存  XXXXXX MB  
可用物理内存  XXXXXX MB  
总的虚拟内存  XXXXXX GB  
可用虚拟内存  XXXXXX GB  
分页文件空间  XXXXXX GB  
页文件  C:\pagefile.sys  

//我把我相关的都"XXXX"代替了.大家不信可以自己统计.

/*-------------------------------------------------------------
下面是硬件设置,有什么硬件一请二楚,大家自己看看就明白.十分的详细.电脑上的所有硬件都会被详细统计,没有一个
不被统计的,无论相关与不相关都会被记录.
当然硬盘最关键了,我看了看有详细的分区信息和你硬盘的厂商及序列号.还有关于硬盘的所有其它信息,我想除了温度
没有不被统计的.
再下来就是你装的系统驱动,能用的不能用的都被统计.
再下来是系统环境变量,下面是做的部分进程统计:

/*---------------------------------------------------------------------------------------
[正在运行任务]

名称  路径  处理 ID  优先顺序  最小工作设置  最大工作设置  开始时间  版本  大小  文件日期  
system idle process  不可用  0  0  不可用  不可用  不可用  不可用  不可用  不可用  
system  不可用  4  8  0  1413120  不可用  不可用  不可用  不可用  
smss.exe  c:\windows\system32\smss.exe  672  11  204800  1413120  2007-9-20 13:32  5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)  49.50 KB (50,688 字节)  2006-6-10 0:00  
csrss.exe  不可用  388  13  不可用  不可用  2007-9-20 13:34  不可用  不可用  不可用  
winlogon.exe  c:\windows\system32\winlogon.exe  508  13  204800  1413120  2007-9-20 13:34  5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)  476.00 KB (487,424 字节)  2006-6-10 0:00  
......................
/*-----------------------------------------------------------------------------------
当然还有进程模块.系统服务的统计,那些开启,那些没开,标的很清楚.
服务完了就是程序组,安装了什么程序一看都在里面吧!自启动程序都也被狩猎.跟杀毒软件一样的,很全一样没少没漏!
OLE注册信息,系统错误报告.
网络设置被统计了IP地址安全设置等等.

除了你的系统用户名和密码外,几乎都被统计了.
/*------------------------------------------------------------------------------------


看完上面的也许,大家觉得罗嗦!实际也没什么的.那我无话.如果,电脑可以被统计的如此详细那么,它统计你的帐号密码也不是没什么问题.也许我说的很片面,如果觉得我说的有点道理的,就支持一下!如果觉得是无聊瞎说,就当个乐呵!



/*-------------------------------------------------------

          第二部分  防拷系统的实现分析

/*-------------------------------------------------------



提到这个分析我们必须对两类知识有了解.第一类:PE结构,第二类:WINDOWS机制

第一:
/*-----------------------------------
看上面最开始的问题,我们发现一个大问题,大家都知道的,凡是破过或用过的都碰到过的.瑞星卡卡和防拷系统是死对头,很多人都说装了瑞星卡卡那个狮子就过不了防拷,我就将我的分析解释如下:

很明显的,如果我转载的第一条信息为假,那么,瑞星卡卡和防拷没什么瓜葛!也就是瑞星卡卡不会和防拷冲突.反过来,假如它真的要借用零磁道,那么它必须把已经在引导启动的瑞星卡卡请回家,因为瑞星卡卡是有部分程序在引导执行,也就是说,一山不容二虎.实际防拷过不去是因为,瑞星卡卡占了它想去的地方.我只是个人看法.大家请给点意见!

如果我分析的没错,也就是说转载的第一项是正确的.


第二:
/*-----------------------------------
我们都很清楚,用OD破防拷会被蓝屏,这个大家都明白吧!很多都蓝过吧!今天我再给大家解释一下这个蓝屏怎么回事,假如,我转载的第二项为假,那么它就不会蓝屏为什么这么说呢?

先来了解一下,关键的内容Ring级别:
  Ring3和Ring0。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将会导致整个系统崩溃,如果所有的程序都能使用这些指令,那么系统将不知道什么原因就会当机,就会蓝屏,由于这个原因,CPU将指令分为特权指令和非特权指令,对于那些特权指令只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾害的指令。可以更形象的说特权指令就是那些儿童不宜的东西,非特权指令就是那些老少皆宜的东西。Intel的CPU指令特权级别分为四个级别:Ring0,Ring1,Ring2,Ring3。Windows只使用其中的Ring0和Ring3两个级别,其中Ring0是给操作系统使用,Ring3可以任意应用程序使用。Windows下的系统服务都是工作在Ring0级别上的,NT服务提供的函数都是完全运行在内核模式下。

  大家看的也许有点糊涂,高手一看就明白.也就是防拷在被调试的时候,防拷系统有可能是获取了Ring0权限,来拥有对硬件操作的最高权,而普通的程序对硬件的操作都是被操作系统限制的,也就是说在Ring3权限无法对硬件有最为容易访问和控制权,只有获得了Ring0权限才可以对硬件直接操作.而我们对系统都了解的知道以下概念!

0x7FFFFFFF=2GB
0xFFFFFFFF=4GB

Windows内存管理:
  Windows和大多数现代操作系统一样,Windows实现按需调页的虚拟内存机制。由于操作系统使用了虚拟内存,这就给应用程序造成了一个假象,以为计算机安装的内存远远超过自己所需要的数量。
  在32位的Windows计算机上,进程具有4GB的虚拟内存地址空间,操作系统通常会把这4GB的地址空间划分为进程和系统两个部分。因此,每个进程可以获得2GB的虚拟内存,根据可用的容量。分配给所有进程的虚拟内存总数不能超过页面文件和大多数物理内存的总和(操作系统本身也要占据一小部分物理内存)。
有了这种机制,加上足够大的页面文件,就可以给进程分配超过物理内存容量的虚拟内存,Windows内存管理子系统必须让多个进程和缓存的文件数据(由缓存管理器管理)共享物理内存。内存管理器给每个进程(例如Windows Explorer、记事本和Word)指派一部分物理内存,这叫做进程的工作集。可分页的内核和驱动程序部分,加上可分页的内核内存缓冲区(叫做分页池),还有缓存管理器所管理的物理内存,它们具有自己的工作集,叫做系统工作集。

  也就是说所有的普通程序都是在Ring3上面运行,我们的OD也不例外,我们发现一下!随便打开一个程序,按下面的步鄹:
菜单->查看->内存,会发现点什么呢?往上面看看,往下面看看有没有大于0xFFFFFFFF的,也就是说OD也只能在Ring3的权限内进行程序调试!前面提到过,防拷为了获得对硬件的直接控制权它专门获得了系统权限,也就是说防拷和操作系统是拥有一样的权限,它就可以访问系统空间.我们来看一下
0x00000000-0x7FFFFFFF  是用户的2GB空间
0x80000000-0xFFFFFFFF  是系统的2GB空间
  如果当一个普通进程访问系统空间,会怎么样呢?系统当然为了稳定将它赶回去了,也来个比方:OD和防拷同去公园,防拷有门票进去了,OD没门票不让进,OD生气了,电脑蓝了.实际就这么简单的.现在明白了蓝屏怎么回事了吧!
  在OD追踪防拷的时候,被操作系统挡了回来而且还告诉OD:这里不是你这样的低等级程序能来的,那里来的回那呆着去!你可知道这里是系统专用2GB空间0x80000000-0xFFFFFFFF,这就是大家看到的蓝屏上字的含义.而防拷获得了和系统一样的专用权,在防拷解密代码的时候,防拷占用的空间是系统的2GB空间,这样做的唯一好处就是你的系统不会再和以前一样稳定了,即使卸载了,也会影响系统稳定.如果经常GHOST系统的朋友就无所谓了,但是GHOST系统会影响硬盘的寿命.实际和病毒已经有点相近了,在系统权限做监视是病毒们的爱好,但是这样的病毒却不多,如果防拷要是专门监视你的安全信息那也是随手一拿的事,因为它连系统监视也可以很轻松的做到!还有什么不行的吗?做让人觉得可怕的是Ring0权限上运行的黑手.

第三:
/*-----------------------------------------------------------
防拷系统的自动运行,先来看看一段C代码,这个是我仿照防拷写的DLL,熟悉C的朋友一看就懂:

/*-----------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
           )
{
    switch (ul_reason_for_call)
  {
  case DLL_PROCESS_ATTACH:
    {
    //首次加载DLL时从此处执行
    //当然,这里你可以开一个线程  
          hInstance=(HINSTANCE)hModule;
          MessageBox(NULL,"Test!","[DLL加载]参数测试!",MB_OK);
    break;
    }
  case DLL_THREAD_ATTACH:
    break;
  case DLL_THREAD_DETACH:
    //做一些善后工作,如释放内存
    break;
  case DLL_PROCESS_DETACH:
    //善后
    break;
    }
    return TRUE;
}

-------------------------------------------------------------*/

  这个不是DLL入口代码吗?是啊,这个有什么好说的人人都知道!但是人人都知道的东西,我们却为它不解了,防拷处理过的程序会自动运行的学问就在这里!DLL_PROCESS_ATTACH这个消息的处理让你在调用LoadLibrary获得DLL文件句柄时,程序已经被执行!还没用GetProcAddress程序已经被执行了,如果有兴趣的可以试一下!LoadLibrary后就被执行.说到这里又要解释一下了,实际我们的DLL和EXE都不是从DllMain()和WinMain()处才开始执行的.而是从__DllMainCRTStartup()和__WinMainCRTStartup处已经开始做最初的初始化了.不说那么多了,说多了又糊涂,总之,要知道的是:LoadLibrary一执行,DLL_PROCESS_ATTACH消息会被处理.
  现在说了DLL的关键所在,那大家都知道WINDOWS可执行文件在执行前都会初始化加载一些模块,这些模块通常是系统执行程序最基本的,如:user32.dll,kernel32.dll,ntdll.dll等等.很常见吧!而我们看到的防拷处理过的程序,加载模块的时候也会被加载防拷DLL,因此,大家就看到防拷界面出现,而程序还没到WinMain或DllMain.这会大家明白了吧:)


第四:
/*--------------------------------------------------------
内存断点被忽略,除了硬件断点,管用以外,内存断点关键时候会不管用,我还没研究清楚.以后补




第五:
/*----------------------------------------------------------
代码在解密的时候有个固定格式:
//第一个参数是特征码:
//第二个参数是函数地址,这样的函数被称为手工函数,同常要跳两下才能到关键地方:
0097E000 >  68 7CB6B2A7     push    A7B2B67C
0097E005  - FF25 BCE19700   jmp     dword ptr [<&PAL4P.#1>]          ; PAL4P.#1
//第二处跳转:
00CB6000 > /E9 7D000000     jmp     00CB6082
//最后入口,函数入口都是这样固定的格式之前版本与之后版本有所不同:
00CB6082    60              pushad
00CB6083    9C              pushfd
00CB6084    FC              cld
00CB6085    E8 00000000     call    00CB608A
00CB608A    5B              pop     ebx
00CB608B    8D9B 76FFFFFF   lea     ebx, dword ptr [ebx-8A]
00CB6091    8B43 48         mov     eax, dword ptr [ebx+48]
00CB6094    B9 00100000     mov     ecx, 1000
00CB6099    3BC1            cmp     eax, ecx
00CB609B    76 0B           jbe     short 00CB60A8

  一整大的跳转之后天南地北就分不清楚了:(,比起之前的版本增加了破解难度,之前的跳转好搞现在新版的比较难了,每次都是大跳,而且地址不一样,实在晕头转向.


第六:
/*-------------------------------------------------------------
函数的重定位,实际就是把入口加密了,让你不知道调用那个函数,主要分三类:
第一,API函数:比较难,对API要特别清楚,不然很难修复确定函数是那一个的.而且要对写程序的经验也要熟悉哦!凭的就是经验了.后面会举例的
第二,内部函数加密:这个简单
第三,外部函数:这个就难了,关键是不知道调用那个函数,做了什么,一边解密一边执行,等到头了,也执行完了.相对来说最难了.


第七:
/*----------------------------------------------------------------
跳转,主要是JMP JE JNE JLE JG等等加密,让你看不出来跳那去了.解决简单.



第八:
/*------------------------------------------------------------------
举例,最简单的一个API函数修复的例子很简单的,比这个难的那就靠经验分析了哦!
这个是创建窗口的一部分,反汇编如下:


004099A0  /$  83EC 30       sub     esp, 30
004099A3  |.  A1 F4088E00   mov     eax, dword ptr [8E08F4]
004099A8  |.  53            push    ebx
004099A9  |.  8B5C24 38     mov     ebx, dword ptr [esp+38]
004099AD  |.  55            push    ebp
004099AE  |.  56            push    esi
004099AF  |.  8BF1          mov     esi, ecx
004099B1  |.  57            push    edi
004099B2  |.  6A 7F         push    7F
004099B4  |.  8D4E 78       lea     ecx, dword ptr [esi+78]
004099B7  |.  53            push    ebx
004099B8  |.  51            push    ecx
004099B9  |.  8946 68       mov     dword ptr [esi+68], eax
004099BC  |.  E8 EFB12600   call    00674BB0                       ;这里简单点,忽略或者算是修复好了吧
004099C1  |.  8B5424 58     mov     edx, dword ptr [esp+58]
004099C5  |.  8B46 68       mov     eax, dword ptr [esi+68]
004099C8  |.  8B4C24 64     mov     ecx, dword ptr [esp+64]
004099CC  |.  83C4 0C       add     esp, 0C
004099CF  |.  33ED          xor     ebp, ebp
004099D1  |.  C74424 10 300>mov     dword ptr [esp+10], 30
004099D9  |.  68 007F0000   push    7F00                             ; /RsrcName = IDC_ARROW
004099DE  |.  55            push    ebp                              ; |hInst => NULL
004099DF  |.  C74424 1C 002>mov     dword ptr [esp+1C], 2000         ; |第一个参数从0x7F00看出来是个常数也就是说它是一个固定的值,
004099E7  |.  895424 20     mov     dword ptr [esp+20], edx          ; |PUSH EBP第二个参数中EBP是什么呢?往上看就看到xor     ebp, ebp这句说明就是:
004099EB  |.  896C24 24     mov     dword ptr [esp+24], ebp          ; |FUN(NULL,0x7F00)的函数,这段时间会有什么函数出现了呢?熟悉写程序的朋友都知道
004099EF  |.  896C24 28     mov     dword ptr [esp+28], ebp          ; |最常出现的是LoadCursorA和LoadIconA那么到底那一个呢?我们发现,LoadIconA通常会是
004099F3  |.  894424 2C     mov     dword ptr [esp+2C], eax          ; |字符串出现的多或者它还有个MAKEINTRESOURCE这个出现!还有就是0x7F00= IDC_ARROW
004099F7  |.  894C24 30     mov     dword ptr [esp+30], ecx          ; |出现的最多,所以这里修复使用前着LoadCursorA
004099FB  |.  FF15 74278400 call    dword ptr [842774]               ; \LoadCursorA
00409A01  |.  8B5424 5C     mov     edx, dword ptr [esp+5C]
00409A05  |.  894424 2C     mov     dword ptr [esp+2C], eax
00409A09  |.  8D4424 10     lea     eax, dword ptr [esp+10]
00409A0D  |.  896C24 30     mov     dword ptr [esp+30], ebp
00409A11  |.  50            push    eax                              ; /pWndClassEx
00409A12  |.  896C24 38     mov     dword ptr [esp+38], ebp          ; |就一个参数,结构都创建了不注册窗口等着干嘛!
00409A16  |.  895C24 3C     mov     dword ptr [esp+3C], ebx          ; |这里100%就是注册窗口了:)
00409A1A  |.  895424 40     mov     dword ptr [esp+40], edx          ; |
00409A1E  |.  FF15 70278400 call    dword ptr [842770]               ; \RegisterClassExA
/*-----------------------------------------------------------
  
//下面是关于注册窗口的C样板代码
  wndclass.style=CS_HREDRAW | CS_VREDRAW;
  wndclass.lpfnWndProc=WindowProc;
  wndclass.cbClsExtra=0;
  wndclass.cbWndExtra=0;
  wndclass.hInstance=hInst;
  wndclass.hIcon=LoadIcon(hInst,(LPCTSTR)IDI_ICON1);
  wndclass.hCursor=LoadCursor(NULL, IDC_ARROW);
  wndclass.lpszMenuName=NULL;
  wndclass.lpszClassName=szAppName;
  wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

//我们对应一下:
004099DF  |.  C74424 1C 002>mov     dword ptr [esp+1C], 2000   ;  wndclass.style    
004099E7  |.  895424 20     mov     dword ptr [esp+20], edx    ;  wndclass.lpfnWndProc    
004099EB  |.  896C24 24     mov     dword ptr [esp+24], ebp    ;  wndclass.cbClsExtra      
004099EF  |.  896C24 28     mov     dword ptr [esp+28], ebp    ;  wndclass.cbWndExtra        
004099F3  |.  894424 2C     mov     dword ptr [esp+2C], eax    ;  wndclass.hInstance      
004099F7  |.  894C24 30     mov     dword ptr [esp+30], ecx    ;  wndclass.hIcon    
004099FB  |.  FF15 74278400 call    dword ptr [842774]         ;  wndclass.hCursor

//可以看的明白大家轮一轮到:)简单吧!
---------------------------------------------------------------*/
00409A24  |.  66:85C0       test    ax, ax
00409A27  |.  75 26         jnz     short 00409A4F
00409A29  |.  6A 53         push    53
00409A2B  |.  68 8C3F8A00   push    008A3F8C                         ;  ASCII "D:\PAL4\project\Sourcecode\RwCasing\rwc_Windows.cpp"
00409A30  |.  68 303F8A00   push    008A3F30                         ;  ASCII "FILE:  [%s]
LINE:  [%d]
INFO:  Error[rwcWindows::createWindows failed <RegisterClassEx>]


"
00409A35  |.  E8 F686FFFF   call    00402130
00409A3A  |.  50            push    eax                              ;  根据上面的文字就知道是要做什么了注册窗口了.
00409A3B  |.  E8 8089FFFF   call    004023C0
00409A40  |.  83C4 10       add     esp, 10
00409A43  |.  33C0          xor     eax, eax
00409A45  |.  5F            pop     edi
00409A46  |.  5E            pop     esi
00409A47  |.  5D            pop     ebp
00409A48  |.  5B            pop     ebx
00409A49  |.  83C4 30       add     esp, 30
00409A4C  |.  C2 1C00       retn    1C                               ;注册失败就从这里回家了
00409A4F  |>  8DBE 08010000 lea     edi, dword ptr [esi+108]         ;这里是干吗的呢?不知道了吧糊涂了吧!呵呵!
00409A55  |.  89AE 0C010000 mov     dword ptr [esi+10C], ebp
00409A5B  |.  55            push    ebp                              ;PUSH EBP说明这个函数只有一个参数,但是拿OD跟来看看,EBP=1或0
00409A5C  |.  892F          mov     dword ptr [edi], ebp             ;参数为1或0的就很少了,很有可能是BOOL性的参数,只有1和0的,当然
00409A5E  |.  8B0D 980E8E00 mov     ecx, dword ptr [8E0E98]          ;也有2的,可是这里用了两次,发现了么?两次说明了什么参数1和0的
00409A64  |.  8B2D 6C278400 mov     ebp, dword ptr [84276C]          ;结果不一样的,那我们看看什么函数需要一个参数,而且返回值却不同
00409A6A  |.  898E 10010000 mov     dword ptr [esi+110], ecx         ;用的几率最高的是那个呢?GetSystemMetrics,我怎么知道是它呢?
00409A70  |.  8B15 9C0E8E00 mov     edx, dword ptr [8E0E9C]          ;首先,这个时候用的最多的就是GetSystemMetrics,其次,SM_CXSCREEN
00409A76  |.  8996 14010000 mov     dword ptr [esi+114], edx         ;SM_CYSCREEN两个参数让它返回了不同的值,其次是一个参数,我们再验证一下
00409A7C  |.  FFD5          call    ebp                              ;如果,CreateWindowExA这个函数的长和宽没定那就肯定是了,要问为什么的
00409A7E  |.  6A 01         push    1                                ;只能说是需要多研究,经验了:)
00409A80  |.  FFD5          call    ebp
00409A82  |.  A1 F8088E00   mov     eax, dword ptr [8E08F8]
00409A87  |.  85C0          test    eax, eax
00409A89  |.  75 14         jnz     short 00409A9F
00409A8B  |.  8A4424 50     mov     al, byte ptr [esp+50]
00409A8F  |.  BD 00000A80   mov     ebp, 800A0000
00409A94  |.  84C0          test    al, al
00409A96  |.  74 09         je      short 00409AA1
00409A98  |.  BD 0000CA80   mov     ebp, 80CA0000
00409A9D  |.  EB 02         jmp     short 00409AA1
00409A9F  |>  33ED          xor     ebp, ebp
00409AA1  |>  6A 00         push    0                                ; /HasMenu = FALSE
00409AA3  |.  55            push    ebp                              ; |Style    这个函数是最不好估计的但是,幸好它没加密的,但是分析的话可以
00409AA4  |.  57            push    edi                              ; |pRect    从这几个参数入手,毕竟大家可以很容易的得到EDI是RECT类型指针
00409AA5  |.  FF15 68278400 call    dword ptr [842768]               ; \AdjustWindowRect 三个参数的RECT类函数就不多了,GetWindowsRect,GetClientRect
00409AAB  |.  8B46 68       mov     eax, dword ptr [esi+68]          ; 在窗口没创建之前用它们是不可能的,而FrameRect这类函数却很少见,最常见的
00409AAE  |.  8B8E 14010000 mov     ecx, dword ptr [esi+114]         ; 只有它了哦!可以根据参数数量和内容确定的
00409AB4  |.  8B96 10010000 mov     edx, dword ptr [esi+110]
00409ABA  |.  6A 00         push    0                                ; /lParam = NULL这个不用看了吧!注册这么长时间的窗口,还不创建要等到什么时候,
00409ABC  |.  50            push    eax                              ; |hInst        数数参数够,PUSH 0/PUSH EAX/PUSH 0符合CreateWindowExA函数的最后三个
00409ABD  |.  8B86 0C010000 mov     eax, dword ptr [esi+10C]         ; |             参数,PUSH 0就是lParam通常是NULL/PUSH EAX就是句柄/PUSH 0就是不要菜单,
00409AC3  |.  6A 00         push    0                                ; |hMenu = NULL 这类游戏程序要什么菜单当然是0了
00409AC5  |.  2BC8          sub     ecx, eax                         ; |
00409AC7  |.  6A 00         push    0                                ; |hParent = NULL
00409AC9  |.  8B4424 58     mov     eax, dword ptr [esp+58]          ; |             PUSH ECX 和PUSH EDX算算正好是长和宽的位置
00409ACD  |.  51            push    ecx                              ; |Height
00409ACE  |.  8B0F          mov     ecx, dword ptr [edi]             ; |
00409AD0  |.  2BD1          sub     edx, ecx                         ; |
00409AD2  |.  52            push    edx                              ; |Width
00409AD3  |.  6A 00         push    0                                ; |Y = 0        数数就是坐标嘛!
00409AD5  |.  6A 00         push    0                                ; |X = 0
00409AD7  |.  55            push    ebp                              ; |Style
00409AD8  |.  50            push    eax                              ; |WindowName    OD跟过来看到窗口标题没问题了肯定是CreateWindowExA
00409AD9  |.  53            push    ebx                              ; |Class
00409ADA  |.  6A 00         push    0                                ; |ExtStyle = 0
00409ADC  |.  FF15 64278400 call    dword ptr [842764]               ; \CreateWindowExA 
00409AE2  |.  85C0          test    eax, eax
00409AE4  |.  8946 6C       mov     dword ptr [esi+6C], eax
00409AE7  |.  75 0A         jnz     short 00409AF3
00409AE9  |.  5F            pop     edi
00409AEA  |.  5E            pop     esi
00409AEB  |.  5D            pop     ebp
00409AEC  |.  5B            pop     ebx
00409AED  |.  83C4 30       add     esp, 30
00409AF0  |.  C2 1C00       retn    1C
........................................省略吧!要这样下去什么时候才完呀!




恩!....下回给大家带来破解防拷的方法! 
我这里用的是PAL4的反汇编代码!下会我真的想和大家共享破解方法,但是我实在怕这样做会影响的仙剑正版,基本上都破了,也修的差不多了,现在只是BUG修复,还有就是我的破解不支持2003和VISTA.我真的为难了,发与不发一直在考虑,所以,我和大家都希望下会把破防拷的方法带给大家,但是我看了游侠论坛的朋友的意见,真的想留着自己玩了,至于我是否能够再发关于破防拷的文章,我也很难说,我现在很困惑了,如果,发了也许我从今以后都不会在破防拷了,也看不到仙5了.正如软星解散的时候说的一样:随缘!......


 

                                                                 -By EasyStudy For PhantomNet
                                                                 2007 .9   .20