|
//我们对应一下: 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了.正如软星解散的时候说的一样:随缘!...... 给大家一个我破的图: 001.JPG -By EasyStudy For PhantomNet 上一页 [1] [2] [3] [4] |