This commit is contained in:
恍兮惚兮 2025-01-07 17:34:40 +08:00
parent 0a77c9ce70
commit 1a7f27bd28
14 changed files with 163 additions and 25 deletions

View File

@ -23,7 +23,7 @@ else()
Syuntada Pensil Anim hibiki Nitroplus Reallive Siglus Taskforce2 RUGP IronGameSystem Anex86 Syuntada Pensil Anim hibiki Nitroplus Reallive Siglus Taskforce2 RUGP IronGameSystem Anex86
ShinyDaysGame MarineHeart ShinaRio CaramelBox UnisonShift Escude Ryokucha Alice Footy2 ShinyDaysGame MarineHeart ShinaRio CaramelBox UnisonShift Escude Ryokucha Alice Footy2
utawarerumono System4x Abalone Abel 5pb HorkEye XUSE Leaf Nekopack AXL AGS AdobeFlash10 utawarerumono System4x Abalone Abel 5pb HorkEye XUSE Leaf Nekopack AXL AGS AdobeFlash10
FocasLens Tamamo Ages3ResT H_do_C) FocasLens Tamamo Ages3ResT H_do_C RScript)
set(enginepath "engine32") set(enginepath "engine32")
set(collector "enginecollection32.cpp") set(collector "enginecollection32.cpp")
endif() endif()

View File

@ -4,9 +4,9 @@ namespace{
bool _1(){ bool _1(){
BYTE sig[]={0x64,0xa3,0x00,0x00,0x00,0x00,0x8b,0xf1,0x8b,0x45,0x08,0x0f,0x57,0xc0,0xc7,0x06,0x02,0x00,0x00,0x00}; BYTE sig[]={0x64,0xa3,0x00,0x00,0x00,0x00,0x8b,0xf1,0x8b,0x45,0x08,0x0f,0x57,0xc0,0xc7,0x06,0x02,0x00,0x00,0x00};
auto addr=MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress); auto addr=MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress);
if(addr==0)return 0; if(!addr)return 0;
addr=MemDbg::findEnclosingAlignedFunction(addr); addr=MemDbg::findEnclosingAlignedFunction(addr);
if(addr==0)return 0; if(!addr)return 0;
HookParam hp; HookParam hp;
hp.address = addr; hp.address = addr;
hp.type = CODEC_UTF16|DATA_INDIRECT; hp.type = CODEC_UTF16|DATA_INDIRECT;
@ -18,9 +18,9 @@ namespace{
bool _2(){ bool _2(){
BYTE sig[]={0xb8,0xff,0x00,0x00,0x00,0x66,0x3b,0x06,0x1b,0xc0,0xf7,0xd8,0x40}; BYTE sig[]={0xb8,0xff,0x00,0x00,0x00,0x66,0x3b,0x06,0x1b,0xc0,0xf7,0xd8,0x40};
auto addr=MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress); auto addr=MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress);
if(addr==0)return 0; if(!addr)return 0;
addr=MemDbg::findEnclosingAlignedFunction(addr); addr=MemDbg::findEnclosingAlignedFunction(addr);
if(addr==0)return 0; if(!addr)return 0;
HookParam hp; HookParam hp;
hp.address = addr; hp.address = addr;
hp.type = CODEC_UTF16|DATA_INDIRECT|NO_CONTEXT; hp.type = CODEC_UTF16|DATA_INDIRECT|NO_CONTEXT;
@ -35,7 +35,7 @@ namespace{
DWORD maxaddr=0;int maxi=0; DWORD maxaddr=0;int maxi=0;
for(auto addr:Util::SearchMemory(sig, sizeof(sig),PAGE_EXECUTE, processStartAddress, processStopAddress)){ for(auto addr:Util::SearchMemory(sig, sizeof(sig),PAGE_EXECUTE, processStartAddress, processStopAddress)){
addr=MemDbg::findEnclosingAlignedFunction(addr); addr=MemDbg::findEnclosingAlignedFunction(addr);
if(addr==0)continue; if(!addr)continue;
if(mp.find(addr)==mp.end())mp[addr]=0; if(mp.find(addr)==mp.end())mp[addr]=0;
mp[addr]+=1; mp[addr]+=1;
if(mp[addr]>maxi){maxi=mp[addr];maxaddr=addr;} if(mp[addr]>maxi){maxi=mp[addr];maxaddr=addr;}

View File

@ -39,7 +39,7 @@ public:
{ {
//[071227][フロントウイング] タイムリープ //[071227][フロントウイング] タイムリープ
check_by = CHECK_BY::FILE_ALL; check_by = CHECK_BY::FILE_ALL;
check_by_target = check_by_list{L"MDT/*.dat", L"BGM.dat", L"CHIP.dat", L"ef.dat", L"Init.dat", L"SE.dat"}; check_by_target = check_by_list{L"MDT\\*.dat", L"BGM.dat", L"CHIP.dat", L"ef.dat", L"Init.dat", L"SE.dat"};
}; };
bool attach_function(); bool attach_function();
}; };

View File

@ -9,7 +9,7 @@ bool GSX1() {
//http://www.mirai-soft.com/products/persona/download.html //http://www.mirai-soft.com/products/persona/download.html
//https://dlsoft.dmm.co.jp/detail/stone_0015/ //https://dlsoft.dmm.co.jp/detail/stone_0015/
ULONG addr = MemDbg::findCallerAddress((ULONG)::GetCharWidth32W, 0xec8b55, processStartAddress, processStopAddress); ULONG addr = MemDbg::findCallerAddress((ULONG)::GetCharWidth32W, 0xec8b55, processStartAddress, processStopAddress);
if(addr==0)return false; if(!addr)return false;
HookParam hp; HookParam hp;
hp.address=addr; hp.address=addr;
hp.type=USING_CHAR|CODEC_UTF16|DATA_INDIRECT; hp.type=USING_CHAR|CODEC_UTF16|DATA_INDIRECT;
@ -36,14 +36,14 @@ bool GSX2() {
//仁義なき乙女 体验版 //仁義なき乙女 体验版
//https://dlsoft.dmm.co.jp/detail/stone_0031/ //https://dlsoft.dmm.co.jp/detail/stone_0031/
ULONG addr = findiatcallormov((DWORD)GetGlyphOutlineA,processStartAddress, processStartAddress, processStopAddress,false,XX); ULONG addr = findiatcallormov((DWORD)GetGlyphOutlineA,processStartAddress, processStartAddress, processStopAddress,false,XX);
if(addr==0) if(!addr)
addr = findiatcallormov((DWORD)GetGlyphOutlineA,processStartAddress, processStartAddress, processStopAddress); addr = findiatcallormov((DWORD)GetGlyphOutlineA,processStartAddress, processStartAddress, processStopAddress);
if(addr==0)return false; if(!addr)return false;
auto addr1=findfuncstart(addr); auto addr1=findfuncstart(addr);
auto addr2=MemDbg::findEnclosingAlignedFunction(addr); auto addr2=MemDbg::findEnclosingAlignedFunction(addr);
if(addr1) addr=addr1; if(addr1) addr=addr1;
else addr=addr2; else addr=addr2;
if(addr==0)return false; if(!addr)return false;
auto xrefs=findxref_reverse_checkcallop(addr,processStartAddress,processStopAddress,0xe8); auto xrefs=findxref_reverse_checkcallop(addr,processStartAddress,processStopAddress,0xe8);
if(xrefs.size()!=2)return false; if(xrefs.size()!=2)return false;
addr=xrefs[1]; addr=xrefs[1];
@ -51,7 +51,7 @@ bool GSX2() {
addr2=MemDbg::findEnclosingAlignedFunction(addr); addr2=MemDbg::findEnclosingAlignedFunction(addr);
if(addr1)addr=addr1; if(addr1)addr=addr1;
else addr=addr2; else addr=addr2;
if(addr==0)return false; if(!addr)return false;
ConsoleOutput("%p",addr); ConsoleOutput("%p",addr);
HookParam hp; HookParam hp;
hp.address=addr; hp.address=addr;

View File

@ -5,9 +5,9 @@ bool HXP::attach_function() {
//https://vndb.org/v172 //https://vndb.org/v172
//エクソダスギルティー・オルタナティブ //エクソダスギルティー・オルタナティブ
auto addr=MemDbg::findCallerAddress((DWORD)TextOutA, 0x01003d66,processStartAddress, processStopAddress); auto addr=MemDbg::findCallerAddress((DWORD)TextOutA, 0x01003d66,processStartAddress, processStopAddress);
if(addr==0)return false; if(!addr)return false;
addr=MemDbg::findEnclosingAlignedFunction(addr); addr=MemDbg::findEnclosingAlignedFunction(addr);
if(addr==0)return false; if(!addr)return false;
HookParam hp; HookParam hp;
hp.address = (DWORD)addr; hp.address = (DWORD)addr;
hp.offset=stackoffset(2); hp.offset=stackoffset(2);

View File

@ -13,7 +13,7 @@ bool Nijyuei::attach_function() {
}; };
auto addr=MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress); auto addr=MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
if(addr==0)return false; if(!addr)return false;
HookParam hp; HookParam hp;
hp.address = addr+5; hp.address = addr+5;

View File

@ -0,0 +1,80 @@
#include "RScript.h"
bool RScript::attach_function()
{
/*
void __thiscall CSelTxtEx::SetSels(CSelTxtEx *this, char *a2)
while ( *a2 )
{
if ( _ismbblead(*a2) && (v8 = _ismbbtrail(a2[1])) != 0 )
{
if ( *((_WORD *)this + 42) >= *((_WORD *)this + 43) )
return;
LOWORD(v8) = (unsigned __int8)*a2;
LOWORD(v9) = (unsigned __int8)a2[1];
*(_WORD *)(*((_DWORD *)this + 96) + 2 * *((unsigned __int16 *)this + 42)) = v3;
CSelTxtEx::SetSel(this, v9 + (v8 << 8), v23, v4, v22, v21);
a2 += 2;
}
else if ( *a2 == 94 )
{
v10 = *++a2;
if ( !v10 )
return;
switch ( v10 )
{
case 'A':
case 'a':
*/
BYTE bytes[] = {
0x80, 0x3f, 0x5e,
0x0f, 0x85, XX4,
0x8a, 0x47, 0x01,
0x47, 0x84, 0xc0,
0x0f, 0x84, XX4,
0x0f, 0xbe, 0xc0,
0x83, 0xc0, 0xbf,
0x83, 0xf8, 0x32};
auto addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
if (!addr)
return false;
auto faddr = MemDbg::findEnclosingAlignedFunction(addr);
if (!faddr)
return false;
BYTE bytes2[] = {
0x8a, 0x07,
0x84, 0xc0,
0x0f, 0x84, XX4,
0x0f, 0xbe, 0xd0,
0x52,
0xe8, XX4, // call __ismbblead
0x83, 0xc4, 0x04,
0x85, 0xc0,
0x74, XX,
0x0f, 0xbe, 0x47, 0x01,
0x50,
0xe8, XX4, // call __ismbbtrail
};
auto addrX = MemDbg::findBytes(bytes2, sizeof(bytes2), faddr, addr);
if (!addrX)
return false;
static auto __ismbblead = *(int *)(addrX + 2 + 2 + 6 + 3 + 1 + 1) + addrX + 2 + 2 + 6 + 3 + 1 + 5;
static auto __ismbbtrail = *(int *)(addrX + sizeof(bytes2) - 4) + addrX + sizeof(bytes2);
ConsoleOutput("%p", __ismbblead);
ConsoleOutput("%p", __ismbbtrail);
HookParam hp;
hp.address = faddr;
hp.offset = stackoffset(1);
hp.type = USING_STRING | EMBED_ABLE | EMBED_AFTER_NEW | EMBED_DYNA_SJIS;
hp.embed_hook_font = F_GetGlyphOutlineA | F_GetTextExtentPoint32A;
hp.lineSeparator = L"^n";
patch_fun = []()
{
ReplaceFunction((void *)__ismbblead, +[](BYTE b)
{ return b != '^'; });
ReplaceFunction((void *)__ismbbtrail, +[](BYTE b)
{ return b != '^'; });
};
return NewHook(hp, "RScript");
}

View File

@ -0,0 +1,56 @@
/*
FILEVERSION 1,0,0,0
PRODUCTVERSION 3,0,0,0
FILEFLAGSMASK 0x3F
FILEFLAGS 0x0
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0
{
BLOCK "StringFileInfo"
{
BLOCK "041104b0"
{
VALUE "Comments"
VALUE "CompanyName", "LiarSoft"
VALUE "FileDescription", "RScript"
VALUE "FileVersion", "1, 0, 0, 0"
VALUE "InternalName", "RScript"
VALUE "LegalCopyright", "Copyright (C)LiarSoft 2001"
VALUE "LegalTrademarks"
VALUE "OriginalFilename", "RScript.exe"
VALUE "PrivateBuild"
VALUE "ProductName", "WindWing RScript"
VALUE "ProductVersion", "3, 0, 0, 0"
VALUE "SpecialBuild"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x411, 1200
}
}
*/
class RScript : public ENGINE
{
public:
RScript()
{
check_by = CHECK_BY::CUSTOM;
check_by_target = []()
{
auto _ = {
L"grpe\\*.lim",
L"grps\\*.lim",
L"grpo\\*.lim",
L"scr\\*.gsc",
};
auto checkfile = std::all_of(_.begin(), _.end(), Util::CheckFile);
return checkfile && Util::SearchResourceString(L"RScript");
};
is_engine_certain = false;
};
bool attach_function();
};

View File

@ -7,7 +7,7 @@ bool SRPGStudio::attach_function() {
auto dll=GetModuleHandleW(L"OLEAUT32.dll"); auto dll=GetModuleHandleW(L"OLEAUT32.dll");
if(dll==0)return 0; if(dll==0)return 0;
auto addr=GetProcAddress(dll,"SysAllocString"); auto addr=GetProcAddress(dll,"SysAllocString");
if(addr==0)return 0; if(!addr)return 0;
HookParam hp; HookParam hp;
hp.address = (DWORD)addr; hp.address = (DWORD)addr;
hp.offset=stackoffset(1); hp.offset=stackoffset(1);

View File

@ -11,7 +11,7 @@ bool Speed::attach_function() {
BYTE sig4[]={ 0xFF,0xD6 }; BYTE sig4[]={ 0xFF,0xD6 };
for(auto p:std::vector<std::pair<BYTE*,int>>{{sig1,sizeof(sig1)},{sig2,sizeof(sig2)},{sig3,sizeof(sig3)},{sig4,sizeof(sig4)}}){ for(auto p:std::vector<std::pair<BYTE*,int>>{{sig1,sizeof(sig1)},{sig2,sizeof(sig2)},{sig3,sizeof(sig3)},{sig4,sizeof(sig4)}}){
addr=MemDbg::findBytes(p.first, p.second, addr, addr+0x40); addr=MemDbg::findBytes(p.first, p.second, addr, addr+0x40);
if(addr==0)return false; if(!addr)return false;
} }
addr = MemDbg::findEnclosingAlignedFunction(addr); addr = MemDbg::findEnclosingAlignedFunction(addr);
if (addr == 0)return false; if (addr == 0)return false;

View File

@ -10,7 +10,7 @@ bool TSSystem::attach_function() {
auto addrs = Util::SearchMemory(bytes, sizeof(bytes), PAGE_EXECUTE, processStartAddress, processStopAddress); auto addrs = Util::SearchMemory(bytes, sizeof(bytes), PAGE_EXECUTE, processStartAddress, processStopAddress);
for (auto addr : addrs) { for (auto addr : addrs) {
addr=MemDbg::findEnclosingAlignedFunction(addr); addr=MemDbg::findEnclosingAlignedFunction(addr);
if(addr==0)continue; if(!addr)continue;
HookParam hp; HookParam hp;
hp.address = addr; hp.address = addr;
hp.offset=stackoffset(1); hp.offset=stackoffset(1);

View File

@ -43,9 +43,9 @@ bool ransel::attach_function() {
0xe8,XX4 //SendMessageA->__imp_SendMessageA 0xe8,XX4 //SendMessageA->__imp_SendMessageA
}; };
auto addr=MemDbg::findBytes(sig,sizeof(sig),processStartAddress,processStopAddress); auto addr=MemDbg::findBytes(sig,sizeof(sig),processStartAddress,processStopAddress);
if(addr==0)return false; if(!addr)return false;
addr=findfuncstart(addr,0x20); addr=findfuncstart(addr,0x20);
if(addr==0)return false; if(!addr)return false;
HookParam hp; HookParam hp;
hp.address=addr; hp.address=addr;
hp.type=USING_STRING; hp.type=USING_STRING;

View File

@ -92,16 +92,16 @@ namespace{
BYTE sig4[]={XX,0x00,0x24,0xA0,0xFC}; BYTE sig4[]={XX,0x00,0x24,0xA0,0xFC};
addr=forwardsearch(sig1,sizeof(sig1),addr,0x20); addr=forwardsearch(sig1,sizeof(sig1),addr,0x20);
if(addr==0)continue; if(!addr)continue;
addr=forwardsearch(sig2,sizeof(sig2),addr,0x100); addr=forwardsearch(sig2,sizeof(sig2),addr,0x100);
if(addr==0)continue; if(!addr)continue;
addr=forwardsearch(sig3,sizeof(sig3),addr,0x20); addr=forwardsearch(sig3,sizeof(sig3),addr,0x20);
if(addr==0)continue; if(!addr)continue;
addr=forwardsearch(sig4,sizeof(sig4),addr,0x20); addr=forwardsearch(sig4,sizeof(sig4),addr,0x20);
if(addr==0)continue; if(!addr)continue;
auto off=andregimm((BYTE*)addrsave); auto off=andregimm((BYTE*)addrsave);
if(off==regs::invalid)continue; if(off==regs::invalid)continue;
HookParam hp; HookParam hp;
@ -164,7 +164,7 @@ namespace{
char innerHTML[]="innerHTML"; char innerHTML[]="innerHTML";
auto addr = MemDbg::findBytes(innerHTML, sizeof(innerHTML), processStartAddress, processStopAddress); auto addr = MemDbg::findBytes(innerHTML, sizeof(innerHTML), processStartAddress, processStopAddress);
ConsoleOutput("%x",addr); ConsoleOutput("%x",addr);
if(addr==0)return false; if(!addr)return false;
bool ok=false; bool ok=false;
for(auto _addr=processStartAddress+4;_addr<processStopAddress;_addr+=1){ for(auto _addr=processStartAddress+4;_addr<processStopAddress;_addr+=1){
if((_addr+*(int*)(_addr-4) )==addr){ if((_addr+*(int*)(_addr-4) )==addr){

View File

@ -19,6 +19,7 @@
#include "engine32/VALKYRIA.h" #include "engine32/VALKYRIA.h"
#include "engine32/Moonstone.h" #include "engine32/Moonstone.h"
#include "engine32/mirage.h" #include "engine32/mirage.h"
#include "engine32/RScript.h"
#include "engine32/Sprite.h" #include "engine32/Sprite.h"
#include "engine32/PONScripter.h" #include "engine32/PONScripter.h"
#include "engine32/Stronger.h" #include "engine32/Stronger.h"
@ -431,5 +432,6 @@ std::vector<ENGINE *> check_engines()
new H_do_C, new H_do_C,
new Mink3, new Mink3,
new FrontWing2, new FrontWing2,
new RScript,
}; };
} }