_(:з」∠)_其实好久之前就把VM的代码全都拆出来了、没去写解析、这两天把MalieSystem的VM解析写出来了。上图是diasm的结果……第一次写diasm、可能还是有很多不完善的地方、嘛、慢慢的就会成长了吧。
晚上闲来无事拿出了AQUA准备练练手……很喜欢的一个游戏、跟坑主联系过很多次、坑主今年刚高中毕业╮( ̄▽ ̄”)╭ 也只能再等一阵子了。
然后、AQUA这货有文件效验,网上基本没有关于Krkr效验的详细处理教程、这里贴出我的处理笔记、
每个文件有类似于AQUA.exe.sig这样的sig效验文件。处理方法是补丁AQUA.tpm也就是krkr叫做self module的东西。
第一次玩krkr引擎、大家见笑了……
下面是笔记
首先发现AQUA.tpm有一层smc、
首先定位到这里
1 |
1E00D80A . 68 6C25031E push 1E03256C ; ASCII "void ::TVPSetXP3ArchiveExtractionFilter(tTVPXP3ArchiveExtractionFilter)" |
然后往下看
1 |
1E00D832 . E8 39010000 call 1E00D970 |
这行是调用解码call对第一个.decc区段进行smc解码、为了自己以后分析算法方便然后就把这个地方处理以后日掉了、然后处理好以后的tpm就可以直接调试了、tpm实际就是个dll。这样调试起来就方便多了。
第二步、往下翻了翻、看到了Sorahane程序员的各种卖萌、看样子是模块内存效验和文件效验、不和谐的东西全都日掉就可以了。
然后将处理好的tpm保存运行、bug了、提示sig无效。
第三步、搜索所有tpm里关于sig验证错误提示的字符串、然后全部下断点、运行以后发现程序断在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1E00D272 . 51 push ecx 1E00D273 . E8 0881FFFF call 1E005380 ;获取Public Key 1E00D278 . 8D9424 980000>lea edx, dword ptr [esp+0x98] 1E00D27F . 50 push eax 1E00D280 . 52 push edx 1E00D281 E8 8A2C0000 call 1E00FF10 ;效验 1E00D286 . 83C4 0C add esp, 0xC 1E00D289 84C0 test al, al 1E00D28B . 75 26 jnz short 1E00D2B3 1E00D28D . A1 1C78031E mov eax, dword ptr [0x1E03781C] 1E00D292 . 85C0 test eax, eax 1E00D294 . 75 12 jnz short 1E00D2A8 1E00D296 . 68 DC70021E push 1E0270DC ; ASCII "void ::TVPThrowExceptionMessage(const tjs_char *)" 1E00D29B . E8 703E0000 call 1E011110 1E00D2A0 . 83C4 04 add esp, 0x4 1E00D2A3 . A3 1C78031E mov dword ptr [0x1E03781C], eax 1E00D2A8 > 68 BC1A031E push 1E031ABC ; UNICODE "Authentication failed : Invalid signature token or unrecognized self module." |
这里我不想跟这个破算法废话、又是RSA又是SHA256的、看着就够蛋疼了、和谐之。其实只要让效验call返回1就可以了、注意脚本里还会对效验函数进行调用、所以直接跟到效验函数里处理掉就ok。
保存运行、提示Cannot continue execution……继续在tpm里搜索字符串,发现判断了一个dword值、直接跳过即可。
再次保存、直接运行……成功……至此Krkr的文件效验已经倒下……分析封包算法是需要耐心慢慢来的~有空的话我会继续戳这个游戏玩的……
更新记录
v0.4 重写dzi处理算法、解决一切漏图问题。感谢黄金止手。
v0.3 修正合成算法错误、感谢MisuzuKurenai指出错误【2013年7月1日】
v0.2 修正合成算法错误、多线程合成图像,增加合成进度显示
v0.1 最初版本
Light's malie system dzi image file combiner.
Usage: libpngMerge.exe <source directory>
Azure[LCG/kDays]
Wed Apr 24 21:29:55 2013
可以当CG合成程序用、不知道其他的Light社CG合成程序效率怎么样、听说有人写过Java版的,可惜我没找到公开版本,然后就自己写了个。_(:з」∠)_汉化完了以后还得写图片拆分程序压力山大啊
最后把这个程序送给大家吧_(:з」∠)_放图不放种什么的、诶嘿嘿
假期贡献了一天给这货、对脚本解析部分的逆向。熟悉了C++的逆向,因为目标是VC6编译的所以很大程度上也降低了逆向难度,不过C++的虚表还是够蛋疼的。也顺带熟悉了GalGame游戏引擎设计的一个思路。
写出了脚本导出程序。不是很难。用asmodean的解包器可以解到exec.dat,exec.dat的结构需要自己搞。varList那个地方着实头疼了下。不过还好跟着程序一点一点走下来了以后觉得思路还是挺清晰的。
写了一份分析报告。只不过比较乱,再加上程序有点赶工了,代码渣的可以,以后整理好了大概会放出来。
还有就是学习下这种汉化导出的格式、果然这样以后校对起来很方便啊。_(:з」∠)_我们还可以更加专业不是么。
卖萌留念
以上
Have a nice day=w=
Azure[LCG/kDays]
2013.4.6
作为、今天这个节日的礼物、送给大家……这就是我对GalGame的爱了……
首先感谢这位前辈写的文章
[原创]破解日志 galgame引擎YU-RIS
以及AmaranthF大的帮助。
参考这位前辈的文章完成了对游戏引擎本体的汉化。这位前辈的文章还提供了脚本导出程序,但是没有脚本回写程序。
其实看到这篇文章里的结构也可以YY出直接把回写的脚本添加到脚本资源段(字符区)后面的地方然后修改参数区的偏移就好了。但是我想做的更完美些、于是解析了脚本里所有带参数的指令的作用、其实说是解析、也就是蒙的。
这就是将字符串添加到资源区后的我写的第一个版本的脚本回写程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
void ys_script_import_string(char* filename) { wstring newfn; if (GBK2UNI(filename, strlen(filename), newfn) == false) return; newfn += L".txt"; FILE* pTxtFile = _wfopen( newfn.c_str(), L"rb"); fseek(pTxtFile,2,SEEK_SET); if (pTxtFile == NULL) return; string strTable; WCHAR buf[2048]=L""; vector<int> LengthTable; while (fgetws(buf,2048,pTxtFile)) { string strGBK; DWORD dwOffset=0,len; WCHAR strUNICODE[2048]=L""; swscanf(buf,L"0x%08X, %3d, %s\r\n",&dwOffset,&len,&strUNICODE); if (UNI2GBK(strUNICODE,wcslen(strUNICODE),strGBK)) { LengthTable.push_back(strGBK.size()); strTable+=strGBK; } } fclose(pTxtFile); FILE *fp; fp = fopen(filename,"rb"); if (fp == NULL) { printf("cannot open infile\n"); return ; } fseek(fp, 0, SEEK_END); int len = ftell(fp); fseek(fp, 0, SEEK_SET); char* filebuf = new char[len+1]; fread(filebuf, sizeof(char), len, fp); fclose(fp); ystb_decode((ystb_header_t *)filebuf,0,0,0); ystb473_header_t headerX; char* curP = filebuf; memcpy(&headerX, curP, sizeof(ystb473_header_t)); curP += sizeof(ystb473_header_t); ystb473_method_t* pMethods = (ystb473_method_t*)curP; ystb473_parameter_t* pParameters = (ystb473_parameter_t*)(curP + headerX.data1_length); char* pStrings = curP + headerX.data1_length + headerX.data2_length; int nCurArgIndex = 0; int offset=headerX.data3_length,stringCnt=0; for (int i = 0; i < headerX.data1_length_div_4; ++i) { if (pMethods[i].args) { if (pMethods[i].code==0x5A) { pParameters[nCurArgIndex].charOffset=offset; pParameters[nCurArgIndex].charCount=LengthTable[stringCnt]; offset+=LengthTable[stringCnt]; stringCnt++; } nCurArgIndex += pMethods[i].args; } } char *pBuffer=new char[len+strTable.size()]; char *pp=pBuffer+sizeof(ystb473_header_t); memcpy(pp,pMethods,headerX.data1_length+headerX.data2_length+headerX.data3_length); pp+=(headerX.data1_length+headerX.data2_length+headerX.data3_length); memcpy(pp,strTable.c_str(),strTable.size()); pp+=strTable.size(); memcpy(pp,pStrings+headerX.data3_length,headerX.data4_length); headerX.data3_length=strTable.size(); memcpy(pBuffer,&headerX,sizeof(ystb473_header_t)); ystb_decode((ystb_header_t *)pBuffer,0,0,0); fp=fopen(filename,"wb"); fwrite(pBuffer,len+strTable.size(),1,fp); fclose(fp); delete pBuffer; } |
还没到那么智能、只不过是导出成txt和把txt内容导进来、资源区重建写了好久……因为是第一次分析虚拟机类引擎,也没啥思路,虚拟机指令全都靠看运行结果蒙的Orz,哎、看来技术还差得远。
现在脚本处理程序还有点毛病、单文件导入已经没问题了,但是多文件导入的时候还是会Bug、原因探索中、不过我估计是哪个地方内存泄露了……这也是我第一次用STL的东西写这类的程序。
嘛、明早再说啦~明天iOS6的越狱也出了吧……=w=嗯、于是、就这样、大家晚安~
请移步http://azure.kdays.cn/onekeyunlock下载更新
AlphaROMdiE.exe
CRC32: CE7C88D7
MD5: 5B25DB9BCBD67BCD334D6BB8116003D2
SHA-1: D7564CAEDE8AF4BF1B9ADE7F98B63FAB6552900E
Build20130125更新内容
更新核心破解函数用来适应新版AlphaROM加密
解决快捷方式无法创建或者执行异常的情况
于是、AlphaROM又一次失败了、=w=感谢大家的支持、欢迎大家投稿AlphaROMdiE无法破解的由AlphaROM保护的游戏
既然有人提供了那么多样本、然后今天正好比较闲,顺手就改了下程序……增强兼容性吧,这次应该可以处理大部分了。
在这里特别感谢benson778 指出程序错误、并且感谢sos2045 提供的游戏引擎样本。
下载:cs2_keypatch
这次代码从海风月影的HookLib扒了一个计算代码长度的东西出来……但是这玩意有时候也不好使啊、比如对于一些比较变态的mmx指令的支持、也许会计算出负的指令长度啥的……嘛、不过一般来说够用了……因为我需要补丁的部分只是最基本的指令。
源代码
Read the rest of this entry »
= =RT、解决下cs2引擎无法制作硬盘版的问题(还有就是重装以后会囧掉)……直接把待破解程序拖到我的图标上即可、弹出Patch Success!即可进行游戏……这样就不会出现Boot Error的问题了……
完全无技术含量……果然我算法渣到家啊……打算看看Key用的什么算法的、可是看到一大坨我就蛋碎了……然后就写了个Patcher完事~