《3Days》(NEKOPACK)游戏资源格式分析.doc_第1页
《3Days》(NEKOPACK)游戏资源格式分析.doc_第2页
《3Days》(NEKOPACK)游戏资源格式分析.doc_第3页
《3Days》(NEKOPACK)游戏资源格式分析.doc_第4页
《3Days》(NEKOPACK)游戏资源格式分析.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【原创】3Days(NEKOPACK)游戏资源格式分析来源:/read.php?tid=10895837【文章标题】: 3Days(NEKOPACK)游戏资源格式分析 【文章作者】: Cradiator 【作者邮箱】: 【作者QQ号】: 39335705 【软件名称】: 3Days 【使用工具】: OllyDbg+WinHex - 【详细过程】 呵呵,我是一只破解小菜,喜欢GalGame,这里希望认识一些志同道合的朋友。 最近看到了一款GalGame3Days。口味很 嗯有爱的人搜索一下就知道是什么了。对GalGame不感冒的人还是只看原理别看游戏了:) 好现在进入正题。 用WinHex打开一个游戏资源文件,这里我用的是image.dat。 Offset01234567 89ABCDEF 00000000 4E 45 4B 4F 50 41 43 4BCB 00 00 00 00 00 00 00 NEKOPACK?. 00000010 A5 04 00 00 00 0D C9 8A7F 56 59 C8 C1 CE DD 7B ?.蓨VY攘屋 00000020 C4 FD 13 12 8B 00 00 E202 00 00 00 0D 9E 8C CA 凝.?.?.瀸? 00000030 96 B5 B5 BF 5E 75 01 D7B3 4C F4 8D 00 00 09 09 柕悼u.壮L魨. 除了一个比较明显的文件头NEKOPACK以外貌似没有有效信息。 用OD载入游戏在CreateFileA上下断点。发现程序载入image.dat后,继续跟踪看到如下东东。 00402BDE|.50PUSH EAX ; /Arg3 00402BDF|.52PUSH EDX ; |Arg2 00402BE0|.51PUSH ECX ; |Arg1 00402BE1|.E8 E2A40600 CALL ;跟踪后发现这个函数将arg3个字节读入arg2 00402BE6|.83C4 0C ADD ESP,0C 00402BE9|.84C0TEST AL,AL 00402BEB|.75 1F JNZ SHORT 3days.00402C0C 00402BED|.33C0XOR EAX,EAX 00402BEF|.50PUSH EAX 00402BF0|.FF4B 1C DEC DWORD PTR DS:EBX+1C 00402BF3|.8D55 FC LEA EDX,DWORD PTR SS:EBP-4 00402BF6|.52PUSH EDX 00402BF7|.E8 58A40600 CALL 3days.0046D054 00402BFC|.59POP ECX 00402BFD|.58POP EAX 00402BFE|.8B13MOV EDX,DWORD PTR DS:EBX 00402C00|.64:8915 00000MOV DWORD PTR FS:0,EDX 00402C07|.E9 A20F0000 JMP 3days.00403BAE 00402C0C|6A 08 PUSH 8 ; /Arg3 = 00000008 00402C0E|.68 77884A00 PUSH 3days.004A8877; |Arg2 = 004A8877 ASCII NEKOPACK 00402C13|.8D8D E0FEFFFF LEA ECX,DWORD PTR SS:EBP-120 ; | 00402C19|.51PUSH ECX ; |Arg1 00402C1A|.E8 7D700900 CALL 3days.00499C9C; 3days.00499C9C 00402C1F|.83C4 0C ADD ESP,0C 00402C22|.85C0TEST EAX,EAX 00402C24|.74 1F JE SHORT 3days.00402C45 00402C26|.33C0XOR EAX,EAX 00402C28|.50PUSH EAX 00402C29|.FF4B 1C DEC DWORD PTR DS:EBX+1C 00402C2C|.8D55 FC LEA EDX,DWORD PTR SS:EBP-4 00402C2F|.52PUSH EDX 00402C30|.E8 1FA40600 CALL 3days.0046D054 00402C35|.59POP ECX 00402C36|.58POP EAX 00402C37|.8B13MOV EDX,DWORD PTR DS:EBX 00402C39|.64:8915 00000MOV DWORD PTR FS:0,EDX 00402C40|.E9 690F0000 JMP 3days.00403BAE 00402C45|33C9XOR ECX,ECX 00402C47|.8D95 D8FEFFFF LEA EDX,DWORD PTR SS:EBP-128 00402C4D|.898D D8FEFFFF MOV DWORD PTR SS:EBP-128,ECX 00402C53|.8D4D FC LEA ECX,DWORD PTR SS:EBP-4 00402C56|.C785 D4FEFFFFMOV DWORD PTR SS:EBP-12C,4 00402C60|.8B85 D4FEFFFF MOV EAX,DWORD PTR SS:EBP-12C 00402C66|.50PUSH EAX ; /Arg3 00402C67|.52PUSH EDX ; |Arg2 00402C68|.51PUSH ECX ; |Arg1 00402C69|.E8 5AA40600 CALL ; 3days.0046D0C8 00402C6E|.83C4 0C ADD ESP,0C 00402C71|.84C0TEST AL,AL 这里实在判断文件头是否正确。分析后了解文件的前16字节均为文件头。 到现在为止还没什么有用信息。 继续跟踪咱看见它又读了4字节,并存到了EBP-128里,这个值现在还用不到。 00402D0E| 33C9XOR ECX,ECX 00402D10|.898D C8FEFFFF MOV DWORD PTR SS:EBP-138,ECX 00402D16|.BE 04000000 MOV ESI,4 00402D1B|.56PUSH ESI ; /Arg3 = 00000004 00402D1C|.8D85 C8FEFFFF LEA EAX,DWORD PTR SS:EBP-138 ; | 00402D22|.50PUSH EAX ; |Arg2 00402D23|.8D55 FC LEA EDX,DWORD PTR SS:EBP-4 ; | 00402D26|.52PUSH EDX ; |Arg1 00402D27|.E8 9CA30600 CALL ; 3days.0046D0C8 然后来到这里,这是个很重要的函数。在这个函数里程序对解密时需要用到的数据进行了初始化。 00402D52| 68 99990000 PUSH 9999; /Arg2 = 00009999这个9999万分可疑 00402D57|.8D8D 64F3FFFF LEA ECX,DWORD PTR SS:EBP-C9C ; | 00402D5D|.51PUSH ECX ; |Arg1 00402D5E|.E8 0D760500 CALL ; 3days.0045A370 跟入这个函数 0045A370 /$55PUSH EBP 0045A371|.8BECMOV EBP,ESP 0045A373|.53PUSH EBX 0045A374|.8B45 0C MOV EAX,DWORD PTR SS:EBP+C ;EAX=EBP+C=9999 0045A377|.8B5D 08 MOV EBX,DWORD PTR SS:EBP+8 ;EBX=EBP+8一个地址 0045A37A|.33C9XOR ECX,ECX;ecx = 0 0045A37C|.8BD3MOV EDX,EBX;EDX = EBX 0045A37E|69C0 CD0D0100 IMUL EAX,EAX,10DCD ;eax = eax*10DCD循环0-269 0045A384|.83E0 FF AND EAX,FFFFFFFF 0045A387|.8902MOV DWORD PTR DS:EDX,EAX ;edx = eax 0045A389|.41INC ECX;ecx+ 0045A38A|.83C2 04 ADD EDX,4;edx += 4 0045A38D|.81F9 70020000 CMP ECX,270 0045A393|. 7C E9 JL SHORT 3days.0045A37E;这里的算法是 第二参数*10DCD 存入第一参数DWORD 0045A395|.33C0XOR EAX,EAX 0045A397|.8983 C0090000 MOV DWORD PTR DS:EBX+9C0,EAX ;用0封口 0045A39D|.5BPOP EBX 0045A39E|.5DPOP EBP 0045A39F.C3RETN 这个函数用arg2,也就是0x9999初始化了arg1那个参数所指的数组。具体算法如下 for( i = 0; i 0FB6B5 C2FEFF|MOVZX ESI,BYTE PTR SS:EBP-13E 00402E3B|.56|PUSH ESI; /Arg3EBP-13E 00402E3C|.8D85 60F2FFFF |LEA EAX,DWORD PTR SS:EBP-DA0; | 00402E42|.50|PUSH EAX; |Arg2 00402E43|.8D55 FC |LEA EDX,DWORD PTR SS:EBP-4; | 00402E46|.52|PUSH EDX; |Arg1 00402E47|.E8 7CA20600 |CALL ; 3days.0046D0C8 读入了EBP-13E个数据到EBP-DA0。 继续往下来到这个函数。发现函数的参数为刚才计算的解密数组,刚读取的数据和数据长度。 应该这个就是解密的东东了 00402E72| 8D8D 64F3FFFF |LEA ECX,DWORD PTR SS:EBP-C9C;ecx 是那个变换过的数组 00402E78|.51|PUSH ECX; /Arg3 00402E79|.33C0|XOR EAX,EAX ; | 00402E7B|.8A85 C2FEFFFF |MOV AL,BYTE PTR SS:EBP-13E; |al 为刚才读出的长度 00402E81|.50|PUSH EAX; |Arg2 00402E82|.8D95 60F2FFFF |LEA EDX,DWORD PTR SS:EBP-DA0; |edx 为刚才读出的数组 00402E88|.52|PUSH EDX; |Arg1 00402E89|.E8 86FCFFFF |CALL ; 3days.00402B14 跟进去看看算法。 00402B14 /$55PUSH EBP 00402B15|.8BECMOV EBP,ESP 00402B17|.53PUSH EBX 00402B18|.56PUSH ESI 00402B19|.57PUSH EDI 00402B1A|.8B7D 08 MOV EDI,DWORD PTR SS:EBP+8 ;edi = 从文件读出的数组 00402B1D|.33DBXOR EBX,EBX;ebx = 0 00402B1F|.8BF7MOV ESI,EDI;esi = edi 00402B21|.3B5D 0C CMP EBX,DWORD PTR SS:EBP+C 00402B24|.73 1A JNB SHORT 3days.00402B40 ;循环 长度(arg2) 次ebx计数 00402B26|8BC3/MOV EAX,EBX ;eax = ebx 00402B28|.03C7|ADD EAX,EDI ;eax += edi (eax是数组当前指针) 00402B2A|.50|PUSH EAX; /Arg2 00402B2B|.8B55 10 |MOV EDX,DWORD PTR SS:EBP+10 ; |edx 为变换的数组 00402B2E|.52|PUSH EDX; |Arg1 00402B2F|.E8 6C780500 |CALL ;这个函数很诡异 00402B34|.83C4 08 |ADD ESP,8 00402B37|.8806|MOV BYTE PTR DS:ESI,AL 00402B39|.43|INC EBX 00402B3A|.46|INC ESI 00402B3B|.3B5D 0C |CMP EBX,DWORD PTR SS:EBP+C 00402B3E|. 72 E6 JB SHORT 3days.00402B26 00402B40|5FPOP EDI 00402B41|.5EPOP ESI 00402B42|.5BPOP EBX 00402B43|.5DPOP EBP 00402B44.C3RETN 这里的意思是将数据和上面计算出来的那个解密用的数组传入 00402B2F|.E8 6C780500 |CALL 这个函数,然后将返回值再存入数组。 这个函数跟进去以后是一个非常没有爱的计算。 0045A3A4|.8B5D 08 MOV EBX,DWORD PTR SS:EBP+8 ;ebx = 变换的数组 0045A3A7|.81BB C0090000CMP DWORD PTR DS:EBX+9C0,270 ;EBX+9C0为变换数组结尾,应该小于270 0045A3B1|.72 10 JB SHORT 3days.0045A3C3 0045A3B3|.8B83 BC090000 MOV EAX,DWORD PTR DS:EBX+9BC 0045A3B9|.50PUSH EAX ; /Arg2 0045A3BA|.53PUSH EBX ; |Arg1 0045A3BB|.E8 B0FFFFFF CALL ; 3days.0045A370 0045A3C0|.83C4 08 ADD ESP,8 0045A3C3|8B93 C0090000 MOV EDX,DWORD PTR DS:EBX+9C0 ;edx = 变换数组结尾 0045A3C9|.FF83 C0090000 INC DWORD PTR DS:EBX+9C0 ;变换数组结尾+1 0045A3CF|.8B0493MOV EAX,DWORD PTR DS:EBX+EDX*4 0045A3D2|.8BD0MOV EDX,EAX;eax = edx = 变换数组中低i个元素(i记录在数组末尾) 0045A3D4|.C1EA 0B SHR EDX,0B ;edx 0B 0045A3D7|.33C2XOR EAX,EDX;eax = edx 0045A3D9|.8BC8MOV ECX,EAX;ecx = eax 0045A3DB|.C1E1 07 SHL ECX,7;ecx 7 0045A3DE|.81E1 638A5131 AND ECX,31518A63 ;ecx &= 31518A63 0045A3E4|.33C1XOR EAX,ECX;eax = ecx 0045A3E6|.8BD0MOV EDX,EAX;edx = eax 0045A3E8|.C1E2 0F SHL EDX,0F ;edx 12 0045A3FB|.33C1XOR EAX,ECX;eax = ecx 0045A3FD|.24 FF AND AL,0FF 0045A3FF|.3202XOR AL,BYTE PTR DS:EDX ;al = 数组元素 这个算法没什么难度,但是很繁琐,就不一一解释了。 数据解密后终于发现可以阅读的字符串了“maptitle.map”,这个因该就是传说中的索引了。 之后的代码就很简单了,程序又存储了8个字节,但没有用到,应该是索引中的地址等信息了。 继续向下走后是一个很长的跳转,跳转前对EBP-138这个位置进行比较,可见这里面存的是资源数量。 用刚刚跟踪出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论