制作方法.txt 我简单说一下deac的道理吧..Engine HOOK的作弊里会调用一个cs引擎里面的地址 1d0d480 这个函数在SDK里面的名字是pfnGetPlayerInfo 用来获得玩家的名字信息.. 然后deac把这个地址修改到他自己的内存地址...10001aad ,而CDD因为比deac后进入内存并执行,所以他将得到dcoo被修改后的10001aad的入口...其实就进入了deac的函数啦,这样deac就知道有作弊..给一个0x45的错误..45 就是调用pfnGetPlayerInfo这个函数...我写的DCOO作弊器只要一用这个函数它就出45..不用就不会..不过这个问题我已经解决了,我用其他方法得到玩家的名字,不用调用这个函数也可以得到.. dcoo一共修改5个函数的入口,分别是pfnRegisterVariable,pfnClientCmd,pfnGetPlayerInfo,GetClientTime,pfnHookUserMsg 44是调用另外一个叫pfnGetEntbyIndex 这个是用来得到玩家的entity的信息的...但这个也可以绕过去.. 我发现这些都是OGC放出来的源码里面用到的..我想现在很多作弊器都是从Ogc里发扬光大出来的...因为这几个函数还是都在调用...
第一part:这篇东西是说如何过DCOO的,过DCOO用FPE也行,像仙剑一样,不过比较复杂而尔,现在说说前期道具:需要ring0级调试器SoftICE4.05 ForNT版本+XP补丁;FPE2001如果喜欢;USAMiMi_Hurricane游戏hacker必备工具;ring3级调试器OllyDBG V1.1改版;WinHex V10.46破解中文版;查壳工具PeID2006;加壳工具Asprotect SKE 2.3 build 04.26 beta、Themida1.5.0.0、Thinstall V2.521破解版、Vmprotect V1.2、Xtreme-Protector V1.08 beta、FilePacker V1.1清清紫衿汉化版、编程老大VC++6.0、PE格式文件编辑工具LordPE V1.4、进程补丁机Process Patcher V4.13(可选)、Acprotect(可选)和木马免杀工具CDS SS V1.0 beta1(可选),还有一个非常好使的ECC的调试器SimpleDebuger(到ECC官方网找找吧),找齐后就可以开始我们的旅程了。
从DCOO_0.51开始说吧,首先打开登录器,点开始游戏,cs启动后按下win键+R键输入%tmp%回车,会看到在目录下有个叫~bd1523.tmp的文件,现在打开PeID2006点...按钮选中刚才的目录下的~bd1523.tmp将看到最下面显示为nothing found*意思是未知改文件是加了什么壳——壳即保护软件的手段,现在打开usamimi,双击dcooXXXXX.exe进程,按菜单debug->desassemble module,在Target Module下拉菜单中选~bd1523.tmp模块(它名字前面有个数值比如10000000业界称image base就是它加载到内存的基地址意即从内存的这个地址开始存放这个文件的)——它其实真实的文件后缀是.dll就是DCOO反作弊器了,点CrossReference——意思是标出call、jmp等跳转的地方以参考,点Disassemble按钮对~bd1523.tmp进行反汇编,直接拖动滚动条会看到很多的PUSH XXXXXXXX——XXXXXXXX是8位不规则16进制数(比如地址10003e88处,大家可能不是10003e88因为DLL动态链接库文件每次加载到内存中的image base都可能不同业界称此为重定位而exe文件就没有这个苦恼,但只要把刚才下拉框中看到的image base+3e88就是了),它下一句就是一个JMP XXXXXXXX——意思是代码执行到此处就跳到XXXXXXXX的地方你可以在右上角的下拉框中写入这个数字然后按move按钮就可以到达那个jmp的地方了也可以用滚动条自己来找,然后在它跳到的地方又是一个PUSH XXXXXXXX+JMP XXXXXXXX再跟下去又是一串push jmp,那么就断定~bd1523.tmp是用了Vmprotect虚拟机来保护了,现在试着改一下~bd1523.tmp反汇编码的一个字节看看有什么后果——在汇编码中随便点一条语句,比如1001AEF处,单击后在下面的Fix Code By Opecodes的下拉框中看到了这条语句的汇编码,现在请把45改为44,点Fix按钮,好了,返回cs,选一个DCOO的服务器玩一下,几秒钟之后被踢出提示code99,说明~bd1523.tmp反作弊模块使用了代码防改(即使是用SoftICE对其下断点也被认为改了代码因为SoftICE下断点的实质其实就是在把语句的第一个字节改为INT3),然后返回Usamimi把刚才改的44改回45再返回cs进DCOO服务器玩就不会踢出了。本来我们只需要把PUSH 45下面的那条call 10004ebe语句nop掉就可以躲过code45检测的(注意这个code45中的45是16进制数值所以如果用FPE搜索10进制45的话就错了,而且这些codeXX中的XX从来正常下是不会出现16进制数值中不同于10进制数值的a、b、c、d、e、f的,所以这里好阴险)——在Usamimi中nop掉指令可以右键单击该条命令然后左键单击Fill with Nop,由于使用了代码防改+OEP(进入点——模块运行的第一条语句)用了俄罗斯的Vmprotect保护——就是因为这个OEP被Vmprotect搞过所以PeID2006测不出来是加了什么壳,所以要弄清楚代码防改的原理不是一两天的事,因此我们此时应该从另外一个角度去思考看看有没有更加便捷的方法,答案是有的。大家在DCOO上面玩过的朋友都知道如果不破解就如常进入DCOO服务器的话就会提示code45,如果是以前的DCOO登录器版本比如0.49版的话只要按照前面的方法打开cs后用Usamimi nop掉push 45下面的那条call指令就可以躲过code45检测了然后进入DCOO服务器又会看到code44的提示,绕过这个code44可以如前所述用Usamimi打开~bd1523.tmp模块后在汇编码中右键单击一下选择Search Text In Disassemble Codes框中输入push 44点往下搜索的Next按钮发现没有反应再点几次Previous按钮往上搜索看到和刚才code45的那个call 10004ebe就对了然后nop掉call 10004ebe就躲过code44检测,注意的是必须在进入DCOO服务器之前把这2个call 先nop掉否则有记忆效应的只要在服务器中出现了codeXX的绿色字之后再nop也没有用,现在51版本的DCOO登录器加了执行代码防改,那么怎么办好呢,不可以直接nop call指令,那么我们需要另辟蹊径。这时我们开动脑筋想一想,作弊器之所以可以看到敌人名字、距离+自瞄等是因为作弊器通过与hl主程通讯获取这些方面的信息然后把信息取回自己家里进行处理然后把这些处理过的信息再次通过hl主程将敌人名字、距离输出屏幕和控制你的枪口移动实现自瞄,这些动作都是需要和hl主程通讯的,所以DCOO反作弊模块~bd1523.tmp肯定在这个通讯过程中做了手脚导致作弊器某些作弊功能缺失和codeXX的,那么首先要弄明白的是什么是作弊器与hl主程通讯呢?其实在作弊器的汇编代码中的反映就是一个call XXXXXXXX 这个XXXXXXXX 8 位16进制数值是hl主程中的某个汇编码开始的地址而这个地址正是hl主程中某个函数的开始地方,作弊器通过push XXXXXXXX指令(可能有几个,hl主程的函数需要用到多少个参数就有多少个push然后就是call hl函数的指令了)将hl主程函数需要的参数推入堆栈(堆栈可以被理解为内存中存放函数参数的地方,常听说它的什么先进后出原理,其实这个先进后出很容易理解,就像给枪上子弹,最先压入弹夹的子弹肯定比最后压入的要后打出枪膛了,堆栈的先进后出跟打子弹一样),然后call hl函数对push进去的参数交给hl主程进行处理输出就实现作弊功能了,因此可以肯定~bd1523.tmp对作弊器的这些call做了手脚。那么又如何找到这些被改过的call呢?在USAmimi的Target Module下拉框中选中作弊器的模块名(这里以CDD4.33.4b为例子说明)如前所述对它进行反汇编,然后对汇编码搜索 push [ 字句,找到01341a3a(大家可能不是01341a3a但是后面的几个数值应该相同用前所述的image base原理就可以理解过来,下面遇到类似的情况不再详述)处为call [1363bd4]加了[]代表[1363bd4]是个指针表示真正要call的地址存放在1363bd4这个地方,这时按USAmimi Top旁边的-按钮把汇编页面收起来就可以看到一片16进制数值了,在16进制数值随便一处左键单击一下,按Ctrl+G键在Dump Window Address下的框中输入1363bd4回车就可以到达1363bd4这个内存地方了,在4列16进制数值里看到一大片的以01结尾的16进制数值(其实是01开头比如4列数值里面的20 d3 d0 01其实就是01d0d320它就是hl主程一个函数的起始地址),这些01结尾的数值当中明显有些异常,一些不是以01结尾而是以10结尾的比如05 37 00 10即10003705这一看就知道是以10000000为image base的~bd1523.tmp的内存地址,说到这里聪明的你应该知道问题出在哪里了吧,~bd1523.tmp就是修改了作弊器这些地方原本应该是call hl主程函数的现在被改为call DCOO反作弊模块~bd1523.tmp的函数了,所以你会被发现作弊codeXX,那么如何找到这些被改了的地方原来是什么数值呢?很简单,不要用DCOO登录器而是和以前没有DCOO登录器的时候一样直接启动作弊器和cs,如前所述用USAmimi来到作弊器被改的地方看就知道了,然后记下来,现在退出cs再重新打开作弊器、开DCOO登陆器按开始游戏按钮,打开USAmimi用前述方法来到作弊器模块被改的地方把刚才记下来的数值相应地改回去就可以躲过codeXX检测了(注意准备改数值的时候需要做多一步:就是点击usamimi工具栏上的黑色闪电图标,出来一个Set/Remove BreakPoint窗口即设置断点窗口,点一下Attach按钮,再点一下Pause按钮使cs暂停——相当于FPE暂停游戏按*键的效果一样,然后才开始改数值,因为usamimi修改16进制数值是即时生效的改一个字节就生效一个,不是等你修改完整个32位地址才生效所以如果没有暂停cs的话它会崩溃的。改完后就可以点一下Resume按钮重新激活cs了),现在回到cs进入DCOO服务器看看是否还有codeXX ^_^ 。
第二part:好了讨厌的codeXX死了,现在你可以活动自如了,但是你会发现人物在墙后面时看不到他的名字、距离等信息了,透视功能被屏蔽了!那么如何破解呢?我们想了想,透视功能主要是靠把墙绘制在人物名字距离等信息后面实现透视的,正常不作弊的情况下是把信息绘制在墙后面的所以看不到。知道原理后大胆猜测这个绘制函数的某个参数决定了绘制的是墙前或者是墙后,而这个墙前或者墙后无非在cpu里面是靠用0、1或者2、3等其他数值来表示的,所以将该参数传递给hl主程绘制函数的汇编语句就是push 0(1、2等),因此回到USAmimi对~bd1523.tmp模块搜索push 0,最后搜到10019a9处附近最像了,这时你把下面的call [10040a34] nop 掉然后返回cs进入DCOO服务器看看(不用担心防改被踢因为就看几秒钟,看完后改回就是了),嗯,有了变化,证明找对地方了,又返回USAmimi细看call [10040a34]下面的语句发现有一个跳转判断JPE short 10019ce,如果跳转实现了就会执行xor eax,eax retn2条语句,如果跳转没有实现就执行xor eax,eax inc eax retn3条语句,它们的差别就在于inc eax这条语句(xor eax, eax意为将cpu的eax寄存器清零,inc eax意为将eax加1,retn是函数结束标志),所以我们可以肯定的说这个跳转就是实现屏蔽透视的关键,而跳转的主要功能就是使eax值为1或者0,从而大胆猜测DCOO反作弊就是靠这个0或者1来判断是否屏蔽透视的,我们可以将刚才的call [10040a34] nop掉后再把jpe short 100019ce的汇编码7a 04改为7b 04把跳转条件反过来,进入DCOO服务器看几秒(记得不要M6来看,要选队伍),嗯,透视了!恭喜,还差最后一步了——搞定防改。确切地说不是搞定而是巧妙地躲过。由于防改保护不让修改任何一个执行代码的字节,所以我们细心观察刚才的call [10040a34],嗯,找到了,用USAmimi按前述方法查看10040a34这个地方的16进制数值看到一大片的01结尾的数据,和刚才作弊器模块看到的16进制数值很相似,这堆就是~bd1523.tmp需要用到的hl主程的函数起始地址了,而Microsoft定义的可执行文件(dll和exe都是)格式和众多编译器包括VC++6.0如果在没有特殊处理过的情况下这些数据都是写在可执行文件的数据区段下的,而数据区肯定是可以改变数值的——因为程序自己正常运行时也需要修改数据区的数值以进行数据缓冲如果禁止修改程序就会崩溃,现在大家有些眉目了吧,我们只需要把10040a34这个地方原来的数值(比如70 58 d7 01)改为下面一些空档的位置(就是一片00000000了,比如选择10040b70处),然后在这个位置写入任何你像写的代码,那么不就可以同时nop掉call [10040a34]所真正call到的70 58 d7 01而转为执行我们的任意代码了吗——一箭双雕是不是很爽?这时我们跟着就按前述方法把10040a34处的数值改为70 0b 04 10即10040b70然后再从10040b70处开始写我们自己的代码,这部分代码需要完成的功能是把eax清零再加1平衡堆栈和返回即汇编码为xor eax,eax inc eax add esp,18 retn,这句 add esp,18 是怎么来的呢,USAmimi回看~bd1523.tmp刚才call [10040a34] 下面有句add esp,14,用SoftICE在此处埋个断点回到游戏玩玩断电被触发SoftICE弹出你会发现在没有改call [10040a34]中的10040a34处的数值70 58 d7 01为70 0b 04 10之前esp寄存器的数值比改了10040a34处数值后的值要大了4,所以我们需要将原来的add esp,14变成add esp,18否则将会使程序崩溃,因为最后一句retn其实就相当于按照当时esp寄存器所存放的数值为地址进行jmp即跳转,所以如果esp不+4的话将会使这个跳转发生错误而导致程序崩溃,因此这里是一个关键业界称作平衡堆栈,日常生活中程序被改了之后一闪就退出表明堆栈平衡出了问题。因为USAmimi不可以直接输入汇编码对相关指令进行修改,所以我们现在需要SoftICE的帮忙(当然如果你对机器码极为熟悉也可以直接在USAmimi里面以10040b70为起点写机器码33c04083c418c3实现xor eax,eax inc eax add esp,18 retn这4条语句),回到cs中,按Ctrl+D键呼出SoftICE,输入a10040b70(意为从10040b70处开始编辑汇编语句),输入xor eax,eax回车,输入inc eax回车,输入add esp,18回车,输入ret回车,按esc键退出编辑状态,输入u10040b70(意为看10040b70处的汇编码)看看刚才的编辑效果吧。好了至此codeXX和透视都修改好了,进入DCOO服务器你又发现回到了未来。小tips:反作弊器和作弊器其实都是一个类别,都是索取hl主程所传递的信息任何修改再返回利用hl主程输出它们想要得到的效果,就像一颗毒瘤或者寄生虫一样,或者有些人喜欢叫这个为Hook钩子,作弊器想作弊,反作弊器就拦路打劫,然后我们反反作弊又绑架反作弊。
第三part:我们不想每次都这样用USAmimi、SoftICE等搞一大通(当然知道了要改的地方和数值后用FPE2001也是一个不错的选择而且大众化网上传.fpe文件也很小很快缺点是可能不是每台机器都可以用因为地址在不同的机器可能会不相同但对同一台机器基本是不变),所以就需要VC++6.0来帮忙了,大家不用看见编程就害怕,其实也没有什么难度的。源代码已经在附件,有详细的说明。如果想知道函数的详细信息可以上Microsoft的MSDN图书馆
http://msdn.microsoft.com/library/default.asp?url=/library/en-us在左上角的search for框中输入函数名称搜索就行了。有些代码我是参考ImportREC源码的,由于我不是计算机专业出身所以代码可能有些笨拙但条理还算清晰大家自行优化一下吧。再懒一点的可以用进程补丁机Process Patcher V4.13来编个脚本自动运行,它自己的说明很详细这里不多说。
第四part:用VC++6.0做好补丁程序之后,我们如果不想让人知道是对作弊器的DLL文件和~bd1523.tmp打补丁的话需要对对两个文件在exe文件数据区段的名字进行在程序当中动态解码解码后马上再清除掉留在堆栈中的痕迹。打开OLLyDBG,按Ctrl+D键选择补丁程序exe文件,右键汇编码->超级字串参考+—>查找ASCII,在弹出的窗口中双击作弊器DLL文件名或者~bd1523.tmp文件名,就会来到一个push命令处,就是这里了,记下最左边列的0040打头的地址值。我们需要在exe文件中找一处空白的地方即一连串00来填写我们动态解码的指令,可以这样来找,在OLLyDBG中左键单击汇编码,按Ctrl+B键,输入随便一串00,输得越多找到的空档也越大但是不可以输太多00因为exe文件的空位通常很有限,找到后记下这个地址(汇编码最左边一列以0040打头的数值),回到刚才push指令处左键单击它,按空格键,输入jmp XXXXXXXX(XXXXXXXX 代表刚才记下的找到的空档处的地址意为跳到这里执行我们自己准备写的动态解码语句)回车,再记下这个jmp的下面的push ecx 和call语句还有call语句的下一行代码地址,准备写解码部分和从我们自己写的代码处返回,然后按Ctrl+G键输入刚才找到的空档位地址数值回车来到空档处开始写我们自己的解码代码,我们准备用最简单快捷的xor异或指令来解码,首先将需待解码的字符串以4个字节为单位进行划分,比如~bd1523.tmp就划分为~bd1 523. tmpNull(Null表示以空结尾其相应的ACSII码为00)然后对这些字符逐个查其ACSII码,找到是7e 62 64 31 35 32 33 2e 74 6d 70 00,然后按Ctrl+D键呼出SoftICE输入命令?7e626431^ffffffff(?表示做以下运算,^表示异或运算,ffffffff=-1,意为与-1做异或运算)回车,就看到输出结果了,然后依次对35 32 33 2e 和74 6d 70 00做异或,记下3个结果(它们依次是81 9d 9b ce ca cd cc d1 8b 92 9f ff),按Ctrl+D键关闭SoftICE窗口,返回OLLyDBG,由于堆栈是先进后出的所以从最后一个结果开始写起,按Ctrl+E键(记得将保留大小的钩去掉)输入b88b928fff(b8表示mov eax,XXXXXXXX指令 请不要用按空格键的编辑状态来写这个mov语句这样会容易出错如果要写就倒过来写写成MOV EAX,FF8F928B才是正确的语句)回车,左键单击下一条语句按空格键输入xor eax,-1回车输入push eax(意为准备利用堆栈空间来动态解码字符串~bd1523.tmp),到此3句汇编语句就可以把tmpNull字符串压入堆栈中了,然后再左键单击下一行按Ctrl+E键输入b8cacdccd1回车,左键单击下一行键盘输入xor eax,-1回车,输入push eax回车,左键单击下一行按Ctrl+E键输入b88b928fff回车,左键单击下一行键盘输入xor eax,-1回车,输入push eax回车,输入push esp(意为把esp指针指向压入了堆栈中~bd1523.tmp字符串),输入push ecx回车输入call 403b20回车(意为补上原来的2条指令),下面就是抹除堆栈中的~bd1523.tmp字符串以毁尸灭迹,由于刚才把~bd1523.tmp相对应的16进制数值压入了堆栈占用了12个字节即Byte,push esp指令又把指向这个堆栈中的~bd1523.tmp字符串的指针压入了堆栈就又占了4个Byte,所以总共比没有解码时多占用了16个Bytes,所以就要将call指令之后的esp+8 esp+c 和 esp+10 3处的堆栈清零,于是接着刚才的push esp指令左键单击其下一行键盘输入AND DWORD PTR[ESP+8],0(意为把esp+8处与0作逻辑与运算,所有与0作逻辑与运算的结果都是0,所以功能就是清零)回车,输入AND DWORD PTR[ESP+C],0回车,输入AND DWORD PTR[ESP+10],0回车,输入add esp,c(平衡堆栈——因为原程序是没有把~bd1523.tmp压入堆栈的而我们现在为了解码把esp堆栈指针往上移了0xc个字节所以需要把esp往下反移0xc个字节而往下移动是用ADD加法的)好了动态解码部分写好后就需要用一个jmp XXXXXXXX语句跳回刚才跳到空档处语句的call语句的下一条语句了(这个XXXXXXXX是前面我要大家记下的)。如此一个简陋的动态解码总算完成了,有个规则就是尽量使用那些原来程序运行到这个解码部分附近语句时空闲的寄存器作为异或运算时的寄存器这样做可以尽量避免破坏原程序,所以虽然代码是笨拙了点但是容易理解用到的寄存器又少对原程序没有造成任何影响因此还是比较合理的。当然也可以学习Acprotect的动态解码语句:解码为 mov esi,ebx mov edi,ebx lods byte ptr[esi] rol al,3 stos byte ptr[edi] cmp byte ptr[edi],0 jnz short XXXXXXXX 其相对应的机器码为8bf38bfbacc0c003aa803f0075XX(明显地它的解码机器码比我的少但是缺点是用到了大量的寄存器而且语句比较难消化理解),它的抹除证据的语句是sub eax,eax mov byte prt[ebx],al inc ebx cmp byte ptr[ebx],al jnz short XXXXXXXX,其对应的机器码为2bc0880343380375XX(也是很简短,那么利弊得失自己选择吧,反正可以与原程序的寄存器和堆栈相平衡就怎么解码都行)。
第五part:合并和加壳我们的成果。因为你们总不想一下子就被反作弊的人通过反汇编你的exe看到你的修改思路而闪电般地封了你的作弊器吧,所以就需要请保镖了。这些保镖最强壮的无非几位Asprotect(兼容性好难破解)、Themida(老驱版和虚拟机版都很好只是与杀软特别是卡巴斯基格格不入)、XtremeProtector(多态解码、繁花——即干扰分析的垃圾指令、反dump、反attack debugger等效果一流只是解码有点慢!)、Vmprotect(一虚拟机,最大用途对关键函数进行模糊化,严格不算一个壳,特别对OEP处理后查壳工具就废了,但是躲不过经验的法眼,可以加壳上壳而且非常方便,速度还可以),加壳后可能机器上的杀软要狂叫有病毒、木马之类的,这时就需要用CDS SS V1.0 beta1来做一下免杀。再打壳之前有一步必须先做,就是用一个exe捆绑机把作弊器和补丁程序打包为一个exe文件,以后执行该文件它就会自动把文件解出来还原然后自动执行,捆绑机著名的有PEbundle等,但鉴于PEbundle不是十分好用,所以这里推荐一款更为好用的FilePacker,它可以打包之余指定解包后自动执行哪些程序执行时是否隐藏这些程序的窗口界面等还有程序结束后是否自动删除,但是该FilePacker做出来的捆绑东东有个弱点就是可以直接用winrar解压!所以我们再加一步用Thinstall对FilePacker做出来的东东压缩而且可以用Thinstall的link->splah screen来做个好看而且迷惑反作弊者的启动画面诱导他们去破解捆绑程序而忽略解包出来的真正程序(比如我就用了一个小鬼仔的图加上一个注入器的界面用mspaint.exe合并一下做成一个bmp文件再用Thinstall的splash screen功能做个淡入渐出的启动图而且把注入器图右上角的那些_ □ X 全部用mspaint.exe搞成灰色以假乱真而且Thinstall的splash screen里面要选只要点图片一下就自动退出图片的选项让人看起来更有趣更真实),由于Thinstall在看学论坛有脱壳脚本——虽然只是可以脱出主程序,但是我们也不想让其他人知道我们用了Thinstall来加壳,那么怎么办呢?我们可以查看PeID2006的userdb文件里面搜索Thinstall看看Thinstall壳的特征码是什么,找到原来是靠识别Thinstall壳入口点即EP附近大概10来条语句来达到辨认Thinstall壳的目的的。因此我们打开OLLyDBG调试器,按Ctrl+O键,选择我们用Thinstall加过壳的exe文件,左键点击第8句sub eax,1aa7因为这句的机器码(其左面的16进制数值)刚好是5个字节2d a7 1a 00 00所以刚好够写一个jmp语句所以就改它吧,随便记下sub eax,1aa7下一行的地址以便等一会返回,那么现在来找exe文件的空闲地方鬼佬叫这为hole即空洞——没有执行代码的地方通常是一连串的00——如前所述在OllyDBG中按Ctrl+B随便输入一串00回车找到了空白处,随便用键盘直接输入一些无用的语句比如说xor esi,esi(因为这个esi开始时一直是等于0的所以对它进行操作不会破坏原程序的平衡)回车然后就输入jmp XXXXXXXX(XXXXXXXX是刚才记下的地址),这样一来就把Thinstall壳的特征码给改变了(多了几条无用语句嘛),这时分别对刚才在OLLyDBG中改过的每一条语句右键单击选择复制到可执行文件—>*选择部分,每条语句都做过一遍之后用右键单击弹出的左上角有大写D字眼的窗口中的汇编码,选择保存文件问是否覆盖时选是OLLyDBG就会自动保存你刚才修改过的地方了,原来的exe文件OLLyDBG会自动把它备份为原程序所在目录下以.bak为后缀的文件的。好了现在再用PeID2006来查看这个Thinstall打壳的文件就会发现什么都找不到或者乱报一个其他壳出来了从而达到了以假乱真的目的。还有需要提醒的是不管exe文件或者DLL文件加壳也好还没有加壳也好都最好用LordPE把它们的区段名去掉然后把各区段属性改成一样这样可以托慢脱壳者的脚步让他来猜测每个区段的用途和不能通过看区段名知道加了什么壳(比如Themida就很喜欢把自己的壳所在的段名叫做Themida生怕没有人知道一样也可以顺便做做广告)。注:LorPE使用说明:第一次使用LorPE时应该打开LorPE电Option按钮,点OK,点exit按钮关闭LorPE这样做主要是让以后鼠标右键单击可执行文件(如DLL和exe等)弹出的菜单中可以有Load into PE editor(LordPE)选项方便我们直接调用LordPE的PE格式编辑窗口而省却好多麻烦;右键单击可执行文件如exe文件选Load into PE editor(LordPE),弹出了PE编辑窗,点section(意为区段)按钮,Name标题下的就是区段名称,flags标题下的就是每个区段的属性,鼠标右键单击某个区段选edit section header...(意为编辑区段头)把段名删除,把flags改为相同的随便一个数值如E0000040。
第六part:到此你的作弊器基本已经完成,剩下的就是用RAR打包这个exe文件(因为很多exe文件都不能直接网上传播比如QQ打成RAR方便一点),然后在打包后的RAR文件中添加注悉,再在包中放进 说明.txt 文档就大功告成了。如果不想这个作弊器被人传播得很厉害的话还可以用Acprotect来对这个exe文件进行硬盘ID、cpu信息等认证那么这个作弊器一经在某台机器运行一次之后就只有这台机器可以用而传不出去了除非牛人对Acprotect进行了破解就另当别论了。
附注:我认识的加壳工具之间的配合使用经验:Themida先打+Asprotect后打(体积大因为用了Themida兼容极差,运行速度一般);Vmprotect先打+Asprotect后打(体积比前者缩小一半多而且安全性好比较推荐,运行速度快,兼容性好);XtremeProtector先打+Asprotect后打(由于XtremeProtector的多线程解码使得程序运行极慢,但是有些自行改变过数据区数据为动态解码的程序必须用它来打壳就像前面所说的动态解码~bd1523.tmp兼容性能一般),以上3种组合都可以使得直接阅读反汇编码非常困难而且反调试反抓取内存就第2种组合差一点其他都很好,最猛的就是第3种组合但是运行速度最慢,那么速度、兼容、猛度大家自行选择。到最后用FilePacker把补丁、原作弊器等n个文件打成自执行包,再用Thinstall压缩防止直接的winrar解压,再用OLLyDBG修改Thinstall特征码防止被人知道是Thinstall壳,完成。
建议:建议DCOO登录器把~bd1523.tmp看看是否可以用Thinstall的猛功能——不解压到硬盘直接在内存执行文件——如果可行则增加被破解难度,而且不可以用Themida和XtremeProtector打壳速度太慢走路又要一顿一顿了,可以试试把主要call到的数据区中的hl函数起始地址通过手工或者工具把它们通通挪到代码区用防改保护起来——如果程序运行当中不需要改变这些数值的话——手工可能工作量太大但是我不知道有没有自动化的工具可以搬走数据区(据我所知Acprotect、XtremeProtector、Themida和Vmprotect这些猛壳都不行)。把codeXX后面的数值拿掉——如果是为了方便自己查找错误可以把debug版本加上但是发布时应该拿掉。然后查找汇编码中有规律的地方把它弄乱。
尾声:跟踪过程中得到了一些DCOO登录器的一些信息现在说说对兄弟可能有用:每隔大概45秒——忘记是哪个版本的DCOO登陆器了好像是0.4几吧——忽略一点网络延迟DCOO反作弊客户端会向服务器端发出setinfo _DEAC XXXXXXXXXXXXXXXX(XXXXXXXXXXXXXXXX代表16个字节的可变数值,每45秒改变一次和发送一次,0.27版本好像是26位后来的版本减少了位数一直是16位,可能这个就是服务器识别合法客户端的关键),然后定时(时间是多少我忘了——可以SoftICE对Sleep函数下断点跟踪即SoftICE呼出后输入bpx sleep回车,弹出后按F12就可以从系统函数Sleep领空返回到call Sleep函数的下一条语句上)向DCOO服务器发送你用于登陆DCOO登陆器的用户名以防止狂改名脚本防踢防投票,在CS控制台中可以改变登陆密码——命令为setinfo _dcoo XXXXXXXX(XXXXXXXX代表密码),还有就是用SoftICE断Sleep函数可以追到某段代码是DcooLogin040字符串解码(0.40之后的就是DcooLogin040,0.30系列的就是DcooLogin030)用途未知!在解码setinfo _DEAC XXXXXXXXXXXXXXXX 字串时push 了一个joystick 0参数用途也是未知——很多地方都用到了joystick 0——难道joystick 1就可以作弊?!比如反汇编码中你会经常看到这些动态解码汇编语句lea edi,[ebp-2e] stos dword ptr es:[edi] stos dword ptr es:[edi]。。。。。。lea edi,[ebp-2e]就是说把ebp-2e所指向的内存处数值送入edi寄存器然后每执行一行stos dword ptr es:[edi]就抹除4个字节,因此通常这些stos对上的一句call XXXXXXXX就是解码某个字符串的比如name、setinfo _DEAC %s等等。还有就是DCOO反作弊会定时扫描检查是否是system32目录下面的原装opengl32.dll文件,定时搜索gign leet等模型文件防颜色push esi push edi push ebx push dword ptr[ebp-14] push dword ptr[ebp-10] push eax call XXXXXXXX,这里的esi edi ebx [ebp-14] [ebp-10]所指向的内存中都是一些8字节的数值——猜测为模型文件的特征码最后的push eax 中eax指向的是模型文件名(如gign leet等)检查颜色的汇编码好长大伙可以慢慢跟。还有那些反后座力的作弊器DCOO是靠检测它们的程序窗口标题名称的比如什么Antirecoil Universal等。DCOO登录器在挂~bd1523.tmp反作弊模块进hl主程之前它会对cstrike和cstrike_schines目录下面的config.cfg和userconfig.cfg文件进行重写然后读取,所以不要指望修改好这4个文件然后会自动加载你的脚本,需要的话还是要从CS的控制台里面打exec命令,如果退出登录器它又会把这4个文件写一次,还有就是登录器刚启动时会检查注册表这个没什么作用就不提了。我所知道的暂时就这么多了,其他的留给感兴趣的兄弟们去摆弄了。另外FPE的hook技术真是相当高,它的tt.dll文件是什么进程都可以挂,就算开了CD4.33.4也可以挂,大多数的作弊注入器就挂不了开着CD4.33.4的cs进程,听说FPE的原理到现在也没有人知道。
对于Asprotect、Acprotect、Thinstall、XtremeProtector、Themida、OLLyDBG、Vmprotect、LordPE、PeID、Process Patcher 等可以到看学论坛工具版找,FilePacker V1.1、VC++6.0和SoftICE就要用google搜索了,我就放FilePacker V1.1的KeyGen、SoftICE V4.05 ForNT版本的XP补丁、SoftICE免反调试检测的改好的系统文件不需要FrogICE等打补丁了、SoftICE命令中文说明书、UsaMimi_Hurricane、CDD4.33.4无壳版+DCOO注入器无壳版、过DCOO0.51的SC.exe无壳版、作弊器登陆器补丁源代码和木马免杀工具CDS SS V1.0 beta1吧,它们个子比较小。另外SoftICE4.05 ForNT版本+XP补丁比Driver Studio V3.2好用,XP系统就不需要用Driver Studio V3.2这个大东东了,另外再附上用ECC作弊器panda*来讲解PE文件结构和输入表的图文,希望带不懂的人入门。