前言:
当然这是一款比较老的游戏,如今也只有少数痴迷、热爱的朋友在玩。(是不是暴露年龄了?)
工具:
使用的几款工具: PEiD; IDA pro 7;逆向神器,静态分析读代码,特别是交叉引用分析,对代码分析作用很大; WinDbg Preview;动态分析,异常捕获分析,动态和静态联合分析对我这次逆向启发很大; DeDeDark(本次没用上,具体是破解程序使用了针对这款逆向工具的反跟踪,还是DD软件的原因目前还不太清楚;我个人觉得前者的可能性高,因为在跟踪过程中发现很多“int 3”的调试陷阱代码,具体是不是限于个人水平没有弄清楚,这里请大佬指正。)
思路和步骤:
1.判断软件是基于什么编译系统开发的,并且有无壳的保护
2.熟悉反作弊登陆器的功能,判断反作弊的机制是什么
3.登陆器是如何启动游戏进程的
首先,登陆器启动游戏进程,需要一次进程调用,Window平台启动进程函数WinExec、ShellExecute、CreateProcess,因此依次定位这几处代码的调用,判断登陆器是如何启动游戏进程的。
sub_5FAADC: push ebp push offset loc_5FAB2A push dword ptr fs:[eax] mov fs:[eax], esp push 5 ; nShowCmd push 0 ; lpDirectory push 0 ; lpParameters mov eax, [ebp+var_4] call sub_407954 push eax ; lpFile push offset Operation ; "open" push 0 ; hwndcall ShellExecuteW (此处并非游戏启动) xor eax, eax pop edx pop ecx pop ecx
sub_609B30: mov ecx, [ebp+var_4] mov edx, offset aOld ; "old" call sub_407BC0 mov eax, [ebp+var_5C] call sub_407954 push eax ; lpParameters lea edx, [ebp+var_64] mov eax, [ebx] call unknown_libname_1018 ; BDS 2005-2007 and Delphi6-7 Visual Component Library mov eax, [ebp+var_64] ; System::AnsiString lea edx, [ebp+var_60] call @Sysutils@ExtractFilePath$qqrx17System@AnsiString ; Sysutils::ExtractFilePath(System::AnsiString) lea eax, [ebp+var_60] mov edx, [ebp+var_4] call sub_407B68 mov eax, [ebp+var_60] call sub_407954 push eax ; lpFile push offset aOpen_0 ; "Open" push 0 ; hwnd call ShellExecuteW (此处也不是) mov eax, [ebx] ; this call @Forms@TApplication@Terminate$qqrv ; Forms::TApplication::Terminate(void) xor eax, eax pop edx pop ecx
; int __fastcall TForm1_btn5Click(Ibcustomdataset::TIBDataSet *this) _TForm1_btn5Click proc near push ebx mov ebx, eax push 1 ; nShowCmd push 0 ; lpDirectory push 0 ; lpParameters push offset File ; "http://www.ip138.com/" push 0 ; lpOperation mov eax, ebx ; this call @Ibcustomdataset@TIBDataSet@PSGetParams$qqrv ; Ibcustomdataset::TIBDataSet::PSGetParams(void) push eax ; hwnd call ShellExecuteW (此处是检查IP代码处,会打开浏览器自行检查机器IP,登陆器查看本机IP功能的实现) pop ebx retn
TForm1_btn6Click push offset aIndexHtml ; "_index.html" lea eax, [ebp+var_4] mov edx, 6 call sub_407C48 push 1 ; nShowCmd push 0 ; lpDirectory push 0 ; lpParameters mov eax, [ebp+var_4] call sub_407954 push eax ; lpFile push 0 ; lpOperation mov eax, ebx ; this call @Ibcustomdataset@TIBDataSet@PSGetParams$qqrv ; Ibcustomdataset::TIBDataSet::PSGetParams(void) push eax ; hwnd call ShellExecuteW(查看服务器截图,会打开浏览器) xor eax, eax pop edx
由此可见,登陆器至少还与系统进程、浏览器进程有协作,并非游戏进程一个,这从登陆器界面中也可以判断出来,如打开系统文件目录设置游戏启动路径,查看IP和截图。
ShellExecuteW 定位并未找到启动游戏进程代码入口,因此换CreateProcess,果然发现,一处父类的点击调用(通过IDA文字提示能找到很多程序本身的信息线索),应该判断是游戏的启动入口。 text:0060C82E loc_60C82E: ; CODE XREF: _TForm1_btn_StrarClick+549↑j .text:0060C82E call unknown_libname_413 ; BDS 2005-2007 and Delphi6-7 Visual Component Library .text:0060C833 call sub_456914 .text:0060C838 push offset off_60CD5C ; lpName .text:0060C83D push 0 ; int .text:0060C83F push 0 ; lpMutexAttributes .text:0060C841 call @Windows@CreateMutexW$qqsp20_SECURITY_ATTRIBUTESipb ; Windows::CreateMutexW(_SECURITY_ATTRIBUTES ,int,wchar_t )(判断游戏进程是否已经启动,如果启动会终止,保证一个游戏进程的运行) .text:0060C846 lea eax, [ebp+ProcessInformation] .text:0060C84C push eax ; lpProcessInformation .text:0060C84D lea eax, [ebp+StartupInfo] .text:0060C853 push eax ; lpStartupInfo .text:0060C854 push 0 ; lpCurrentDirectory .text:0060C856 push 0 ; lpEnvironment .text:0060C858 push 20h ; dwCreationFlags .text:0060C85A push 0 ; bInheritHandles .text:0060C85C push 0 ; lpThreadAttributes .text:0060C85E push 0 ; lpProcessAttributes .text:0060C860 lea eax, [ebp+var_478] .text:0060C866 lea edx, [ebp+var_2C1] .text:0060C86C mov ecx, 0FFh .text:0060C871 push 0 .text:0060C873 call sub_407450 .text:0060C878 mov edx, [ebp+var_478] .text:0060C87E lea eax, [ebp+var_474] .text:0060C884 call sub_407A2C .text:0060C889 mov eax, [ebp+var_474] .text:0060C88F call sub_407954 .text:0060C894 push eax ; lpCommandLine .text:0060C895 lea eax, [ebp+var_480] .text:0060C89B lea edx, [ebp+var_3C0] .text:0060C8A1 mov ecx, 0FFh .text:0060C8A6 push 0 .text:0060C8A8 call sub_407450 .text:0060C8AD mov edx, [ebp+var_480] .text:0060C8B3 lea eax, [ebp+var_47C] .text:0060C8B9 call sub_407A2C .text:0060C8BE mov eax, [ebp+var_47C] .text:0060C8C4 call sub_407954 .text:0060C8C9 push eax ; lpApplicationName .text:0060C8CA call CreateProcessW (游戏进程启动) .text:0060C8CF mov eax, [ebp+ProcessInformation.dwProcessId] .text:0060C8D5 xor edx, edx ; System::AnsiString .text:0060C8D7 cmp edx, 0FFFFFFFFh .text:0060C8DA jnz short loc_60C903 .text:0060C8DC cmp eax, 0FFFFFFFFh .text:0060C8DF jnz short loc_60C903 .text:0060C8E1 mov eax, offset aCstrike64 ; "cstrike游戏启动失败,64位系统试下登录器右键用管理员运行" (读不懂代码,这里有提示啊) .text:0060C8E6 call @Dialogs@ShowMessage$qqrx17System@AnsiString ; Dialogs::ShowMessage(System::AnsiString) .text:0060C8EB push 0 ; lParam .text:0060C8ED push 0 ; wParam .text:0060C8EF push 10h ; Msg .text:0060C8F1 mov eax, ebx ; this .text:0060C8F3 call @Ibcustomdataset@TIBDataSet@PSGetParams$qqrv ; Ibcustomdataset::TIBDataSet::PSGetParams(void) .text:0060C8F8 push eax ; hWnd .text:0060C8F9 call PostMessageW .text:0060C8FE call sub_426460 .text:0060C903 .text:0060C903 loc_60C903: ; CODE XREF: _TForm1_btn_StrarClick+5FA↑j .text:0060C903 ; _TForm1_btn_StrarClick+5FF↑j .text:0060C903 mov eax, [ebp+ProcessInformation.dwProcessId] .text:0060C909 mov ds:dword_675690, eax .text:0060C90E mov eax, 3E8h .text:0060C913 call sub_606F30 .text:0060C918 mov eax, offset aCstrikeExe_2 ; "cstrike.exe" (这里也是提示) .text:0060C91D call sub_607430 .text:0060C922 cmp al, 1 .text:0060C924 jnz loc_60CA1A .text:0060C92A cmp ds:dword_675690, 0FFFFFFFFh .text:0060C931 jz short loc_60C96E .text:0060C933 mov dl, 1 .text:0060C935 mov eax, [ebx+418h] .text:0060C93B call unknown_libname_848 ; BDS 2005-2007 and Delphi6-7 Visual Component Library .text:0060C940 mov eax, off_66EC78 .text:0060C945 mov eax, [eax] .text:0060C947 lea edx, [ebp+var_3C0] .text:0060C94D call sub_6013DC .text:0060C952 mov eax, off_66EC78 .text:0060C957 mov eax, [eax] .text:0060C959 call sub_60283C .text:0060C95E mov eax, off_66EC78 .text:0060C963 mov eax, [eax] .text:0060C965 mov dl, 1 .text:0060C967 call sub_6017F0 .text:0060C96C jmp short loc_60C9A8
游戏启动入口找到了,发现了一个替换原程序dll文件的代码,就在游戏进程启动之前: push 80h ; dwFileAttributes lea edx, [ebp+var_428] mov eax, ds:dword_6755F4 mov eax, [eax+3E0h] ; this call sub_495714 lea eax, [ebp+var_428] mov edx, offset aOpengl32Dll ; "opengl32.dll" call sub_407B68 mov eax, [ebp+var_428] call sub_407954 push eax ; lpFileName call SetFileAttributesW lea edx, [ebp+var_42C] mov eax, ds:dword_6755F4 mov eax, [eax+3E0h] ; this call sub_495714 lea eax, [ebp+var_42C] mov edx, offset aOpengl32Dll ; "opengl32.dll" call sub_407B68 mov eax, [ebp+var_42C] call sub_4213C4 lea edx, [ebp+var_430] mov eax, ds:dword_6755F4 mov eax, [eax+3E0h] ; this call sub_495714 lea eax, [ebp+var_430] mov edx, offset aOpengl322Dll ; "opengl322.dll" call sub_407B68 mov ecx, [ebp+var_430] mov edx, offset aOpengl32 ; "opengl32" mov eax, offset off_60CCB4 call sub_6076D0 lea edx, [ebp+var_434] mov eax, ds:dword_6755F4 mov eax, [eax+3E0h] ; this call sub_495714 mov edx, [ebp+var_434] lea eax, [ebp+var_10] mov ecx, offset aOpengl322Dll ; "opengl322.dll" call sub_407BC0 lea edx, [ebp+var_438] mov eax, ds:dword_6755F4 mov eax, [eax+3E0h] ; this call sub_495714 mov edx, [ebp+var_438] lea eax, [ebp+var_14] mov ecx, offset aOpengl32Dll ; "opengl32.dll" call sub_407BC0 mov eax, [ebp+var_14] call sub_407954 push eax ; lpNewFileName mov eax, [ebp+var_10] call sub_407954 push eax ; lpExistingFileName call MoveFileW (用登陆器opengl322.dll替换掉原来的,即使读不懂代码,单步跟踪也是可以发现的。我曾经尝试过IDA分析替换后的opengl32文件,水平有限没看懂具体功能,估计是用作玩家个性化功能的实现,这个文件主要是玩家服装、枪和道具的功能,游戏中VIP玩家样式是不同的,实现功能可能是在这里) cmp eax, 1 sbb eax, eax inc eax jmp short loc_60C5C1
4.关键的问题:登陆器是如何监护游戏进程,进行截图反作弊的
0059AA15 call dword ptr [ecx+38h] .text:0059AA18 push 40CC0020h ; DWORD .text:0059AA1D push 0 ; int .text:0059AA1F push 0 ; int .text:0059AA21 mov eax, [ebp+hDC] .text:0059AA24 push eax ; HDC .text:0059AA25 mov eax, off_66F110 .text:0059AA2A mov eax, [eax] .text:0059AA2C call sub_543ABC .text:0059AA31 push eax ; int .text:0059AA32 mov eax, off_66F110 .text:0059AA37 mov eax, [eax] .text:0059AA39 call sub_543AC4 .text:0059AA3E push eax ; int .text:0059AA3F push 0 ; int .text:0059AA41 push 0 ; int .text:0059AA43 mov eax, [ebp+var_28] ; this .text:0059AA46 call @Graphics@TBitmap@GetCanvas$qqrv ; Graphics::TBitmap::GetCanvas(void) .text:0059AA4B call sub_46ECE4 .text:0059AA50 push eax ; HDC .text:0059AA51 call BitBlt (读取截图) .text:0059AA56 test eax, eax .text:0059AA58 jnz short loc_59AA69 .text:0059AA5A call @System@@TryFinallyExit$qqrv ; System::linkproc TryFinallyExit(void) .text:0059AA5F call @System@@TryFinallyExit$qqrv ; System::linkproc TryFinallyExit(void) .text:0059AA64 jmp loc_59ACFF …… 0059ABBC mov eax, esi .text:0059ABBE mov ebx, [eax] .text:0059ABC0 call dword ptr [ebx+90h] .text:0059ABC6 lea eax, [ebp+var_10] .text:0059ABC9 mov edx, offset aYyyyMmDdHhMmSs_0 ; "yyyy-MM-dd hh:mm:ss" .text:0059ABCE call sub_4070CC .text:0059ABD3 call @Sysutils@Now$qqrv ; Sysutils::Now(void) .text:0059ABD8 fstp [ebp+var_38] .text:0059ABDB wait .text:0059ABDC push dword ptr [ebp+var_38+4] .text:0059ABDF push dword ptr [ebp+var_38] .text:0059ABE2 lea ecx, [ebp+var_14] .text:0059ABE5 mov edx, off_66ED4C .text:0059ABEB mov eax, [ebp+var_10] .text:0059ABEE call @Sysutils@FormatDateTime$qqrx17System@AnsiString16System@TDateTimerx24Sysutils@TFormatSettings ; Sysutils::FormatDateTime(System::AnsiString,System::TDateTime,Sysutils::TFormatSettings &)(打时间码,上传服务器的每张截图都有时间码) .text:0059ABF3 lea eax, [ebp+var_70] .text:0059ABF6 push eax .text:0059ABF7 mov eax, [ebp+var_14] .text:0059ABFA mov [ebp+var_64], eax .text:0059ABFD mov [ebp+var_60], 11h .text:0059AC01 lea edx, [ebp+var_64] .text:0059AC04 xor ecx, ecx .text:0059AC06 mov eax, offset dword_59AE00 .text:0059AC0B call sub_421D6C .text:0059AC10 mov eax, [ebp+var_70] .text:0059AC13 push eax .text:0059AC14 mov ecx, 0AAh .text:0059AC19 mov edx, 1Eh .text:0059AC1E mov eax, esi .text:0059AC20 mov ebx, [eax] .text:0059AC22 call dword ptr [ebx+90h] .text:0059AC28 mov dl, 1 .text:0059AC2A mov eax, ds:off_586AC8 ; this .text:0059AC2F call @Jpeg@TJPEGImage@$bctr$qqrv ; Jpeg::TJPEGImage::TJPEGImage(void) .text:0059AC34 mov [ebp+var_30], eax .text:0059AC37 xor eax, eax .text:0059AC39 push ebp .text:0059AC3A push offset loc_59AC8F .text:0059AC3F push dword ptr fs:[eax] .text:0059AC42 mov fs:[eax], esp .text:0059AC45 mov edx, [ebp+var_2C] .text:0059AC48 mov eax, [ebp+var_30] .text:0059AC4B mov ecx, [eax] .text:0059AC4D call dword ptr [ecx+8] .text:0059AC50 mov eax, [ebp+var_30] .text:0059AC53 mov byte ptr [eax+44h], 3Ch .text:0059AC57 mov eax, [ebp+var_30] ; this .text:0059AC5A call @Jpeg@TJPEGImage@Compress$qqrv ; Jpeg::TJPEGImage::Compress(void) (压缩图片) .text:0059AC5F mov dl, 1 .text:0059AC61 mov eax, ds:off_43E42C .text:0059AC66 call sub_405028 .text:0059AC6B mov [ebp+var_18], eax .text:0059AC6E mov edx, [ebp+var_18] .text:0059AC71 mov eax, [ebp+var_30] .text:0059AC74 mov ecx, [eax] .text:0059AC76 call dword ptr [ecx+60h] .text:0059AC79 xor eax, eax .text:0059AC7B pop edx .text:0059AC7C pop ecx .text:0059AC7D pop ecx .text:0059AC7E mov fs:[eax], edx .text:0059AC81 push offset loc_59AC96 定位BitBlt函数也是失败的。 只能再换个思路,我在想,既然登陆器要对游戏进程截图,至少在截图前首先定位游戏进程的窗口,因此是否可以进行findwindow()函数的定位找到代码,通过WinDbg拦截还是失败,但是这次,结合登陆器的截图机制,就是时间函数的调用,发现了一个疑似接近截图的地方。 这其中进行过Settimer函数的定位,发现定期截图(其实是离散时间的,控制在一定时间内)并不是通过这个函数实现的。 但是,跟踪Gettickcount函数就可以在截图之前进行程序的拦截,说明这一次起码能控制截图的实现了。代码在这里: 00602798 loc_602798: ; CODE XREF: .text:00602785↑j .text:00602798 call GetTickCount_0 .text:0060279D sub eax, ebp .text:0060279F cmp edi, eax .text:006027A1 jnb short loc_60280D .text:006027A3 mov eax, [ebx+0Ch] .text:006027A6 cmp byte ptr [eax+2BEh], 0 .text:006027AD jnz short loc_6027D1 .text:006027AF mov eax, [ebx+0Ch] .text:006027B2 mov byte ptr [eax+2Ch], 0 .text:006027B6 mov eax, [ebx+0Ch] .text:006027B9 call sub_602214 .text:006027BE mov [esp+4], al .text:006027C2 mov eax, [ebx+0Ch] .text:006027C5 mov eax, [eax+34h] .text:006027C8 mov dl, 1 .text:006027CA call unknown_libname_848 006027B9 之前断下,登陆器不会截图;跳过这个代码,下一处断下,就有截图了,说明text:006027B9 call sub_602214,是控制截图的代码实现的。 对于有经验的朋友,其实很容易跟进去发现的,但对于我来说第一次跟踪到这里时,有点不识庐山真面目了;因为我一直困惑,截图功能究竟是登陆器实现的还是游戏实现的,如果在这里能控制截图的话,是不是就是登陆器实现的?那对登陆器进行文件和图片的拦截是能够成功的,问题在于之前几次尝试并未成功;所以,这次真的有点懵了。 而且,截图后的图片是保存在游戏文件路径下的;可以确定的是截图功能就是游戏进程实现的;但是登陆器要对是否截图、什么时候截图、截图后读取截图(还要删除)等进行控制。 那这个过程怎么才能实现呢?我在想,既然游戏实现截图,是否自身就带有截图功能,如此来说就简单了。经过查资料,发现还真有,就是通过快捷键完全可以截图,截图保存路径和命名方式完全和登陆器是匹配的。那就简单了,其实就是通过登陆器模拟一次键盘截图操作就可以了,通过消息传递给游戏进程告诉游戏该截图了,然后等待一段时间,等游戏截图完成,再读取截图上传服务器就可以了。跟进上文的那个地址代码: 00602214 sub_602214 proc near ; CODE XREF: .text:006027B9↓p .text:00602214 ; sub_60338C+2F↓p .text:00602214 push ebx .text:00602215 push esi .text:00602216 xor ebx, ebx .text:00602218 push 0 ; lpWindowName .text:0060221A push offset off_602264 ; lpClassName .text:0060221F call FindWindowW .text:00602224 mov esi, eax .text:00602226 test esi, esi .text:00602228 jz short loc_60225E .text:0060222A push 0 ; lpWindowName .text:0060222C push offset off_602264 ; lpClassName .text:00602231 call FindWindowW(查找游戏窗口) .text:00602236 mov esi, eax .text:00602238 push 3F0001h ; lParam .text:0060223D push 74h ; wParam .text:0060223F push 100h ; Msg .text:00602244 push esi ; hWnd .text:00602245 call PostMessageW (模拟按键) .text:0060224A push 0C03F0001h ; lParam .text:0060224F push 74h ; wParam .text:00602251 push 101h ; Msg .text:00602256 push esi ; hWnd .text:00602257 call PostMessageW (模拟松开) .text:0060225C mov bl, 1 .text:0060225E .text:0060225E loc_60225E: ; CODE XREF: sub_602214+14↑j .text:0060225E mov eax, ebx .text:00602260 pop esi .text:00602261 pop ebx .text:00602262 retn .text:00602262 sub_602214 endp
以上代码即为登陆器模拟按键操作,通知游戏进程进行截图。
验证: 发现有两处调用此处代码,把这两处屏蔽掉,屏蔽代码的方式有很多,nop掉可以,或者Jmp掉,我用ret把这两处都屏蔽掉的,这样做有个好处,只改这个函数内的第一个代码就可以实现两处调用全部屏蔽,而且保证原来的寄存器数据安全,因为nop和Jmp可能会涉及到数据安全问题,导致程序发生异常。(不知道这样想对不对) 下面是修改后的代码: t:00602214 locret_602214: ; CODE XREF: .text:006027B9↓p .text:00602214 ; sub_60338C+2F↓p .text:00602214 retn 原先是push ebp .text:00602215 ; --------------------------------------------------------------------------- .text:00602215 push esi .text:00602216 xor ebx, ebx .text:00602218 push 0 ; lpWindowName .text:0060221A push offset off_602264 ; lpClassName .text:0060221F call FindWindowW .text:00602224 mov esi, eax .text:00602226 test esi, esi .text:00602228 jz short loc_60225E .text:0060222A push 0 ; lpWindowName .text:0060222C push offset off_602264 ; lpClassName .text:00602231 call FindWindowW .text:00602236 mov esi, eax
这样,运行登陆器,发现不会截图了。就这样,破解登陆器的截图反作弊就基本实现了第一步;但是这样有个问题,就是很容易被服务器发现的,因为服务器没有截图,是会被怀疑作弊的。 那怎样实现反反作弊呢?这个问题就有意思了。其实相关代码找到了,实现反反作弊也是完全可能的,这里我只说一下自己的思路,其实就是在通知截图之前先把作弊器关掉就可以,截图完成后再开启,就完全能够躲避反作弊的。但是我个人不建议这样做,毕竟文明游戏才是正道。尤其对于为数不多的还有人玩的经典游戏,作弊就更没必要了。
5.登陆器是多线程的,这样设计有个好处
loc_406B9C: mov ds:byte_670059, 1 mov eax, [ebp+lpThreadId] push eax ; lpThreadId mov eax, [ebp+dwCreationFlags] push eax ; dwCreationFlags push ebx ; lpParameter mov eax, offset unknown_libname_50 ; BDS 2005-2007 and Delphi6-7 Visual Component Library push eax ; lpStartAddress mov eax, [ebp+dwStackSize] push eax ; dwStackSize mov eax, [ebp+lpThreadAttributes] push eax ; lpThreadAttributes call CreateThread mov esi, eax test esi, esi
这是几处dephi线程调用的入口,跟踪发现,登陆器的玩家信息(界面右边的窗口显示区域)是独立线程操作的,截图和上传功能也是独立线程操作的,但是在对线程下断点时,发现登陆器容易发生线程调用异常错误,估计是线程间通信被中断导致的句柄错误(不知道对不对)。
感悟: 代码定位如果一个思路不行,就多换几个思路,在可能性最高的地方下断点进行拦截分析,能够节省不少时间; 每一种编译平台对代码的处理方式均有自己的方式,尤其是Dephi; 实践和理论结合起来,就能成长的更快; 多来看雪论坛,学到更多知识; 因为我是小白,文中定有不少漏洞和错误,希望大佬给出指正; 感谢平台。 最后,我有个问题:我这算不算入行了啊?
我是出于对反作弊代码实现的好奇,和想知道这款软件中有无恶意代码,所以想跟踪一下;同时声明本次破解并无恶意,仅仅是作为一次尝试和练习的过程。
我是真正的
0
基础开始学习,并无编程经验,也非IT魔界人士,只是对计算机安全感兴趣,看过不少相关资料的书籍;也经常浏览看雪论坛中各位大神的技术分享,收获颇丰,本次就自己斗胆尝试了一下破解的过程。
当然,这次破解我选择的破解对象也比较简单,如果您是高手的话完全可以路过的。下面是这款游戏(Cs1.
5
)反作弊登陆器的界面:
我是出于对反作弊代码实现的好奇,和想知道这款软件中有无恶意代码,所以想跟踪一下;同时声明本次破解并无恶意,仅仅是作为一次尝试和练习的过程。
我是真正的
0
基础开始学习,并无编程经验,也非IT魔界人士,只是对计算机安全感兴趣,看过不少相关资料的书籍;也经常浏览看雪论坛中各位大神的技术分享,收获颇丰,本次就自己斗胆尝试了一下破解的过程。
当然,这次破解我选择的破解对象也比较简单,如果您是高手的话完全可以路过的。下面是这款游戏(Cs1.
5
)反作弊登陆器的界面:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课