インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その7

インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その1
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その2
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その3
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その4
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その5
インドネシア版 Emil Chronicle のランチャーの Windows 2000版を自作してみる実験 その6

namespace PatchHeader
{
 [Serializable]
 public class Header
 {
  public string FileName { get; set; }
  public byte[] FileBytes { get; set; }
 }
}

かなりアバウントなんすけど、復号したデータが.Net Framework でシリアライズされていたので、取り出さにゃなりません。

  char *p,*q;
int x,objCount;
char data1[256],data2[256];
CString hed,hed2,hed3,hed4,name1,name2,name3,name4,name5,fileName;
p = q = (char*)oBuf + 0x18;
x = binscan2(p,"\000\000\000",size,3);
if(x >= 0) {
int s1,s2,s3,s4;
int s5,s6,s7;
x--;
objCount = *(int*)(p+x);
p[x] =0;
hed = CString(p);
p+= 4+x;
s1=(int)*p;
s2=(int)*(p+s1+1);
p[s1+1]=0;
name1 = CString(p+1);
name2 = CString(p+s1+2);
p+=s1+s2+2 + 2;
wprintf(L"Count %d: %s,%s\n",objCount,(LPCTSTR)name1,(LPCTSTR)name2);
x = binscan2(p,"\000\000\000",size - (p - q),3);
if(x >= 0) {
x--;
objCount = *(int*)(p+x);
p[x] =0;
hed2 = CString(p);
p+=4+x;
s1=(int)*p;
s2=(int)*(p+s1+1);
s3=(int)*(p+s1+1+s2+1);
s4=(int)*(p+s1+1+s2+1+s3+1);
p[1+s1]=0;
//p[1+s1+s2+1]=0;
p[1+s1+s2+1+s3+1]=0;
//p[1+s1+s2+1+s3+1+s4+1]=0;
fileName = CString(p+1);
p+=s1+1;
memcpy(data1,p+1,s2);
p+=s2+1;
hed3 = CString(p+1);
p+=s3+1;
memcpy(data2,p+1,s4);
p+=s4+1;
wprintf(L"Count %d: %s,data[%d],%s,data[%d]\n",objCount,(LPCTSTR)fileName,s2,hed3,s4);
x = binscan2(p,"\000\000\000",size - (p - q),3);
if(x >= 0) {
//[B]PatchHeader
x--;
objCount = *(int*)(p+x);
p[x] =0;
p+=x+4;
s1=(int)*p;
s2=(int)*(p+s1+1);
s3=(int)*(p+s1+1+s2+1);
p[s1+1]=0;
p[s1+1+s2+1]=0;
p[s1+1+s2+1+s3+1]=0;
name3 = CString(p+1);
name4 = CString(p+1+s1+1);
name5 = CString(p+1+s1+1+s2+1);
p+=s2+1+s1+s3+1+1;
x = binscan2(p,"\000\000\000",size,3);
wprintf(L"Count %d: %s,%s,%s\n",objCount,(LPCTSTR)name3,(LPCTSTR)name4,(LPCTSTR)name5);
if(x >= 0) {
//[B]PatchHeader
if(x >= 0) {
//[B]PatchHeader
x--;
objCount = *(int*)(p+x);
p+=x;
x=binscan2(p,"\x19<FileName>k__BackingField\x1a<FileBytes>k__BackingField",size  - (p - q),0x35);
if(x >= 0){
CString *PatchName;
p+= x+0x35;
p+=3;  // 01 07 02 04 00 00 00// 06
s1 =*(int *)(p+5) - 6;
if(s1 == 0)continue;
PatchName = new CString[s1];
for(s2 = 0;s2<s1;s2++){
int s7 =  *(int*)p;
int s8 =  (int)*(p+4);
int s9 =  *(int*)(p+5);
p+=9;
s3=(int)*p;
s4=(int)*(p+s3+1);
//s4=(int)*(p+s3+1);
p[s3+1]=0;
PatchName[s2] = CString(p+1);
printf("Count %d/%d:%s[%x][%x][%x]\n",s2,s1,p+1,s7,s8,s9);
p+=s3+1+1+s4;
}
for(s2 = 0;s2<s1;s2++){
CString modulePath2 = _T("");
s3 =*(int *)(p);
p+=5;
pszFileName = modulePath + CString("bwc\\")+PatchName[s2];//
while(FileExistsW((wchar_t*)pszFileName.GetString(),false)){
pszFileName=pszFileName+CString(L"_");
}
CStdioFile fileTest4;
if (fileTest4.Open(pszFileName, CFile::modeCreate |CFile::modeWrite | CFile::typeBinary, &ex)){
fileTest4.Write(p, s3);
fileTest4.Close();
}
printf("ByteData %x/[%02x][%02x]...",s3,p[0],p[1]);
p+=s3;
s4=(int)*(p);
s5=*(int*)(p+s4);
printf("[%x][%04x]\n",s4,s5);
p+=5;
}
delete []PatchName;
}
}
}
}
}

参考にするソースがないので、中身解析してざっくり復号処理を書いてみた。

econ

Patch 502-666 のパッチでオリジナルと適用結果を比較
179パッチ、6884ファイルの適用で差異無し(・ω・)よし!

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です