关闭

关闭

关闭

封号提示

内容

首页 实用电脑技术实例-1271.PDF

实用电脑技术实例-1271.PDF

实用电脑技术实例-1271.PDF

等你来聊 2012-06-26 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报

简介:本文档为《实用电脑技术实例-1271pdf》,可适用于高等教育领域,主题内容包含破解技术实例[原创]菜鸟KOF单文件版本制作记标题:[原创]菜鸟KOF单文件版本制作记作者:yanjun详细信息:我是个KOF迷自从上初中以来就对K符等。

破解技术实例[原创]菜鸟KOF单文件版本制作记标题:[原创]菜鸟KOF单文件版本制作记作者:yanjun详细信息:我是个KOF迷自从上初中以来就对KOF情有独钟(没少被老爸K)尤其是KOF版本更是喜欢的很从有了电脑开始WinKawaks模拟器就一直常驻我的硬盘模拟最多的游戏就是KOF自己的键盘也快不行了。虽然WinKawaks模拟器功能强大但是衍生的文件和文件夹就一大堆我想到同学家搞把拳皇还要打包压缩解包实在受不了一直以来都想在网上看到有单文件版的KOF出现可是就是没有人做我想这么一个经典的游戏应该有个好版本并且以前也试过制作但是一直都没有成功这与我是个菜鸟有很大的关系。难得现在放寒假有时间于是花了两天的时间终于把它搞定(我实在是太菜了)。我使用飞雪汉化的典藏版进行制作并且文件以前用工具脱过壳好像是Aspack的壳(还好能够自动脱)不过现在使用LordPE查看段名有UPX还有ASPACK等有可能是我以前修改过又加了一次壳。使用OD加载查找字符串发现一大堆有用的sszip等就是fprintf格式化后加载的ROM文件,winkawaksini用来初始化INI文件使用这些现不管他。我想原程序它肯定要从外部加载ROM文件。要制作单文件版本的程序就必须将文件整合到EXE文件中而且还要找到原程序ROM文件加载的地方将其修改成从内存中加载。于是使用OD查找-当前模块中的名称(Ctrl+N)一大堆的都是个MFC函数的调用这个MFC我也没有学过我想大概就是个跳转的意思不然OD也不会将它们识别为函数。仔细一看发现竟然没有CreateFile,OpenFile等函数当时吓了我一跳我在想Windows下编程不使用这几个文件函数那还算Windows应用程序吗?在往下都是些fopen,fprintf,fputc,fread等一些C语言下的文件读写函数是不是这些函数速度快或者是在Windows中不常用作者才使用它?设置断点fopen在仔细监视sszip等字符串的走向随便加载一个游戏找到了调用ROM文件的地方:EABAMOVEAX,DWORDPTRSS:ESPAEAEDPUSHWinKawakEDASCII"rb"EAEPUSHEAXEAFECCALL<JMPMSVCRTfopen>上面的文件操作类型为”rb“其中的b是将文件看作二进制文件读写这有可能是ROM只能当作二进制文件读写所以作者使用C下面的fopen,fread函数等找到关键ROM调用后只要进行跳转到自己的代码处执行就可以进行修改但是这个ROM文件到底怎么整合到EXE文件中去呢?我先使用LordPE将KOFZIP作为一个段从磁盘中载入。这样EXE文件不仅有了ROM文件还可以正常运行。可是如何加载这段ROM呢并且返回的是个FILE指针。这时我傻了打开MSDEV和TurboC下的stduoh文件发现说明如下:TurboC中:typedefstruct{shortlevel*fillemptylevelofbuffer*unsignedflags*Filestatusflags*charfd*Filedescriptor*unsignedcharhold*Ungetccharifnobuffer*shortbsize*Buffersize*unsignedchar*buffer*Datatransferbuffer*unsignedchar*curp*Currentactivepointer*unsignedistemp*Temporaryfileindicator*shorttoken*Usedforvaliditychecking*}FILE*ThisistheFILEobject*MSDEV中:#ifndefFILEDEFINEDstructiobuf{char*ptrintcntchar*baseintflagintfileintcharbufintbufsizchar*tmpfname}typedefstructiobufFILE于是我按照MSDEV中自己的理解在OD运行时并且EXE文件已经按原来程序正确从磁盘中加载了ROM文件后我找到FILE指针的结构,将base指向ROM段地址ptr也指向ROM段地址。可相而知程序以非法运行中止。经过无数次的非法中止我发现这种直接从内存读取数据的方法行不通当时就这个问题也发了贴子问别人我的电脑没有联网在网吧呆了一天(那天)我还是回到的自己的电脑桌慢慢研究。既然自己的创意不行我就看看别人的单文件版本是这么做的(这也是我学习Crack的主要原因)。我记得以前的《网友世界》上有一个三国游戏叫”霸王的大陆“是单文件版。终于给我从宝贝CD盒里找了出来是年月第期里的(这些杂志光盘可是我菜鸟的最爱)。使用资源编辑器ExeScope发现它是将ROM做出资源保存在EXE文件中有”ROM“和”SANFONT“两种不常见的资源类型可以肯定这时作者加的了。在使用OD加载既然使用到了资源肯定有LoadResource调用设断后找到ROM资源加载位置:|>AEEPUSH霸王的大EEAResourceType="ROM"|EEPUSH霸王的大EE|ResourceName="#"A|PUSHESI|hModuleB|FFCCALLDWORDPTRDS:<KERNELFindResour>FindResourceAA|BFMOVEDI,EAXA|PUSHEDIhResourceA|PUSHESI|hModuleA|FFCALLDWORDPTRDS:<KERNELLoadResour>LoadResourceAB|PUSHEDIhResourceAC|PUSHESI|hModuleAD|DMOVDWORDPTRSS:EBP,EAX|B|FFCALLDWORDPTRDS:<KERNELSizeofReso>SizeofResourceB|EMOVDWORDPTRSS:EBPC,EAXB|BDMOVEAX,DWORDPTRSS:EBPBC|PUSHEAXnHandlesBD|FFCALLDWORDPTRDS:<KERNELLockResour>SetHandleCount注意处ResourceName="#"而ExeScope中是直接的查找Winsdk,FindResource就是这么要求的。这个里面使用了CreateFileWriteFile等函数。但是加载资源后好相并没有将句柄作为pFileName传送。而是作者直接对资源内容举行了处理似乎是加载资源LoadResource返回的句柄就直接和CreateFile函数返回的句柄功能相同这个我没有仔细的研究因为我现在的程序使用的fopen函数根本一点关系都扯不上。那是不是可以将LoadResource返回的句柄作为fopen函数的第一个参数进行调用呢。我在DevC中使用了一小段C程序进行上面猜测的模拟结果以失败告终。没办法只好操起OD继续看流程。这个时候OD给了我提示:OD在堆栈段中显示PUSH进堆栈中的两个fopen参数是FCFF|path="bbzip"FCCEDmode="rb"注意第一个参数OD解释的是”path“也就是说必须是一个路径fopen才能执行成功。其它的什么地址参数fopen本来就不是很牛擦当让不吊你。(也难怪以前DOS下几十K的内存哪还能考虑到这些磁盘中能放下几个文件供调用就不错了。)于是我就有了一个笨方法相信大家都想到了。现将ROM文件做成资源然后EXE将资源文件转存到硬盘在修改fopen的第一个参数为刚才资源文件的路径这样不就OK了吗?于是统计我们需要的函数如下:<KERNELDLL>GetSystemDirectory(将文件存储到系统目录)FindResource(资源函数)LoadResourceSizeofResourceLockResourceFreeResourceCreateFile(文件函数)WriteFileSetEndOfFileCloseHandle<MSVCRTdll>strcat(连接字符串生成路径使用)使用LoadPE分析EXE文件添加两个新的输入表。这样就要到刚才分析到访问ROM文件的地方进行代码修改了。将EA处修改成JMPF(这块有好多好像是脱壳留下来的不然这地方也太大了)FFMOVDWORDPTRDS:F,ESP保存原来的ESP用来修改原始ROM路径使用FPUSHADFECALLKofDIYF调用路径生成FCNOP按理所这里是POPAD但是我一加就有错FDBAMOVEAX,DWORDPTRSS:ESPAROM路径所存放的位置FEDPUSHKofDIYEDrbFPUSHEAXFAFFECFCALLDWORDPTRDS:<MSVCRTfopen>msvcrtfopenFFCMPEAX,是否成功F^FBFFFFJNZKofDIYEB调回原来的代码FEBJMPSHORTKofDIYFDC不成功生成ROM文件上面FC处应该是POPAD的但是我手动跟踪(惨啊用笔记堆栈)发现不能加。我对堆栈不熟悉好像是下面调用的由便由编译器自己生成的”资源文件转存“代码那段程序自己恢复堆栈。FBEFMOVESI,KofDIYF用于保存路径FAAPUSH获取系统路径FCPUSHESIFDFFBCCALLDWORDPTRDS:<KERNELGetSystemDirectoryA>kernelGetSystemDirectoryAFBFPUSHKofDIYFBFPUSHESIFFFCALLDWORDPTRDS:<MSVCRTstrcat>msvcrtstrcatFFFPUSHKofDIYFFAPUSHESIFAFFCALLDWORDPTRDS:<MSVCRTstrcat>msvcrtstrcatFABDFPUSHKofDIYFDFBPUSHESIFBFFCALLDWORDPTRDS:<MSVCRTstrcat>msvcrtstrcatFBFPUSHKofDIYFromsFBCPUSHESIFBDFFCALLDWORDPTRDS:<MSVCRTstrcat>msvcrtstrcatFCBFMOVESP,DWORDPTRDS:FFCBFMOVEAX,KofDIYF生成路径为C:windowssystemromsFCEAMOVDWORDPTRSS:ESPA,EAXFD^EFFFFFFJMPKofDIYFC先看看路径下有没有ROM文件,如果有调用成功返回如果没有成功生成文件FDAADDBYTEPTRDS:EAX,ALFDCBFMOVECX,KofDIYFFEBAFMOVEDX,KofDIYF#(注意)FEBFMOVEAX,KofDIYFromsFEBPUSHADFECECCALLKofDIYFD调用ROM文件生成FFPOPAD堆栈平衡FF^EBCFJMPSHORTKofDIYFCROM文件生成后在修改路径调用fopen函数下面这个资源文件生成函数是我以前从”小凤居“(现在好像不能访问了)下载的一个键盘记录器(Delphi版)的函数库中拷贝回来的,修改跳转和函数地址为LordPE中添加的函数地址FDPUSHEBX资源生成函数FEPUSHESIFFPUSHEDIFPUSHEBPFCFADDESP,FBFMOVESI,ECXFDBXOREBX,EBXFPUSHEAXFPUSHEDXFABMOVEAX,KofDIYFFPUSHEAXFFFCCALLDWORDPTRDS:<KERNELFindResourceA>kernelFindResourceAFBFMOVEDI,EAXFFFTESTEDI,EDIFAFBBJEKofDIYFFBFPUSHEDIFBMOVEAX,KofDIYFPUSHEAXFFFCCALLDWORDPTRDS:<KERNELLoadResource>kernelLoadResourceFDBEMOVEBP,EAXFFEDTESTEBP,EBPFFAJEKofDIYFFBFPUSHEBPFFFCCCALLDWORDPTRDS:<KERNELLockResource>kernelSetHandleCountFEMOVDWORDPTRSS:ESP,EAXFCCMPDWORDPTRSS:ESP,FCJNZSHORTKofDIYFFPUSHEBPFAFFDCALLDWORDPTRDS:<KERNELFreeResource>kernelFreeResourceFEJMPKofDIYFFBFAPUSHFPUSHFCAPUSHFEAPUSHFAPUSHFPUSHFPUSHESIFFFDCALLDWORDPTRDS:<KERNELCreateFileA>kernelCreateFileAFEBFMOVESI,EAXFFEFFCMPESI,FJNZSHORTKofDIYFAFBCMOVEAX,EBPFECCALLKofDIYF原来的就是XOREAX,EAXFCPUSHEBPFDFFDCALLDWORDPTRDS:<KERNELFreeResource>kernelFreeResourceFAEBJMPSHORTKofDIYFFBFAPUSHEDIFABMOVEAX,KofDIYFABPUSHEAXFACFFCCALLDWORDPTRDS:<KERNELSizeofResource>kernelSizeofResourceFBBFMOVEDI,EAXFBAPUSHFBDLEAEAX,DWORDPTRSS:ESPFBAPUSHEAXFBBPUSHEDIFBCBMOVEAX,DWORDPTRSS:ESPFCPUSHEAXFCPUSHESIFCFFDCALLDWORDPTRDS:<KERNELWriteFile>kernelWriteFileFCBCCMPEDI,DWORDPTRSS:ESPFCBJESHORTKofDIYFDDFCDBCMOVEAX,EBPFCFECALLKofDIYF好像可以防止函数返回搞不清,将EAX清零FDPUSHEBPFDFFDCALLDWORDPTRDS:<KERNELFreeResource>kernelFreeResourceFDBEBEJMPSHORTKofDIYFFBFDDPUSHESIFDEFFDCCALLDWORDPTRDS:<KERNELSetEndOfFile>kernelSetEndOfFileFEPUSHESIFEFFECALLDWORDPTRDS:<KERNELCloseHandle>kernelCloseHandleFEBBCMOVEAX,EBPFEDECALLKofDIYFFFPUSHEBPFFFFDCALLDWORDPTRDS:<KERNELFreeResource>kernelFreeResourceFFBMOVBL,FFBBCMOVEAX,EBXFFDPOPECXFFEAPOPEDXFFFDPOPEBPFFPOPEDIFEPOPESIFBPOPEBXFCRETNFCXOREAX,EAXFACRETN上面这些代码我复制粘贴备份修改了N遍才让它没有问题我只能说我是菜鸟。令我感触颇深的就是调用LoadPE添加的函数我一直CALLD这样就是异常没有错啊不就是函数在LordPE中的地址加基址吗?后来才发现要加个括号CALL【D】才正确。我真是郁闷了好半天。(我这就是典型的浮沙上筑高台)。上面这些代码已经能够正确的生成ROM文件了并且在Windows系统目录下可以找到ROMS文件与原来的KOFZIP文件一摸一样。但是程序确还是不能正确运行游戏打不了。提示”pbin(dbad)未找到错误“我找到错误提示的地方进行跟踪。先使用原文件打开一个不存在的游戏进行跟踪发现程序在遍历过程序设置的文件路径后先是本身ROM查找如KOFZIP然后是NEOGEOZIP查找都不存在就报错。我现在的程序已经将所用的文件打开都改成C:WINDOWSSYSTEMROMS调用并且监视文件打开函数发现也能正确打开啊。那肯定是后续打开文件后进行的某些检测错误。于是我跟进:EABJESHORTKofDIYEAB这一大堆也不知道是什么比较EAB|CEFFORESI,FFFFFFFF反正要跳过这步,如果没调就GAMEOVEREABBCMOVEAX,DWORDPTRSS:ESPCEABBBCMOVECX,DWORDPTRSS:ESPEABFDLEAEDX,DWORDPTRDS:EAXECXEACBDACMPEBX,EDXEACJBSHORTKofDIYEACAEACFTESTESI,ESIESI中存放的是我们ROM的地址C:WindowsEACEBJMPSHORTKofDIYEAE这里没有跳转的话就返回错误一定要跳EACAPUSHEDIEACBECALL<JMPMSVCRTfclose>EADCADDESP,EADCXOREAX,EAXEADFPOPEDIEADEPOPESIEADBPOPEBXEADCADDESP,EADECRETNEAEBDMOVEDX,EBXEAEPUSHEAEBDSUBEDX,EAXEAEACMOVDWORDPTRSS:ESP,EDIEAEEBDSUBEDX,ECXEAFCCMOVDWORDPTRSS:ESPC,EBXEAFCMOVDWORDPTRSS:ESPC,EDXEAFCC>MOVDWORDPTRSS:ESPC,EBECALL<JMPMSVCRTmalloc>到这里应该对了分配内存举行文件读取将EAC改为JMP跳转运行程序OK了可以正常进行游戏了。剩下的就是一些后续工作了编辑资源添加头像太爽了有了这个单文件版本到哪都HAPPY不过这个还是比较猥琐只是使用了资源转存。现在回头看看如果将ROM编辑成一个段在将fopenfread函数全部重写只要返回值正确就OK了那样可以做到真正的单文件版本。(只是个人构思)希望各位大侠能够指点一下如何使用段模拟文件。现在大家可以使用这种方法制作自己喜欢游戏的单文件版本了。不足之处还望批评指正。

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

资料评分:

/12
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料