Archive for the 'anime&manga' Category

今日のみなみけ(南家餐桌)资源吸出和游戏系统研究

这是一个即没有H也没有恋爱的同人游戏(官方介绍), 里面的每一个角色都是攻略不能的, 主题上还是属于收集系的游戏, 游戏以假期的一个月为一轮, 通关后追加若干菜单, 可以不按预定菜色做饭, 当然要确保当天负责做饭的三姐妹之一不会把饭做糊掉.
以上介绍完毕, 直奔主题, 这个游戏我觉得比较厚道的因素, 就是语音了, 虽然不是全程的, 可是在非ecchi游戏中, 特别是同人, 有语音的可谓少之又少鸟.
基本上都是一些事件对话和日常对话, 例如早上遇到今天第一次见面的人, 她们会和玩家互相问候, 有慢悠悠的敦子的慢悠悠欧哈由, 也有知晓秘密的内田的yahoo, 当然也有男生的阿斯, 也有真希中气十足的早上好.
诶, 说起来令人印象深刻的还有那个脑袋被地铁加过的保坂怪哥哥的热情的歌曲, 令我想起了酒剑仙那首有语音的诗…
也不由得想起当时反编译仙剑3的剧情脚本, 试验发现可以给对话同时加上语音后的寂寞感…
让夏娜姐姐给龙葵妹妹配音应该会让龙葵娇羞有坚强的性格更加印象深刻吧~~
扯远了, 占位更新图像资源的压缩存储格式.
这款游戏的安装目录的image文件夹下有大量的fzl文件, 开OD跟踪, 发现程序会先试图在image目录搜索同名的*.png文件, 搜索不到时候, 就改为打开*.fzl文件.
于是就找了一个logo_0.fzl来分析, 拿压缩工具一压, 没有压缩率, 应该是加密或者压缩后的格式.
先看文件大小是24712, 也即#$6088, 然后在$8处看到了一个#$6048, 又在$40处看到数据的开始, 而前面是#$20个pending的00. 那么$8这里应该是存储压缩后数据的大小, 而文件头的大小是#$40. 观察前#$40字节, 没有发现#$40的数据, 所以文件头的大小应该是固定的.
根据经验, 存储压缩数据大小的前后很可能就是压缩前数据的大小, 以便申请适当的buffer, 那么$4处的01肯定不是, 而$C处的#$40000则非常可疑.
继续向下看, $10开始是$#20,1,#$100,#$100, 自然前面两个是长宽的可能没了, 而#$100*#$100 * sizeof(tagRGBA) = #$40000, 应该是一个256*256的图片, 压缩前的格式是4字节一像素的数据流.
因为前面要打开png文件, 所以怀疑这里跟png有什么关联, 用KANAL看了看, 主程序用到的算法有ADLER32, CRC32, ZLib deflate, 那前面2个都是hash算法没法用来作数据压缩, 看来应该只有zlib一种选择了, 为了防止程序用自己的压缩方式来压缩, 跟踪了logo_1.fzl的数据读取, $40处的数据是在第四次读取fzl文件时候取出的,

00564F5B  |.  6A 00                    PUSH 0                                   ; /pOverlapped = NULL
00564F5D  |.  50                       PUSH EAX                                 ; |pBytesRead
00564F5E  |.  8B03                     MOV EAX, DWORD PTR [EBX]                 ; |
00564F60  |.  FF75 10                  PUSH DWORD PTR [EBP+10]                  ; |BytesToRead
00564F63  |.  51                       PUSH ECX                                 ; |Buffer
00564F64  |.  FF3430                   PUSH DWORD PTR [EAX+ESI]                 ; |hFile
00564F67  |.  FF15 80405700            CALL NEAR DWORD PTR [<&KERNEL32.ReadFile>; \ReadFile

数据读出后, 在buffer处下内存访问断点, 断在一个三层循环处, 操作是读取

00545071  |. /E9 6B1E0000              |JMP 00546EE1
00545076  |> |837D EC 10               |/CMP DWORD PTR [EBP-14], 10
0054507A  |. |73 42                    ||JNB SHORT 005450BE
0054507C  |> |837D D4 00               ||/CMP DWORD PTR [EBP-2C], 0
00545080  |. |75 05                    |||JNZ SHORT 00545087
00545082  |. |E9 5F1E0000              |||JMP 00546EE6
00545087  |> |8B4D D4                  |||MOV ECX, DWORD PTR [EBP-2C]
0054508A  |. |83E9 01                  |||SUB ECX, 1
0054508D  |. |894D D4                  |||MOV DWORD PTR [EBP-2C], ECX
00545090  |. |8B55 C4                  |||MOV EDX, DWORD PTR [EBP-3C]
00545093  |. |33C0                     |||XOR EAX, EAX
00545095  |. |8A02                     |||MOV AL, BYTE PTR [EDX]

是一个结构漫长的函数, 向下翻动几页, 在同一个过程中发现invalid store blocks lengths和invalid code lengths set等信息, 那么这里可以确定读取fzl文件压缩数据的这段代码简直就是zlib的内层解压函数, 我就操出俺的zlibUI工具, 把logo_0.fzl的前面#$40字节减掉, 只留下#$40000, 拿去解了, 解出来的大小刚好是#$40000. 接下来, 不知道具体的原始数据的像素存储顺序前, 俺把解出来的文件名称改为logo_0.raw, 拿去xnview一看, 是混乱的重叠图像, kyouno三个字勉强可以看出十几个, 那么肯定不是RGBA了, 先不管这个, 接下来我就开始写XnView的插件, 用来查看fzl格式图片, 具体的像素排列就一边写一边分析了, 当然历经若干混乱的代码, 错位的, 黑白的, 有彩的, 色彩诡异的图像后, 终于完美解出了带透明的数据. 其中问题的解决还是无奈仔细手写了一个阵列然后手工排了一下可能的分布, 一举解出色彩诡异的形状正确图像后, 换了一下RGBA到BGRA就成功了.

这时候才忽然发现image目录下面除了fzl居然还有fzm文件, 给fzm文件增加解析花的时间比fzl更长, 虽然心里面大概有谱, 不过因为有谱导致的粗心, 写错鸟结构的长度, 发现bug后觉得这种依靠头脑清醒来保证代码正确不是办法, 就重新排查一遍加上重构了大部分硬性判断的代码, 改为载入文件时识别出像素和色深模式进行固定, 这下解析单行的代码看起来就工整了许多.

fzm呢, 基本上对等与8位的PNG, 所不同于大多PNG的是他在调色板使用了alpha透明, 对于alpha通道调色板的PNG, Fireworks支持, Iconworkshop支持, Xnview不透明, InfraView会进行合并.

继续补完这篇文章已经是一个月后的12月了, 不知为什么这个月过得格外的漫长, 或许是没有什么加班的缘故, 也或许是韬光养病的错觉, 感觉做了不少有意义和没意义的事情, 当然动画的minamike里也陆续出现了很多角色, 虽然原作中的角色还没有出全, 但是主要的几个配角, 例如成为这个游戏主线的女装版マコちゃん(眞子), 还有使得マコト无法正体复原的冬马, 当然还有令人呕心的保阪和同样具有幻想症状的アツコ(敦子), 说起アツコ呢还是觉得这个游戏里面的アツコ比较有漫画的风味, 或许是先入为主吧或许是声优表现出色, 感觉跟游戏里面的形象很切合, 软软的慢腾腾的傻傻的弱气娘啊. 而总是背着手笑的吉野的打招呼声音那是格外的清脆啊, 一看就是个好人, 可以入手大量的野菜种子, 果然是好人啊.


先写下要晚上要写的地方, 以免忘了

1. 乐呵呵的吉野的配音

2. NPC的有得没得的剧情

3. 梦幻合宿

4. 画面可动的诡异电视

5. 自己偷偷攒招待券的实久留店员

6. 家庭会议

7. 饭后甜点

8. 大叔C的厚道音乐

(14)

山百合封库文件加密方式和archive格式

会以570, 两次均读入4字节到CC和D0.(01和0F)
然后每次读取3FC (0F*44), 并且开始解密.

00437C99  |.  50                       PUSH EAX
00437C9A  |.  8B45 00                  MOV EAX,DWORD PTR SS:[EBP]
00437C9D  |.  50                       PUSH EAX
00437C9E  |.  E8 3D040000              CALL LilianFo.004380E0
00437CA3  |.  8B06                     MOV EAX,DWORD PTR DS:[ESI]  EAX=0F
00437CA5  |.  83C4 0C                  ADD ESP,0C
00437CA8  |.  33D2                     XOR EDX,EDX    EDX = 0
00437CAA  |.  85C0                     TEST EAX,EAX    0F dec?
00437CAC  |.  7E 64                    JLE SHORT LilianFo.00437D12
00437CAE  |.  33FF                     XOR EDI,EDI    EDI = 0
I := 0;
00437CB0  |>  33C9                     /XOR ECX,ECX    ECX = 0
do begin
00437CB2  |>  8BB5 18010000            |/MOV ESI,DWORD PTR SS:[EBP+118]  do ESI = SourceAddr
00437CB8  |.  8BC7                     ||MOV EAX,EDI    EAX = EDI
00437CBA  |.  03C6                     ||ADD EAX,ESI    INC(EAX, ESI)
00437CBC  |.  B3 03                    ||MOV BL,3     EBX = 3
00437CBE  |.  8D3408                   ||LEA ESI,DWORD PTR DS:[EAX+ECX] ESI = 0 + I (Current)
00437CC1  |.  8AC2                     ||MOV AL,DL    AL = DL  (0, y)
00437CC3  |.  F6E9                     ||IMUL CL     AX = AL*CL (0,i*y)
00437CC5  |.  F6EB                     ||IMUL BL     AX = AL*3 (0,3*i*y)
00437CC7  |.  8A1E                     ||MOV BL,BYTE PTR DS:[ESI] BL = Buffer[ipos];
00437CC9  |.  04 3D                    ||ADD AL,3D    INC (AL, 3D) (3D,3D+3*i*y)
00437CCB  |.  32D8                     ||XOR BL,AL    BL = BL XOR AL
00437CCD  |.  41                       ||INC ECX     INC (I)
00437CCE  |.  83F9 3B                  ||CMP ECX,3B    CMP I, 3B
00437CD1  |.  881E                     ||MOV BYTE PTR DS:[ESI],BL Buffer[ipos] = BL
00437CD3  |.^ 7C DD                    |\JL SHORT LilianFo.00437CB2 while I < 3B
end while I <= 3B
00437CD5  |.  8B8D 18010000            |MOV ECX,DWORD PTR SS:[EBP+118]  ECX = SourceAddr
00437CDB  |.  8B7424 10                |MOV ESI,DWORD PTR SS:[ESP+10]  ESI = [ESP+10]
00437CDF  |.  8B5C0F 40                |MOV EBX,DWORD PTR DS:[EDI+ECX+40] EBX = (SoruceAddr + 40)^
00437CE3  |.  8D440F 40                |LEA EAX,DWORD PTR DS:[EDI+ECX+40]  EAX = SourceAddr + 40
00437CE7  |.  81F3 AC59DFE3            |XOR EBX,E3DF59AC      EBX = EBX xor E3DF59AC
00437CED  |.  8918                     |MOV DWORD PTR DS:[EAX],EBX   (SoruceAddr + 40)^ = EBX
00437CEF  |.  8B85 18010000            |MOV EAX,DWORD PTR SS:[EBP+118]  EAX = SourceAddr
00437CF5  |.  8B4407 40                |MOV EAX,DWORD PTR DS:[EDI+EAX+40] EAX = (SoruceAddr + 40)^
00437CF9  |.  03F0                     |ADD ESI,EAX       ESI = ESI + EAX
00437CFB  |.  85C0                     |TEST EAX,EAX       IF EAX != 0
00437CFD  |.  897424 10                |MOV DWORD PTR SS:[ESP+10],ESI   [ESP+10] = ESI
00437D01  |.^ 0F84 CFFEFFFF            |JE LilianFo.00437BD6     ENDO?
00437D07  |.  8B45 10                  |MOV EAX,DWORD PTR SS:[EBP+10]  EAX = [EBP+10] (0F)
00437D0A  |.  42                       |INC EDX        INC(EDX)
00437D0B  |.  83C7 44                  |ADD EDI,44       EDI = EDI + 44
00437D0E  |.  3BD0                     |CMP EDX,EAX       CMP EDX, EAX
00437D10  |.^ 7C 9E                    \JL SHORT LilianFo.00437CB0
00437D12  |>  8B4D 00                  MOV ECX,DWORD PTR SS:[EBP]

加密方式应该是分为44字节一块, 其中0~3A个字节是使用动态xor, 然后3B~3F五个字节不加密, 40~43四个字节固定使用E3,DF,59,AC来xor.
动态xor的字节值是3*i*y+3D, 其中i为0~3A时候递增的循环内变量, 而y为按照每次44递增的上层循环变量.(0~F)

山百合是某人推荐给我的游戏, 因为总是挂, 没有精力去一次次通, 遂于当晚制作了99命的hack版, 然后第二天发现有隐藏组合, 是红玫瑰里面攻击力很弱的妹妹作为姐姐到手了一个很强的小小妹妹, 为啥米妹妹这么强因为其实这个被强推的是第一关最后面的BOSS, 哦也. 组合出现条件是完整的使用红白黄三对姊妹各穿关一次.

然后, 使用隐藏角色再次穿关, 在标题画面将出现special菜单, 可以进行无穷战, 限时战, 限分战, 千人讨四种训练场景, 和选择和各大小boss的对决战.

音乐很不错听, 为了rip下来, 决定按照国际惯例解之, 于是有上文.

很困了, VMBR和VFAT的分析需要先按照目前的分析将外层解掉, 过几天有空在作.

然后过了一天, 加班到两点, 脑子剧痛睡不着叫, 打开OD在读写文件调试了很久, 无果, 发现跟头部的读取不一样, 是CreateFileMapping后MapViewOfFile, 但是看着数据没有MPG头, 觉得不对, 做了种种的合理推测, 最后耐不住寂寞, 手动按照可能性很小的直觉拷贝了一段数据下来, 居然可以播放了….
原来, 除了文件头部分后, 直接指向的数据完全没有加密, 害得我在DSound.dll里面来回跟了半天thiscall的东西, 倒是记录下来一堆dss的东西.
也就是昨天得到的解密过程, 就是完全是目录区的解密.
意识稀薄中, 好像有人说所谓小心驶得万年船其实是本来只争朝夕的路程要跑一万年么…
然后推得vfat格式. 文件名部分, 从结尾$#0后, 应该是某种规律的填充, 冒充有意义数据.

tagRecBlock = packed record
  Filename:array[0..$3B] of Char;
  Offset: DWORD;
  Size: DWORD;
end;
tagVMBR = packed record
  r1: Cardinal;
  ItemCount: Cardinal;
end;

介个就是结构.
r1可能和数据排列方式/dummy entry等有关.
遂写了解压程序一个, 从00b.p解压出音乐14首. 第一个00无后缀名, 用途未知, 因为此文件内容有相当大的再压缩率, 所以应该不是mp3数据.
关卡, boss, 角色选择/OP/ED/清关等音乐都齐了.

2,952,882 BOSS1.MP3
2,755,187 BOSS2.MP3
3,196,552 BOSS3.MP3
  957,255 CHARASEL.MP3
  159,660 CLEAR.MP3
1,536,836 ENDING.MP3
  128,859 GAMEOVER.MP3
  192,807 OPENING.MP3
3,813,588 ST01.MP3
3,950,678 ST02.MP3
3,182,887 ST03.MP3
3,374,730 ST04.MP3
3,731,250 ST05.MP3
2,993,552 ST06.MP3

今天还有一个收获, 就是脑子抽筋打发时间的时候, 发现010 Editor的Template功能比我之前想象的自由得多, 给要编辑的结构化文件数据进行结构分析并着色, 列出各结构项目都是可以做到的, 不过使用中, 发现要隐藏掉某个field或者要禁止string/char[]展开, 后者没有找到功能, 前者也只能在上面的编辑器将颜色改为很浅, 下面的输出区还是有的.
上面的编辑区的原始数据的悬浮提示也很萌, 简直就是QuickWatch的感觉.
如果输出区允许非原始数据的输出的话, 直接在模板脚本里面完成解密应该也是可以的, 不过现在来说, 它发现你修改后, 就建议用它的计算功能和脚本(不针对特定文件, 没有模板的Inspector功能)去做, 但是用属性的read/write函数还是可以修改到原始数据, 目前好像只能这样了, 没法达到不编辑原始数据而在结果输出解密后的recblock项的, 而且因为read函数是单入的, 离奇到char xx[a]会执行a次, 每次函数需要处理一个char, 上面的需要上下文相关的解密貌似做不成了.
010 Editor, 03还是04年世纪上有人介绍, 那时用起来是惨不忍睹, 今年我忽然搞了一个一用, 多了很多特性, 少了以前的一些bug, 使用它的频率也高了很多, 有空给作者报报需求和bug去.
诶当年的小alice已经成为初有外形的小萝莉2.1.3版了, 希望不要成为winhex这种纯拿来用的欧巴桑啊~~

刚才谈到的后面数据加密是我过虑, 其实随后在接其他包(se音效包)时候, 发现数据果然有加密, 真是不枉废我对作者的期待, 然后我根据前面的作者风格, 推出数据加密的方式, 既是取文件项数据头部$2173字节, 文件项大小不满$2173的取该文件大小, 然后轮流取出vfat中该项文件名的每一个字节进行xor, 按照文件名长度轮回, 不包含文件名末尾0.
而前面的VMBR里面的r1(reserved1), 为1则是不加密, 为0则是用该办法加密.

(7)

预定的1111CG落空

鼻窦炎并发支气管炎, 差点以为自己挂点.
去了几个药店, 去买头孢拉定和头孢氨卞不给卖, 沿着附近跑了很远也没有其他药店.
好在估计是因为离开了恐怖的办公室还是因为丁香叶的效果,
目前症状缓解了不少.
中午和晚上嗑了另外一种中药.

这个悲惨的光棍节, 我独自一人在嗖嗖的东南风中寻找着传说中的抗生素们, 并且于归途流下了悔恨的泪水…
曾经我信阳的抽屉里, 有很多五花八门的日用药物, 曾经我以为上海可以很方便地买到更加五花八门的头孢一族.

本来打算很久一幅意象画,
一个破旧的说书人缩在站笼里
以失落的眼神看着眼前无视他的存在而路过的小男生和小女生们.

结果现在貌似提起精神都困难.
昨日忽然发现那边不能清唱, 否则有机会我应该把我每年保留的”萝莉和御姐都不是我的”重温的.

(15)

试用鸟 Adobe Fireworks 9

首次启动注意去设置语言.
目前SC环境下的资源文件貌似都是8的,要切到English(直接在选项里面设置,会自动生成Fireworks 9 Language.txt).
切换后出现橙色的新式Splash和About了.
安装程序貌似是向导创建还没有细致检查的,出现过
一共会安装12~13个组件.
当然Splash已经Remix化了,
Styles和Shapes貌似换过了.
打开PSD文件的支持没有丝毫改变,带效果的图层照例是位图化.
因此还是他是一个姓M而不是姓A的,满心指望他取色器A化的某说书人有点失望了.
前几天就收到Adobe的通知,去了后使用IE点击下载,到99%失败;
使用Adobe Downloads Manager,下载前2次均是损坏文件,昨天夜里重下第三次终于好了.

(4)

劲舞团不能在开启DEP的XP SP2和2003 SP1运行的workaround

表现为选择服务器后,进入全屏状态数秒后直接退出,(如果JIT不是静默的华生的话,会报 ntdll!KiFastSystemCallRet 错误)
主程序做过加壳,也做过变形,郁闷的是居然伪装为安博士的段名.
peid检查是upx,用upxripper脱壳失败,
OD载入后,按照UPX壳处理,断在5EF2B1,Dump下来可以运行,证明是UPX的壳没错.

估计是因为code段没有020(execute)属性引发DEP强烈抗议,推测添加后将不必去禁用DEP

可以在 系统属性->高级->性能->设置->数据执行保护 中将DEP设置为 “只为关键的Windows程序和服务启用数据执行保护”
(如果有硬件DEP的话,请在BIOS中禁止non execute protection)
对于喜欢Q&D方式的人,请移步来到c:\boot.ini,将你当前系统的启动项的/noexecute修改为OptIn(同上效果)或者AlwaysOff(完全禁用)
对于网吧或者家庭用户,如果感到上面的操作很郁闷,
请卸载SP2/SP1,或者格式化机器,华丽地安装2000/98.
做小工具去修改….
对之前的我或许早就提供下载了,不过目前我还是抓紧时间补觉的好….

这个故事告诉我们,玩壳不慎必自焚.

资料参考:

http://support.microsoft.com/default.aspx/kb/875352

http://www.microsoft.com/technet/prodtechnol/winxppro/zh-chs/maintain/sp2mempr.mspx

(4)

召唤Lendy

曾半仙(32051976) 14:06:38
西边的空间已经到期了
易码的论坛静悄悄
烧一台内燃机空调
召唤Lendy交出续费账号

 

(5)

今天是端午节

去逛了下超市,买毛巾,顺便买了个炭包.
植松小星果然很萌,强烈的翻制了一张CG
如果不找来官方图放一边对比,应该跟很难区分吧…
remake koboshi

(4)

ふた魔女的优佳

很久很久没有临摹了
准确说3个月了
之前只是3月初在老外涂鸦板上用路人甲署名涂了2,3张一些卡修推倒迪奥的图
所以把这张弄来充数吧
yuika
(25)

简单地萌

是继炮制满神的小四格以后的事情了.
忽然对很粗糙的线条的那种停不住了
伪吉田的抓布偶机
混乱场景的方块女
年前看之前那些集的< <金色的卡修>>,忽然发现迪奥就是shana配音,是迪奥首次出场,卡修被大铁椎猛椎那集.听了那句有朋友存在的”eru”句尾,就特地瞅了瞅片尾.果然是.
尚在看此片的人较少,估计有人认不出下面的迪奥.

也不奇怪,一边上色一边也在建数据库,下次就直接发线稿上来了,
还是继续郁闷去吧
果然商检使得我的混乱生活更加混乱了,想放松下都没得劲

(3)

(夸张画风的)小萝莉

小萝莉(简直就小萝莉(简直就是盗版)是盗版)

上星期五晚上仿制mifa站的作品….
此人诡异的风格…
盗版一个比画一个还麻烦
果然直线比曲线还难画

(33)