82 lines
2.7 KiB
C++
Raw Normal View History

2024-02-07 20:59:24 +08:00
#include"Circus1.h"
/********************************************************************************************
CIRCUS hook:
Game folder contains advdata folder. Used by CIRCUS games.
Usually has font caching issues. But trace back from GetGlyphOutline gives a hook
which generate repetition.
If we study circus engine follow Freaka's video, we can easily discover that
in the game main module there is a static buffer, which is filled by new text before
it's drawing to screen. By setting a hardware breakpoint there we can locate the
function filling the buffer. But we don't have to set hardware breakpoint to search
the hook address if we know some characteristic instruction(cmp al,0x24) around there.
********************************************************************************************/
bool InsertCircusHook1() // jichi 10/2/2013: Change return type to bool
{
for (DWORD i = processStartAddress + 0x1000; i < processStopAddress - 4; i++)
if (*(WORD *)i == 0xa3c) //cmp al, 0xA; je
for (DWORD j = i; j < i + 0x100; j++) {
BYTE c = *(BYTE *)j;
if (c == 0xc3)
break;
if (c == 0xe8) {
DWORD k = *(DWORD *)(j+1)+j+5;
if (k > processStartAddress && k < processStopAddress) {
HookParam hp;
hp.address = k;
hp.offset=get_stack(3);
hp.split =get_reg(regs::esp);
hp.type = DATA_INDIRECT|USING_SPLIT;
ConsoleOutput("INSERT CIRCUS#1");
//RegisterEngineType(ENGINE_CIRCUS);
return NewHook(hp, "Circus1");
}
}
}
//break;
//ConsoleOutput("Unknown CIRCUS engine");
ConsoleOutput("CIRCUS1: failed");
return false;
}
2024-04-23 16:01:23 +08:00
namespace{
//C.D.C.D.2シーディーシーディー2
//https://vndb.org/v947
bool circus12()
{
BYTE sig[]={
0x3C,0x24,
0x0F,0x85,XX4,
0x8A,0x47,0x01,
0x47,
0x3C,0x6E,
0x75,XX,
0xA0,XX4,
0xB9,XX4,
0x84,0xC0,
0x0F,0x84,XX4,
0x88,0x06,
0x8A,0x41,0x01,
0x46,
0x41,
0x84,0xC0,
0x75,XX,
0xE9,XX4,
0x3C,0x66,
0x75,XX
};
auto addr=MemDbg::findBytes(sig,sizeof(sig),processStartAddress,processStopAddress);
if(!addr)return false;
addr=MemDbg::findEnclosingAlignedFunction(addr,0x40);
if(!addr)return false;
HookParam hp;
hp.address =addr;
hp.offset=get_stack(2);
hp.type = USING_STRING|EMBED_ABLE|EMBED_AFTER_NEW|EMBED_BEFORE_SIMPLE|EMBED_DYNA_SJIS;
hp.hook_font=F_GetGlyphOutlineA;
return NewHook(hp, "Circus1");
}
}
2024-02-07 20:59:24 +08:00
bool Circus1::attach_function() {
2024-04-23 16:01:23 +08:00
return InsertCircusHook1()|circus12();
2024-02-07 20:59:24 +08:00
}