psp H pspgalgame推荐你懂得。gal类的 最好18R

galgame - 网易云音乐
一入gal深似海 欢迎进入大g吧美少女音乐所
播放:1061次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)&&
网络文化经营许可证:Category “GalGame相关”
星期日, 12 四月, 2015
最近没干啥好事,在撸学校的网。
看了猫爷爷的一篇文章以后深有感触、开始撸校园网、期间和基友一起交流着撸
然后我撸了一晚上把教学楼监控都撸了,但是后来没撸出来其他地方的监控、很蛋疼啊。后来问网络中心主任他说保卫处没联网、我勒个去,什么时代了还不联网……Otz你不联网我撸起来就难很多了啊。好歹有个专线啊。
然后基友在今天晚上把他们学校的监控撸了,嗯、全校的,他们学校监控网络是个专线。。。
唉、来日方长,慢慢来吧,发现blog好久没更新了,随便吐槽一下证明最近过得还可以。
某设备的CPU、竟然是arm9,撸了一晚上各种撸不动最后发现我了个擦竟然是9的。。。好吧其实我嵌入式设备学的一坨屎,慢慢来吧。
: ARM926EJ-S rev 5 (v5l)
: swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant
CPU revision
Cache type
: write-back
Cache clean
: cp15 c7 ops
Cache lockdown
: format C
Cache format
I line length
D line length
: DaVinci DM365 EVM
Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le (luohui@ipcteam) (gcc version 3.4.3 (MontaVista 3.4.3-25.0.104.6-07-06)) #1 PREEMPT Sat Dec 31 10:29:09 CST 2011
另一个设备v7的也是撸的各种不顺
Linux version 3.0.8 (bsp@WindRiver) (gcc version 4.4.1 (Hisilicon_v100(gcc4.4-290+uclibc_0.9.32.1+eabi+linuxpthread)) ) #1 Fri Mar 29 11:39:25 CST 2013
在一个v7设备上编译完一个后门丢上去以后
line 1: syntax error: unexpected word (expecting “)”)
啊我也是醉了。。。回头再看吧……
吐槽一下os x下chrome有点挫啊、启动卡好久。。。果然safari是亲儿子、节能环保速度快。
睡觉睡觉、明早去漫展( ?д?)不过貌似会下雨的样子?
星期一, 2 六月, 2014
啊……汉化了个不得了的丧尸游戏……=。=其实我也是……导入完文本测试Bug的时候才发现这剧情好丧尸啊……从头到尾全都是H嘛
还有迟到的祝福、祝大家儿童节快乐~
星期一, 3 二月, 2014
插件下载:
[+]全自动配置
[+]支持Wiz Anniversary、funta支持不能……那玩意章节表比较奇葩、
[+]CG Patch
第一个版本
本插件理论上支持所有使用Favorite社游戏引擎的游戏、并且目前已有的3个汉化版全部支持、现在已经支持全自动和谐……您只需要将本插件释放到游戏目录并用AlphaROMdiE装载游戏即可。
使用方法:【请在使用前认真阅读!
首先确保您的游戏目录是这样的、HarmoFavo下载下去以后直接释放到游戏目录即可
上个图证明可以支持光鸟鸟、色鸟鸟也可以支持、方法看评论一楼的回复
和谐后的光鸟鸟、其他的图就不上了……那个加奈和澪的3P因为是男猪开脑洞梦到的……所以那个没辙╮( ̄▽ ̄”)╭ 顾及18R的小盆友要玩的时候要小心这个坑。
【这里为老版本的说明、不必阅读】然后打开plugin目录、创建一个文本文档命名为config、然后里面的内容是需要解析的游戏的hcb文件。【为了兼容各种汉化补丁所以没有搞成自动的、搞成自动的兼容性会降低的。然后把那个文件从游戏目录复制到plugin目录下、比如我要让星空的记忆FD汉化版和谐一下,就复制汉化后的脚本执行体hoshimemo_ehchn.bch到plugin目录然后再填写config的内容即可。如下图
然后回到游戏目录、启动AlphaROMdiE、勾选禁止转码、把游戏可执行文件拖到上面、比如汉化版是Hoshimemo_EHchn.exe、然后会生成一个快捷方式、以后从这里点进去就是和谐版的游戏啦~
和谐效果如下图
被屏蔽掉的肯定就是H图啦~
有一个误伤的没办法、后来确认了下那张CG的确是出现在某H情节里……
啧啧啧、看看这有多少H
ETC的内容还是可以全部看到的_(:з」∠)_这里一般不会有H的
吐槽时间:
_(:з」∠)_这两天戳了下Favorite的引擎、感谢AmaranthF对Favorite社游戏引擎的vm拆解……
hcb可执行体主要分成几个区域
———————
public functions
———————
dispatcher
———————
para jumper[optional]
———————
———————
H memo code
———————
目前的做法比较简单粗暴、就是计算一下H memo code起始的地方、如果有call到这里的话直接给ret回去
Category: ,
星期日, 20 十月, 2013
will社引擎虚拟机的0x61指令对应ShowMovie
case 0x61:
dword_46C0C8 = 0;
dword_46C0C4 = 0;
dword_4F3484 = *(_BYTE *)v11;
v307 = v11 + 1;
if ( sub_42D810() == 2 )
v304 = sub_42D960(v307);
v303 = "%s\\%s";
v302 = v329;
v304 = sub_42D970();
v303 = "%s\\%s";
v302 = v329;
sprintf(v302, v303, v304, v307);
v255 = GetIDirectDraw();
if ( RenderFileToMMStream(0, v329, v255) )
if ( RenderStreamToSurface(v256) )
v257 = v11 + 1;
dword_6000CC = dword_4F3484 + 1;
v258 = *(_BYTE *)v257++;
while ( v258 );
dword_46B3E4 += v257 - (v11 + 2) + 3;
sub_419760();
goto LABEL_665;
sub_416230(hWnd, 3, 0);
CMoviePlay_deconstructer();
v298 = v11 + 1;
v299 = v298 + 1;
v301 = *(_BYTE *)v298++;
while ( v301 );
sub_416230(hWnd, 2, (int)v329);
v298 = v11 + 1;
v299 = v298 + 1;
v300 = *(_BYTE *)v298++;
while ( v300 );
dword_46B3E4 += v298 - v299 + 3;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
case 0x61:&&&&&&&&dword_46C0C8 = 0;&&&&&&&&dword_46C0C4 = 0;&&&&&&&&dword_4F3484 = *(_BYTE *)v11;&&&&&&&&v307 = v11 + 1;&&&&&&&&if ( sub_42D810() == 2 )&&&&&&&&{&&&&&&&&&&v304 = sub_42D960(v307);&&&&&&&&&&v303 = "%s\\%s";&&&&&&&&&&v302 = v329;&&&&&&&&}&&&&&&&&else&&&&&&&&{&&&&&&&&&&v304 = sub_42D970();&&&&&&&&&&v303 = "%s\\%s";&&&&&&&&&&v302 = v329;&&&&&&&&}&&&&&&&&sprintf(v302, v303, v304, v307);&&&&&&&&v255 = GetIDirectDraw();&&&&&&&&if ( RenderFileToMMStream(0, v329, v255) )&&&&&&&&{&&&&&&&&&&if ( RenderStreamToSurface(v256) )&&&&&&&&&&{&&&&&&&&&&&&v257 = v11 + 1;&&&&&&&&&&&&dword_6000CC = dword_4F3484 + 1;&&&&&&&&&&&&do&&&&&&&&&&&&&&v258 = *(_BYTE *)v257++;&&&&&&&&&&&&while ( v258 );&&&&&&&&&&&&dword_46B3E4 += v257 - (v11 + 2) + 3;&&&&&&&&&&&&sub_419760();&&&&&&&&&&&&goto LABEL_665;&&&&&&&&&&}&&&&&&&&&&sub_416230(hWnd, 3, 0);&&&&&&&&&&CMoviePlay_deconstructer();&&&&&&&&&&v298 = v11 + 1;&&&&&&&&&&v299 = v298 + 1;&&&&&&&&&&do&&&&&&&&&&&&v301 = *(_BYTE *)v298++;&&&&&&&&&&while ( v301 );&&&&&&&&}&&&&&&&&else&&&&&&&&{&&&&&&&&&&sub_416230(hWnd, 2, (int)v329);&&&&&&&&&&v298 = v11 + 1;&&&&&&&&&&v299 = v298 + 1;&&&&&&&&&&do&&&&&&&&&&&&v300 = *(_BYTE *)v298++;&&&&&&&&&&while ( v300 );&&&&&&&&}&&&&&&&&dword_46B3E4 += v298 - v299 + 3;&&&&&&&&return 0;
其中比较关键的两个函数
signed int __usercall RenderFileToMMStream&eax&(int a1&esi&, const CHAR *lpMultiByteStr, IDirectDraw *pDD)
struct IAMMultiMediaStreamVtbl *v4; // ecx@10
IAMMultiMediaStream *pAMS; // [sp+48h] [bp-20Ch]@1
WCHAR WideCharS // [sp+4Ch] [bp-208h]@6
pAMStream = 0;
if ( CoCreateInstance(&CLSID_AMMultiMediaStream, 0, 1u, &riid, (LPVOID *)&pAMS) &= 0
&& pAMS-&lpVtbl-&Initialize(pAMS, 0, 0, 0) &= 0
&& pAMS-&lpVtbl-&AddMediaStream(pAMS, (IUnknown *)pDD, (const MSPID *)&MSPID_PrimaryVideo, 0, 0) &= 0
&& pAMS-&lpVtbl-&AddMediaStream(pAMS, 0, (const MSPID *)&MSPID_PrimaryAudio, 1u, 0) &= 0
&& (a1 ? wcscpy(&WideCharStr, &word_5F25D0) : MultiByteToWideChar(0, 0, lpMultiByteStr, -1, &WideCharStr, MAX_PATH),
pAMS-&lpVtbl-&OpenFile(pAMS, &WideCharStr, 0) &= 0) )
v4 = pAMS-&lpV
pAMStream = pAMS;
v4-&AddRef(pAMS);
pAMS-&lpVtbl-&Release(pAMS);
wcscpy(&word_5F25D0, &WideCharStr);
((void (__stdcall *)(IAMMultiMediaStream *, _DWORD, int))pAMStream-&lpVtbl-&Seek)(
pAMStream,
stream_time,
dword_5F25CC);
result = 1;
CMoviePlay_deconstructer();
result = 0;
signed int __thiscall RenderStreamToSurface(void *this)
struct IAMMultiMediaStreamVtbl *v1; // ecx@1
IDirectDrawSurface *pDirectDrawS // [sp+4Ch] [bp-4h]@1
pDirectDrawSurface = (IDirectDrawSurface *)
v1 = pAMStream-&lpV
pDirectDrawSurface = 0;
if ( v1-&GetMediaStream(pAMStream, (REFMSPID)&MSPID_PrimaryVideo, &pPrimaryVidStream) &= 0
&& pPrimaryVidStream-&lpVtbl-&QueryInterface(
pPrimaryVidStream,
(const IID *const )&IID_IDirectDrawMediaStream,
(void **)&pDDStream) &= 0
&& pDDStream-&lpVtbl-&CreateSample(pDDStream, 0, 0, 0, &pSample) &= 0
&& pSample-&lpVtbl-&GetSurface(pSample, &pDirectDrawSurface, &pRect) &= 0
&& (*(int (__stdcall **)(_DWORD, _DWORD, _DWORD))pDirectDrawSurface-&lpVtbl)(
pDirectDrawSurface,
&IID_IDirectDrawSurface7,
&pSurface7) &= 0
&& pAMStream-&lpVtbl-&SetState(pAMStream, STREAMSTATE_RUN) &= 0 )
(*((void (__stdcall **)(_DWORD))pDirectDrawSurface-&lpVtbl + 2))(pDirectDrawSurface);
result = 1;
result = 0;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
signed int __usercall RenderFileToMMStream&eax&(int a1&esi&, const CHAR *lpMultiByteStr, IDirectDraw *pDD){&&signed int result; // eax@9&&struct IAMMultiMediaStreamVtbl *v4; // ecx@10&&IAMMultiMediaStream *pAMS; // [sp+48h] [bp-20Ch]@1&&WCHAR WideCharStr; // [sp+4Ch] [bp-208h]@6&&&pAMStream = 0;&&if ( CoCreateInstance(&CLSID_AMMultiMediaStream, 0, 1u, &riid, (LPVOID *)&pAMS) &= 0&&&&&& pAMS-&lpVtbl-&Initialize(pAMS, 0, 0, 0) &= 0&&&&&& pAMS-&lpVtbl-&AddMediaStream(pAMS, (IUnknown *)pDD, (const MSPID *)&MSPID_PrimaryVideo, 0, 0) &= 0&&&&&& pAMS-&lpVtbl-&AddMediaStream(pAMS, 0, (const MSPID *)&MSPID_PrimaryAudio, 1u, 0) &= 0&&&&&& (a1 ? wcscpy(&WideCharStr, &word_5F25D0) : MultiByteToWideChar(0, 0, lpMultiByteStr, -1, &WideCharStr, MAX_PATH),&&&&&&&&pAMS-&lpVtbl-&OpenFile(pAMS, &WideCharStr, 0) &= 0) )&&{&&&&v4 = pAMS-&lpVtbl;&&&&pAMStream = pAMS;&&&&v4-&AddRef(pAMS);&&&&pAMS-&lpVtbl-&Release(pAMS);&&&&wcscpy(&word_5F25D0, &WideCharStr);&&&&if ( a1 )&&&&&&((void (__stdcall *)(IAMMultiMediaStream *, _DWORD, int))pAMStream-&lpVtbl-&Seek)(&&&&&&&&pAMStream,&&&&&&&&stream_time,&&&&&&&&dword_5F25CC);&&&&result = 1;&&}&&else&&{&&&&CMoviePlay_deconstructer();&&&&result = 0;&&}&&return result;}&signed int __thiscall RenderStreamToSurface(void *this){&&struct IAMMultiMediaStreamVtbl *v1; // ecx@1&&signed int result; // eax@7&&IDirectDrawSurface *pDirectDrawSurface; // [sp+4Ch] [bp-4h]@1&&&pDirectDrawSurface = (IDirectDrawSurface *)this;&&v1 = pAMStream-&lpVtbl;&&pDirectDrawSurface = 0;&&if ( v1-&GetMediaStream(pAMStream, (REFMSPID)&MSPID_PrimaryVideo, &pPrimaryVidStream) &= 0&&&&&& pPrimaryVidStream-&lpVtbl-&QueryInterface(&&&&&&&& pPrimaryVidStream,&&&&&&&& (const IID *const )&IID_IDirectDrawMediaStream,&&&&&&&& (void **)&pDDStream) &= 0&&&&&& pDDStream-&lpVtbl-&CreateSample(pDDStream, 0, 0, 0, &pSample) &= 0&&&&&& pSample-&lpVtbl-&GetSurface(pSample, &pDirectDrawSurface, &pRect) &= 0&&&&&& (*(int (__stdcall **)(_DWORD, _DWORD, _DWORD))pDirectDrawSurface-&lpVtbl)(&&&&&&&& pDirectDrawSurface,&&&&&&&& &IID_IDirectDrawSurface7,&&&&&&&& &pSurface7) &= 0&&&&&& pAMStream-&lpVtbl-&SetState(pAMStream, STREAMSTATE_RUN) &= 0 )&&{&&&&(*((void (__stdcall **)(_DWORD))pDirectDrawSurface-&lpVtbl + 2))(pDirectDrawSurface);&&&&result = 1;&&}&&else&&{&&&&result = 0;&&}&&return result;}
这里用的是DShow里的IAMMultiMediaStream播放视频、具体看这里
Category: , , ,
星期日, 13 十月, 2013
最后还是选择了伪压缩算法、太扯淡了、战了好几个星期太蛋疼了……
记录一下,用于早期Will社引擎、因为解压函数没有传入size、所以要注意最后一定要附加三个0、_(:з」∠)_至于为啥各位自己理解下
MACRO_FALSE __cdecl sub_430750(char *src, char *dst)
char *pC // esi@1
char *pO // edi@1
int ring_ // ebx@1
MACRO_FALSE // eax@2
unsigned __int8 // dl@3
char v8; // al@5
unsigned __int16 // ax@6
unsigned __int16 nP // ax@6
char v12; // al@9
char ring[4096]; // [sp+Ch] [bp-100Ch]@1
MACRO_FALSE bF // [sp+100Ch] [bp-Ch]@1
__int16 nR // [sp+1010h] [bp-8h]@8
unsigned __int16 v16; // [sp+1014h] [bp-4h]@8
bFinished = TRUE;
memset(ring, 0, sizeof(ring));
ring_index = 1;
result = bF
if ( bFinished )
flag = *pC
while ( 1 )
if ( flag & 1 )
*pOut = *pC
ring[ring_index] = v8;
ring_index = ((_WORD)ring_index + 1) & 0xFFF;
HIBYTE(p) = *pC
LOBYTE(p) = pCurr[1];
nPos = p && 4;
if ( !nPos )
bFinished = 0;
goto LABEL_2;
n = pCurr[1];
pCurr += 2;
nRepeat = (n & 0xF) + 2;
v12 = ring[v16];
*pOut = v12;
ring[ring_index] = v12;
ring_index = ((_WORD)ring_index + 1) & 0xFFF;
v16 = (v16 + 1) & 0xFFF;
while ( nRepeat );
flag &&= 1;
goto LABEL_2;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
MACRO_FALSE __cdecl sub_430750(char *src, char *dst){&&char *pCurr; // esi@1&&char *pOut; // edi@1&&int ring_index; // ebx@1&&MACRO_FALSE result; // eax@2&&unsigned __int8 flag; // dl@3&&signed int i; // ecx@3&&char v8; // al@5&&unsigned __int16 p; // ax@6&&unsigned __int16 nPos; // ax@6&&char n; // al@8&&char v12; // al@9&&char ring[4096]; // [sp+Ch] [bp-100Ch]@1&&MACRO_FALSE bFinished; // [sp+100Ch] [bp-Ch]@1&&__int16 nRepeat; // [sp+1010h] [bp-8h]@8&&unsigned __int16 v16; // [sp+1014h] [bp-4h]@8&&&bFinished = TRUE;&&memset(ring, 0, sizeof(ring));&&pCurr = src;&&pOut = dst;&&ring_index = 1;LABEL_2:&&result = bFinished;&&if ( bFinished )&&{&&&&flag = *pCurr;&&&&i = 8;&&&&++pCurr;&&&&while ( 1 )&&&&{&&&&&&if ( flag & 1 )&&&&&&{&&&&&&&&v8 = *pCurr;&&&&&&&&*pOut = *pCurr;&&&&&&&&ring[ring_index] = v8;&&&&&&&&++pCurr;&&&&&&&&ring_index = ((_WORD)ring_index + 1) & 0xFFF;&&&&&&&&++pOut;&&&&&&}&&&&&&else&&&&&&{&&&&&&&&HIBYTE(p) = *pCurr;&&&&&&&&LOBYTE(p) = pCurr[1];&&&&&&&&nPos = p && 4;&&&&&&&&if ( !nPos )&&&&&&&&{&&&&&&&&&&bFinished = 0;&&&&&&&&&&goto LABEL_2;&&&&&&&&}&&&&&&&&v16 = nPos;&&&&&&&&n = pCurr[1];&&&&&&&&pCurr += 2;&&&&&&&&nRepeat = (n & 0xF) + 2;&&&&&&&&do&&&&&&&&{&&&&&&&&&&v12 = ring[v16];&&&&&&&&&&*pOut = v12;&&&&&&&&&&ring[ring_index] = v12;&&&&&&&&&&++pOut;&&&&&&&&&&ring_index = ((_WORD)ring_index + 1) & 0xFFF;&&&&&&&&&&v16 = (v16 + 1) & 0xFFF;&&&&&&&&&&--nRepeat;&&&&&&&&}&&&&&&&&while ( nRepeat );&&&&&&}&&&&&&flag &&= 1;&&&&&&--i;&&&&&&if ( !i )&&&&&&&&goto LABEL_2;&&&&}&&}&&return result;}
伪压缩算法
void LzssPack(const unsigned char *pSrc,size_t szSrc,unsigned char * &pDst,size_t &szDst)
const unsigned char *pSrcEnd = pSrc+szS
const unsigned char *pCurr = pS
pDst = new unsigned char[800*600*3*2];
unsigned char *pOut = pD
while (pCurr&pSrcEnd)
unsigned char *flagpos = pO
*pOut++=0xFF;
for (;i&&pCurr&pSrcE--i)
*pOut++=*pCurr++;
*flagpos&=~(1&&(8-i));
*pOut++=0;
*pOut++=0;
*pOut++=0;
*pOut++=0;
*pOut++=0;
szDst = pOut-pD
123456789101112131415161718192021222324252627
void LzssPack(const unsigned char *pSrc,size_t szSrc,unsigned char * &pDst,size_t &szDst){ const unsigned char *pSrcEnd = pSrc+szSrc; const unsigned char *pCurr = pSrc; pDst = new unsigned char[800*600*3*2]; unsigned char *pOut = pDst; while (pCurr&pSrcEnd) {
unsigned char *flagpos = pOut;
*pOut++=0xFF;
for (;i&&pCurr&pSrcEnd;--i)
*pOut++=*pCurr++;
*flagpos&=~(1&&(8-i));
*pOut++=0;
*pOut++=0;
} } *pOut++=0; *pOut++=0; *pOut++=0; szDst = pOut-pDst;}
Category: ,
星期一, 9 九月, 2013
Build更新内容
修正与一些杀毒软件不兼容的情况(Avast等)
_(:з」∠)_这是汉化TH14东方辉针城的过程中发现的Bug、另外也打个广告、 C84的东方辉针城汉化成品、
其实还有不少存在问题的地方、比如我封包管理用的是一个封装了SQLite的自己写的虚拟文件类、但是每当这个虚拟文件类被编译到程序里在注入到TH14的进程里的时候就会导致游戏卡顿、就算我只是注入进去什么也不做也会导致卡顿、_(:з」∠)_前略……天国的科学君
自动升级的代码很粗糙_(:з」∠)_第一次写这方面的东西啊、果然还需要多尝试才能成长……
最后感谢喵玉汉化组成员的努力~
Category: ,
星期二, 13 八月, 2013
_(:з」∠)_首先在这里感谢前辈的工作 /p/thtk/downloads/list
然后再来拜一下ZUN神……有米的话大家还是支持下正版、反正正版才1K円、也不是很贵。
解包以后的TH14
为了提升能力,封包结构什么的果断还是自己看、
是我调试用的udd、各位有兴趣可以自己看。我导入map的时候手滑点错ida版本了、=。=结果导入了一个提示不够给力的map,嘛、不过还好用到的函数还都比较好识别。
TH14的封包跟以前对比只更换了一个Limit、其实图快的话直接改原解包程序即可。
static const crypt_params_t th14_crypt_params[] = {
{ 0x1b, 0x73, 0x100, 0x3800 }, /* aa */
{ 0x12, 0x43, 0x200, 0x3e00 }, /* ff */
{ 0x35, 0x79, 0x400, 0x3c00 }, /* 11 */
{ 0x03, 0x91, 0x80,
0x6400 }, /* dd */
{ 0xab, 0xdc, 0x80,
0x7000 }, /* ee */
{ 0x51, 0x9e, 0x100, 0x4000 }, /* bb */
{ 0xc1, 0x15, 0x400, 0x2c00 }, /* cc */
{ 0x99, 0x7d, 0x80,
1234567891011
static const crypt_params_t th14_crypt_params[] = {&&&&/* key&&step&&block&&limit */&&&&{ 0x1b, 0x73, 0x100, 0x3800 }, /* aa */&&&&{ 0x12, 0x43, 0x200, 0x3e00 }, /* ff */&&&&{ 0x35, 0x79, 0x400, 0x3c00 }, /* 11 */&&&&{ 0x03, 0x91, 0x80,&&0x6400 }, /* dd */&&&&{ 0xab, 0xdc, 0x80,&&0x7000 }, /* ee */&&&&{ 0x51, 0x9e, 0x100, 0x4000 }, /* bb */&&&&{ 0xc1, 0x15, 0x400, 0x2c00 }, /* cc */&&&&{ 0x99, 0x7d, 0x80,&&0x4400 }&&/* 77 */};
其他部分都是没有变化的。
_(:з」∠)_我们一起来欣赏下ZUN的封包结构。
Category: ,
星期一, 5 八月, 2013
解包器下载:
回头来看、这封包把拓展名和文件名都日了还真是蛋疼。
封包里一共几种格式.lua .ogg .wav .tga .dds
判断下文件头然后格式就出来了、但是文件名比较蛋疼。_(:з」∠)_话说这样的封包在游戏里调用起来真的方便么。
还有万恶的SIMD2扩展=。=这生成的汇编代码怎么让人在OD里看嘛、全都是乱码怎么看嘛。
代码全重写了。_(:з」∠)_感觉之前写的那个解包类外表上看上去很有误人子弟的感觉、其实是游戏里是递归调用判断cryption标志进行相应的解密的。
一起欣赏下新的解包器工作的界面吧……
放出修改以后最核心的部分代码(* ̄︶ ̄)y 其他的部分比较容易大家自行脑补就可以了,这里需要注意的是readPackage是个递归调用父封包readPackage进行读取数据和解码的函数。
Category: ,
星期日, 4 八月, 2013
RT、只是粗略分析、这东西一堆STL、然后好像托管C++都用上了、逆起来太蛋疼、一堆类对象、搞起来简直是找虐的感觉。
目标游戏:不思議の幻想郷2 みらくる☆パーティー
游戏厂家:AQUA STYLE
封包:lotusland4.dat
封包相关结构
typedef struct NFAHdr
BYTE sig[4];
WORD//current is 2
typedef struct FileInfo
typedef enum NFAHdrFlag
Cryption = 1,
Zipped = 4,
Buffered = 8,
NameList = 0x10
12345678910111213141516171819202122
typedef struct NFAHdr{ BYTE sig[4]; WORD version;//current is 2 WORD filecnt; DWORD flag;};&typedef struct FileInfo{ DWORD len; DWORD offset; DWORD flag;};&typedef enum NFAHdrFlag{ Cryption = 1, Zipped = 4, Buffered = 8, NameList = 0x10};
需要注意的是有Flag4的封包是Zlib压缩的、=。=那块基本不需要处理、直接把子封包数据块Dump成NFA封包即可、回封的时候直接把原子封包加在dat封包里即可。解压了的话所有文件的体积可是相当的庞大、好像有7G之多。主要是那块懒得写了、╮( ̄▽ ̄”)╭ 封包相关的内容现在已经基本逆完了,_(:з」∠)_偷懒中……
首先dat封包的头部是sig、sig是NFA0、我们干脆就叫它NFA封包。然后NFA封包的下层结构也可以是NFA封包、或者是压缩过的NFA封包、在这个样本中压缩过的NFA封包数据块是被加密的、说起加密。我们还是来看看相关的代码
Assembly (x86)
offset &aLotusland4_dat&
ASCII "lotusland4.dat"
ecx, offset &unk_710780&
C645 F3 E6
byte ptr [ebp-0xD], 0xE6
0xe6 xor 0xee =decode key
E8 9CD90500
&packageOpen&
0055AC21&&|.&&68 && push&&&&offset &aLotusland4_dat&&&&&&&&& ;&&ASCII "lotusland4.dat"0055AC26&&|.&&B9 && mov&&&& ecx, offset &unk_710780&0055AC2B&&|.&&C645 F3 E6&&&&mov&&&& byte ptr [ebp-0xD], 0xE6&&&&&&&& ;&&0xe6 xor 0xee =decode key0055AC2F&&|.&&E8 9CD90500&& call&&&&&packageOpen&
首先是这里、0xE6才是真正意义上的Key、Key通过与0xEE异或产生用于解密的Key,这里是0x08
看一下解密后的标准文件头
可以看到dat的文件头上很标准的排列着NFAHdr,FileInfo,char Name[0x80],FileInfo,char Name[0x80],FileInfo,char Name[0x80]…这样的结构。
没有压缩Flag的子文件解包请看005B78A0这个函数。
没有压缩Flag的文件头解密后,橘色部分是标准文件头、
带压缩Flag的子文件解包请看005B7F70这个函数。
带压缩Flag的子文件解压解密后、红色部分是FileInfo
红色部分三块都有、是FileInfo结构、每个文件3个DWORD描述文件的偏移原大小和一个Flag。
文件名部分是长度为0x80的char数组、只有dat这个最顶层结构有这个。子封包是没有这个结构的。顺便说这个结构是否存在是通过FileName那个Flag进行判断的。
其他的附上udd、各位看官有兴趣请自行下载调戏~
封包解析代码、渣代码我自重_(:з」∠)_各位见笑了……用这个代码可以成功释放出所有mov和游戏的lua脚本,比较奇怪lua里面为啥还会有ruby=。=嘛、没搞过lua和ruby的暂时先放放了、以后有空再搞。
剩下的汉化工作就是对导出的lua脚本进行放尿Play、羞耻Play【我自重、_(:з」∠)_总之大概就是这个样子了。
Category: ,
星期一, 29 七月, 2013
Please leave valid mail address that I can contact you.
Is it a bug? Title: (18禁ゲーム) [130726] [Elysion] 星逢のプリズムギア :Build Although it can start, a part of configuration cannot be used. NG “Config-詳細設定” :Build It can start and can also use all configuration. Test:WindowsXPsp3
Plz provide detail description about the configuration cannot be used and send me the main executable program of the game.
新文章订阅
_(:з」∠)_订阅后当我的有新文章时你会收到邮件提示。
电子邮件地址
近期评论文章归档
有朋自远方来
发送到您的邮件地址
您的邮件地址
文章未发送,请检查您的电子邮件地址!
电子邮件检查失败,请重试
抱歉,您的博客无法通过电子邮件共享文章。}

我要回帖

更多关于 pspgalgame 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信