mirror of
https://github.com/HIllya51/LunaHook.git
synced 2024-12-25 12:44:13 +08:00
82 lines
2.7 KiB
C++
82 lines
2.7 KiB
C++
#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;
|
||
}
|
||
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");
|
||
}
|
||
}
|
||
bool Circus1::attach_function() {
|
||
|
||
return InsertCircusHook1()|circus12();
|
||
}
|