与其说是技术,实际上我也不懂技术的,或许叫传递来自调试器的信息更合适。
如果你是路过或赚币的,请忍忍手,我不喜欢那种翻了好多页面也找不着北的感觉。
如果你要加分,别指望我会谢你。
如果你有与本贴相关的问题要说,请务必详细陈述,我会尽可能的回复你。
本贴以操盘手游客登录1.0.3.0版为基础。
先简单的说一下验证过程:
当按下游客登录后会生成所需的发送数据,其中有48H长度的是重要数据。
服务器接收到数据后,会检查前10H字节的数值,也就是2个主程序的校验值。
当你修改过主程序后,校验值就会错的,服务器会返回程序错误的信息。
通过文件校验值后,服务器读取硬件参数,并在库存查找相同的数据。
这会有两种情况。
1、当你以同样的硬件参数登录过,服务器自然会找到相同的数据,然后取出上次分配给你的帐号,如果帐号已经过期,会连同帐号和提示已参加过试用的信息返回给你。
2、如果你是新客户登录,那么服务器自然就找不到相同的数据,然后配给你一个帐号,并将此帐号和你的硬件参数保存在服务器的库中,并将帐号和下一个服务器地址信息返回给你。
这样基本上已经通过验证了。
0041A7C8 64 30 30 33 64 63 65 38 62 33 34 31 32 37 61 33 d003dce8b34127a3
0041A7D8 63 32 38 39 39 30 37 36 31 31 31 31 78 78 78 78 c289b7531111xxxx
0041A7E8 38 65 35 65 61 33 65 35 78 78 78 78 78 78 78 78 8e5d2f4bxxxxxxxx
0041A7F8 33 35 64 35 39 63 36 36 78 78 78 78 31 31 31 31 35bc68adxxxx1111
0041A808 39 65 61 62 63 62 61 38 9e64ab73
关于控硬件问题:
很多人喜欢“靠估”,工匠们也会忙于试练,自然就有很多种结果。
谁是公?谁是婆?谁是公婆?哈哈~~~~
一个合格的程序员,要控硬件的话,必需要考虑到客户机的情况。
然后根据PC平台环境配备几个取硬件参数方案是必需的。
在众多的实例中都用到由系统版本代号决定执行那个方案,这是我前一贴中提到的第一个问题。
在读取硬盘物理序列号的时候也要考虑的接口问题,这是我前一贴中提到的第二个问题。
不管那个 方案,修改局部变量是不取的。
说到取硬盘物理序列号的时候,很多人自然会想到DeviceIoControl函数断点,然而这个函数非常强大,某些系统的核心库在初始化时反复地调用这个函数与底层交换数据。
在实施时大家也会考虑用Hook DeviceIoControl方案,其实这个也只是局部变量来的,问题是有些方案根本就不调用DeviceIoControl函数。
我个人更注重参数的传递,也就是全局变量的传递,在合适的地方插一脚就OK,省事多了。
我不阻人财路的,这样讨论或会损害第三方的利益,清多包涵。
操盘手游客登录版本来就是商用广告版,可能会引起见光即死,死就死吧,那是我的荣幸,不死的话就当我替他们做广告吧。
代码方面:
OD载入L2LC.exe,F9直接运行到弹出登录框。
不登录,返回OD,Ctrl+G,输入4064D9后确认。
定位到4064D9后下硬件执行断点,再顺便看一下到出口前的相关代码。
Ctrl+F2重新开始就会断在4064D9的入口处。
00406505 FF15 A4204100 CALL [4120A4] ; GetVersionExA 取系统版本代号
00406528 83BD 28FEFFFF 0>CMP DWORD PTR [EBP-1D8], 2 ; 由系统代号决定执行那个取硬件参数模块。
由系统代号决定执行一或二的主模块,其中一、有3个子模块,在3个子模块中的任一个模块修改硬件参数都是不可取的,它只是个局部变量,不具有通用性,发布破解就要考虑使用全局变量。
一、1
00406535 E8 2AF9FFFF CALL 00405E64 ; 取硬盘物理序列号,IDE接口。
上面的模块调用是以\\.\physicaldrive%d为参数创建管道与硬件通信,并以控制码74080或7C088为参数调用(kernel32.DeviceIoControl),如果返回成功就不再执行下面的取硬件参数模块,如果返回失败就执行下一个取硬件参数模块。
一、2
0040654D E8 81FAFFFF CALL 00405FD3 ; 取硬盘物理序列号,SCSI接口。
上面的模块调用是以\\.\Scsi%d为参数创建管道与硬件通信,并以控制码4D008为参数调用(kernel32.DeviceIoControl),如果返回成功就不再执行下面的取硬件参数模块,如果返回失败就执行下一个取硬件参数模块。
一、3
00406565 E8 F6FCFFFF CALL 00406260 ; 取硬盘物理序列号,但我没机会进去,估计是新的SATA接口。
上面的模块调用是以\\.\physicaldrive%d为参数创建管道与硬件通信,并以控制码2D1400AA或2D0C10为参数调用(kernel32.DeviceIoControl),如果返回成功就不再执行下面的取硬件参数模块,如果返回失败就执行下一个取硬件参数模块。
二、
00406580 E8 79FEFFFF CALL 004063FE ; 取当前目录,分区大小,硬盘逻辑序列号
上面的模块调用由系统代号决定是否执行,但当前面一、中3个子模块都失败时也会执行这个模块。
00406587 33D2 XOR EDX, EDX ; 最合理的就是在这修改硬件参数
这里可以看到硬件参数的全局变量,也就是说不管执行那个模块取硬件参数,其结果都在这里看到,怎么应用那就是个人的习惯了。
00406659 E8 95650000 CALL 0040CBF3 ; 计算 l2stock.exe 返回EAX=间址
执行后间址存放的就是l2stock.exe校验值。
004066FE E8 F0640000 CALL 0040CBF3 ; 计算 L2LC.exe 返回EAX=间址
执行后间址存放的就是L2LC.exe校验值。
0040672A E8 3C660000 CALL 0040CD6B ; 计算硬件参数, 返回EAX=间址。
执行后间址存放的就是计算硬件参数得到的值。
===== 说完了,自问也说得够清楚的了,回归深海继续享受奇妙的世界。=====
评论(0)