mirror of
https://github.com/HIllya51/LunaHook.git
synced 2025-01-12 21:04:00 +08:00
silkys
This commit is contained in:
parent
ec050e2274
commit
7423cd40e5
@ -222,16 +222,21 @@ static void SpecialHookSilkys(hook_stack* stack, HookParam *, uintptr_t *data,
|
|||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
enum { ShortTextCapacity = 0x10 };
|
enum
|
||||||
|
{
|
||||||
|
ShortTextCapacity = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
DWORD text = 0;
|
DWORD text = 0;
|
||||||
// if (arg2 == 0) {
|
// if (arg2 == 0) {
|
||||||
if (size >= ShortTextCapacity) {
|
if (size >= ShortTextCapacity)
|
||||||
|
{
|
||||||
text = *(DWORD *)(arg1 + 4);
|
text = *(DWORD *)(arg1 + 4);
|
||||||
if (text && ::IsBadReadPtr((LPCVOID)text, size)) // this might not be needed though
|
if (text && ::IsBadReadPtr((LPCVOID)text, size)) // this might not be needed though
|
||||||
text = 0;
|
text = 0;
|
||||||
}
|
}
|
||||||
if (!text) { // short text
|
if (!text)
|
||||||
|
{ // short text
|
||||||
text = arg1 + 4;
|
text = arg1 + 4;
|
||||||
size = min(size, ShortTextCapacity);
|
size = min(size, ShortTextCapacity);
|
||||||
}
|
}
|
||||||
@ -257,7 +262,8 @@ static void SpecialHookSilkys(hook_stack* stack, HookParam *, uintptr_t *data,
|
|||||||
}
|
}
|
||||||
TextUnionA *arg_,
|
TextUnionA *arg_,
|
||||||
argValue_;
|
argValue_;
|
||||||
void hookafter1(hook_stack*s,void* data1, size_t len){
|
void hookafter1(hook_stack *s, void *data1, size_t len)
|
||||||
|
{
|
||||||
auto newData = std::string((char *)data1, len);
|
auto newData = std::string((char *)data1, len);
|
||||||
auto arg = (TextUnionA *)(s->stack[0] + sizeof(DWORD)); // arg1
|
auto arg = (TextUnionA *)(s->stack[0] + sizeof(DWORD)); // arg1
|
||||||
arg_ = arg;
|
arg_ = arg;
|
||||||
@ -269,7 +275,8 @@ static void SpecialHookSilkys(hook_stack* stack, HookParam *, uintptr_t *data,
|
|||||||
|
|
||||||
bool hookAfter(hook_stack *s, void *data1, size_t *len, uintptr_t *role)
|
bool hookAfter(hook_stack *s, void *data1, size_t *len, uintptr_t *role)
|
||||||
{
|
{
|
||||||
if (arg_) {
|
if (arg_)
|
||||||
|
{
|
||||||
*arg_ = argValue_;
|
*arg_ = argValue_;
|
||||||
arg_ = nullptr;
|
arg_ = nullptr;
|
||||||
}
|
}
|
||||||
@ -282,13 +289,15 @@ bool InsertSilkysHook()
|
|||||||
0x39, 0x47, 0x14 // 00a1a066 3947 14 cmp dword ptr ds:[edi+0x14],eax
|
0x39, 0x47, 0x14 // 00a1a066 3947 14 cmp dword ptr ds:[edi+0x14],eax
|
||||||
};
|
};
|
||||||
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
||||||
if (!addr) {
|
if (!addr)
|
||||||
|
{
|
||||||
ConsoleOutput("Silkys: pattern not found");
|
ConsoleOutput("Silkys: pattern not found");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = MemDbg::findEnclosingAlignedFunction(addr);
|
addr = MemDbg::findEnclosingAlignedFunction(addr);
|
||||||
if (!addr) {
|
if (!addr)
|
||||||
|
{
|
||||||
ConsoleOutput("Silkys: function not found");
|
ConsoleOutput("Silkys: function not found");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -300,7 +309,8 @@ bool InsertSilkysHook()
|
|||||||
|
|
||||||
ConsoleOutput("INSERT Silkys");
|
ConsoleOutput("INSERT Silkys");
|
||||||
auto succ = NewHook(hp, "SilkysPlus");
|
auto succ = NewHook(hp, "SilkysPlus");
|
||||||
auto fun = [](ULONG addr) -> bool {
|
auto fun = [](ULONG addr) -> bool
|
||||||
|
{
|
||||||
auto succ_ = false;
|
auto succ_ = false;
|
||||||
{
|
{
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
@ -327,38 +337,43 @@ bool InsertSilkysHook2()
|
|||||||
{
|
{
|
||||||
//[230825] [コンフィチュールソフト] ギャル×オタ ~織川きららはお世話したい~
|
//[230825] [コンフィチュールソフト] ギャル×オタ ~織川きららはお世話したい~
|
||||||
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)GetCharacterPlacementW, processStartAddress, processStopAddress);
|
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)GetCharacterPlacementW, processStartAddress, processStopAddress);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
BYTE sig[] = {
|
BYTE sig[] = {
|
||||||
0x8b, 0x80, XX4,
|
0x8b, 0x80, XX4,
|
||||||
0xff, 0xd0,
|
0xff, 0xd0,
|
||||||
0x8b,0xf0
|
0x8b, 0xf0};
|
||||||
};
|
|
||||||
addr = MemDbg::findBytes(sig, sizeof(sig), addr, addr + 0x100);
|
addr = MemDbg::findBytes(sig, sizeof(sig), addr, addr + 0x100);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr + 8;
|
hp.address = addr + 8;
|
||||||
hp.type = CODEC_UTF16 | USING_STRING;
|
hp.type = CODEC_UTF16 | USING_STRING;
|
||||||
hp.offset = get_reg(regs::eax);
|
hp.offset = get_reg(regs::eax);
|
||||||
hp.filter_fun=[](void* data, size_t* len, HookParam* hp){
|
hp.filter_fun = [](void *data, size_t *len, HookParam *hp)
|
||||||
|
{
|
||||||
static int idx = 0;
|
static int idx = 0;
|
||||||
idx += 1;
|
idx += 1;
|
||||||
return (bool)(idx % 2);
|
return (bool)(idx % 2);
|
||||||
};
|
};
|
||||||
return NewHook(hp, "SilkysPlus2");
|
return NewHook(hp, "SilkysPlus2");
|
||||||
}
|
}
|
||||||
namespace{
|
namespace
|
||||||
bool _s(){
|
{
|
||||||
|
bool _s()
|
||||||
|
{
|
||||||
/// https://vndb.org/r68491
|
/// https://vndb.org/r68491
|
||||||
// 徒花異譚 / Adabana Odd Tales
|
// 徒花異譚 / Adabana Odd Tales
|
||||||
BYTE sig[] = {
|
BYTE sig[] = {
|
||||||
0xBA, 0x00, 0x01, 0x00, 0x00,
|
0xBA, 0x00, 0x01, 0x00, 0x00,
|
||||||
0xC7, 0x45, 0x08, 0x14, 0x20, 0x00, 0x00,
|
0xC7, 0x45, 0x08, 0x14, 0x20, 0x00, 0x00,
|
||||||
0x8D,0x49,0x00
|
0x8D, 0x49, 0x00};
|
||||||
};
|
|
||||||
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 == 0)
|
||||||
|
return false;
|
||||||
addr = findfuncstart(addr);
|
addr = findfuncstart(addr);
|
||||||
if (!addr) return 0;
|
if (!addr)
|
||||||
|
return 0;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.offset = get_stack(1);
|
hp.offset = get_stack(1);
|
||||||
@ -367,7 +382,8 @@ namespace{
|
|||||||
return NewHook(hp, "EmbedSilkysX");
|
return NewHook(hp, "EmbedSilkysX");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace{
|
namespace
|
||||||
|
{
|
||||||
bool Silkys2Filter(LPVOID data, size_t *size, HookParam *)
|
bool Silkys2Filter(LPVOID data, size_t *size, HookParam *)
|
||||||
{
|
{
|
||||||
auto text = reinterpret_cast<LPWSTR>(data);
|
auto text = reinterpret_cast<LPWSTR>(data);
|
||||||
@ -385,19 +401,19 @@ bool InsertSilkys2Hook()
|
|||||||
const BYTE bytes[] = {
|
const BYTE bytes[] = {
|
||||||
// (unsigned __int16)v13 < 0x100u || (_WORD)v13 == 8212
|
// (unsigned __int16)v13 < 0x100u || (_WORD)v13 == 8212
|
||||||
0xC7, 0x45, XX, 0x00, 0x01, 0x00, 0x00,
|
0xC7, 0x45, XX, 0x00, 0x01, 0x00, 0x00,
|
||||||
0xC7,0x45,XX,0x14,0x20,0x00,0x00
|
0xC7, 0x45, XX, 0x14, 0x20, 0x00, 0x00};
|
||||||
};
|
|
||||||
const BYTE bytes2[] = {
|
const BYTE bytes2[] = {
|
||||||
// v6 = (_WORD *)(*v8 + *(_DWORD *)(v7 + 4 * v27));
|
// v6 = (_WORD *)(*v8 + *(_DWORD *)(v7 + 4 * v27));
|
||||||
// hook v6
|
// hook v6
|
||||||
0x8b, 0x4d, 0xf4,
|
0x8b, 0x4d, 0xf4,
|
||||||
0x8b, 0x3c, 0x8f,
|
0x8b, 0x3c, 0x8f,
|
||||||
0x03,0x38
|
0x03, 0x38};
|
||||||
};
|
|
||||||
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
||||||
if (!addr) return false;
|
if (!addr)
|
||||||
|
return false;
|
||||||
addr = reverseFindBytes(bytes2, sizeof(bytes2), addr - 0x100, addr);
|
addr = reverseFindBytes(bytes2, sizeof(bytes2), addr - 0x100, addr);
|
||||||
if (!addr) return false;
|
if (!addr)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr + sizeof(bytes2);
|
hp.address = addr + sizeof(bytes2);
|
||||||
hp.offset = get_reg(regs::edi);
|
hp.offset = get_reg(regs::edi);
|
||||||
@ -406,23 +422,30 @@ bool InsertSilkys2Hook()
|
|||||||
return NewHook(hp, "Silkys2");
|
return NewHook(hp, "Silkys2");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace{
|
namespace
|
||||||
bool saiminset(){
|
{
|
||||||
|
bool saiminset()
|
||||||
|
{
|
||||||
//[230929][1237052][シルキーズSAKURA] 催眠奪女Set パッケージ版
|
//[230929][1237052][シルキーズSAKURA] 催眠奪女Set パッケージ版
|
||||||
auto addr1 = finddllfunctioncall((DWORD)GetGlyphOutlineA, processStartAddress, processStopAddress);
|
auto addr1 = finddllfunctioncall((DWORD)GetGlyphOutlineA, processStartAddress, processStopAddress);
|
||||||
if(addr1==0)return false;
|
if (addr1 == 0)
|
||||||
|
return false;
|
||||||
auto func1 = MemDbg::findEnclosingAlignedFunction(addr1);
|
auto func1 = MemDbg::findEnclosingAlignedFunction(addr1);
|
||||||
if(func1==0)return false;
|
if (func1 == 0)
|
||||||
|
return false;
|
||||||
BYTE check[] = {
|
BYTE check[] = {
|
||||||
0x80, 0xf9, 0x81, XX2, // cmp cl, 81h
|
0x80, 0xf9, 0x81, XX2, // cmp cl, 81h
|
||||||
0x80, 0xf9, 0x9f, XX2, // cmp cl, 9Fh
|
0x80, 0xf9, 0x9f, XX2, // cmp cl, 9Fh
|
||||||
};
|
};
|
||||||
if(MemDbg::findBytes(check,sizeof(check),func1,addr1)==0)return false;
|
if (MemDbg::findBytes(check, sizeof(check), func1, addr1) == 0)
|
||||||
|
return false;
|
||||||
auto xrefs = findxref_reverse_checkcallop(func1, processStartAddress, processStopAddress, 0xe8);
|
auto xrefs = findxref_reverse_checkcallop(func1, processStartAddress, processStopAddress, 0xe8);
|
||||||
if(xrefs.size()==0)return false;
|
if (xrefs.size() == 0)
|
||||||
|
return false;
|
||||||
auto addr2 = xrefs[0];
|
auto addr2 = xrefs[0];
|
||||||
auto addr = MemDbg::findEnclosingAlignedFunction(addr2);
|
auto addr = MemDbg::findEnclosingAlignedFunction(addr2);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.offset = get_stack(1);
|
hp.offset = get_stack(1);
|
||||||
@ -432,19 +455,22 @@ namespace{
|
|||||||
return NewHook(hp, "Silkys3");
|
return NewHook(hp, "Silkys3");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace{
|
namespace
|
||||||
|
{
|
||||||
// 言の葉舞い散る夏の風鈴
|
// 言の葉舞い散る夏の風鈴
|
||||||
// https://vndb.org/v23466
|
// https://vndb.org/v23466
|
||||||
bool silkys4(){
|
bool silkys4()
|
||||||
|
{
|
||||||
BYTE check[] = {
|
BYTE check[] = {
|
||||||
0x80, 0xFA, 0x81,
|
0x80, 0xFA, 0x81,
|
||||||
0x72, XX,
|
0x72, XX,
|
||||||
0x80, 0xFA, 0x9F,
|
0x80, 0xFA, 0x9F,
|
||||||
0x76,XX
|
0x76, XX};
|
||||||
};
|
|
||||||
auto addr = MemDbg::findCallerAddress((ULONG)GetGlyphOutlineA, 0xec8b55, processStartAddress, processStopAddress);
|
auto addr = MemDbg::findCallerAddress((ULONG)GetGlyphOutlineA, 0xec8b55, processStartAddress, processStopAddress);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
if(MemDbg::findBytes(check,sizeof(check),addr,addr+0x100)==0)return false;
|
return false;
|
||||||
|
if (MemDbg::findBytes(check, sizeof(check), addr, addr + 0x100) == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.type = USING_CHAR | DATA_INDIRECT | USING_SPLIT;
|
hp.type = USING_CHAR | DATA_INDIRECT | USING_SPLIT;
|
||||||
@ -458,9 +484,12 @@ namespace{
|
|||||||
return NewHook(hp, "Silkys4");
|
return NewHook(hp, "Silkys4");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace{
|
namespace
|
||||||
|
{
|
||||||
//[240531][1274293][シルキーズSAKURA] 淫魔淫姦 ~触手と合体して思い通りにやり返す~ DL版
|
//[240531][1274293][シルキーズSAKURA] 淫魔淫姦 ~触手と合体して思い通りにやり返す~ DL版
|
||||||
bool silkys5(){
|
bool silkys5()
|
||||||
|
{
|
||||||
|
// clang-format off
|
||||||
BYTE sig[]={
|
BYTE sig[]={
|
||||||
0xff,0xd0,//call eax
|
0xff,0xd0,//call eax
|
||||||
//<-- eax
|
//<-- eax
|
||||||
@ -472,8 +501,10 @@ namespace{
|
|||||||
0x8b,0x11,
|
0x8b,0x11,
|
||||||
0x6a,0,
|
0x6a,0,
|
||||||
};
|
};
|
||||||
|
// clang-format on
|
||||||
auto addr = MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress);
|
auto addr = MemDbg::findBytes(sig, sizeof(sig), processStartAddress, processStopAddress);
|
||||||
if (!addr) return false;
|
if (!addr)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr + 2;
|
hp.address = addr + 2;
|
||||||
hp.type = USING_CHAR | DATA_INDIRECT | CODEC_UTF16;
|
hp.type = USING_CHAR | DATA_INDIRECT | CODEC_UTF16;
|
||||||
@ -486,16 +517,18 @@ namespace{
|
|||||||
return NewHook(hp, "silkys5");
|
return NewHook(hp, "silkys5");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool Silkys::attach_function() {
|
bool Silkys::attach_function()
|
||||||
|
{
|
||||||
auto b1 = InsertSilkys2Hook();
|
auto b1 = InsertSilkys2Hook();
|
||||||
return InsertSilkysHook() || InsertSilkysHook2() || _s() || b1 || saiminset() || silkys4() || silkys5();
|
return InsertSilkysHook() || InsertSilkysHook2() || _s() || b1 || saiminset() || silkys4() || silkys5();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SilkysOld::attach_function()
|
||||||
bool SilkysOld::attach_function(){
|
{
|
||||||
// 愛姉妹・蕾…汚してください
|
// 愛姉妹・蕾…汚してください
|
||||||
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)TextOutA, processStartAddress, processStopAddress);
|
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)TextOutA, processStartAddress, processStopAddress);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.offset = get_stack(3);
|
hp.offset = get_stack(3);
|
||||||
@ -503,8 +536,8 @@ bool SilkysOld::attach_function(){
|
|||||||
return NewHook(hp, "SilkysOld");
|
return NewHook(hp, "SilkysOld");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Siglusold::attach_function()
|
||||||
bool Siglusold::attach_function(){
|
{
|
||||||
// 女系家族
|
// 女系家族
|
||||||
// https://vndb.org/v5650
|
// https://vndb.org/v5650
|
||||||
// int __cdecl sub_410C20(char *a1, _DWORD *a2)
|
// int __cdecl sub_410C20(char *a1, _DWORD *a2)
|
||||||
@ -535,41 +568,55 @@ bool Siglusold::attach_function(){
|
|||||||
// if ( v2 < 0xFC40u || v2 > 0xFC4Bu )
|
// if ( v2 < 0xFC40u || v2 > 0xFC4Bu )
|
||||||
// {
|
// {
|
||||||
BYTE bytes[] = {
|
BYTE bytes[] = {
|
||||||
0x66,XX,0x40,0x87,
|
0x66,
|
||||||
|
XX,
|
||||||
|
0x40,
|
||||||
|
0x87,
|
||||||
XX2,
|
XX2,
|
||||||
0x66,XX,0x9f,0x87,
|
0x66,
|
||||||
|
XX,
|
||||||
|
0x9f,
|
||||||
|
0x87,
|
||||||
};
|
};
|
||||||
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 == 0)
|
||||||
|
return false;
|
||||||
addr = MemDbg::findEnclosingAlignedFunction_strict(addr);
|
addr = MemDbg::findEnclosingAlignedFunction_strict(addr);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.type = USING_CHAR | DATA_INDIRECT;
|
hp.type = USING_CHAR | DATA_INDIRECT;
|
||||||
hp.offset = get_stack(1);
|
hp.offset = get_stack(1);
|
||||||
auto succ = NewHook(hp, "Siglusold_slow"); // 文本速度是慢速时这个有用,调成快速以后有无法过滤的重复
|
auto succ = NewHook(hp, "Siglusold_slow"); // 文本速度是慢速时这个有用,调成快速以后有无法过滤的重复
|
||||||
auto addrs = findxref_reverse_checkcallop(addr, addr - 0x1000, addr + 0x1000, 0xe8);
|
auto addrs = findxref_reverse_checkcallop(addr, addr - 0x1000, addr + 0x1000, 0xe8);
|
||||||
for(auto addr:addrs){
|
for (auto addr : addrs)
|
||||||
|
{
|
||||||
// 寻找调用者,速度为快速时调用者有正确的文本
|
// 寻找调用者,速度为快速时调用者有正确的文本
|
||||||
addr = MemDbg::findEnclosingAlignedFunction_strict(addr);
|
addr = MemDbg::findEnclosingAlignedFunction_strict(addr);
|
||||||
if(addr==0)continue;
|
if (addr == 0)
|
||||||
|
continue;
|
||||||
HookParam hpref;
|
HookParam hpref;
|
||||||
hpref.address = addr;
|
hpref.address = addr;
|
||||||
hpref.text_fun=[](hook_stack* stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t*len){
|
hpref.text_fun = [](hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len)
|
||||||
|
{
|
||||||
auto a2 = (DWORD *)stack->stack[2];
|
auto a2 = (DWORD *)stack->stack[2];
|
||||||
|
|
||||||
auto len1 = stack->stack[3]; // 慢速时是1
|
auto len1 = stack->stack[3]; // 慢速时是1
|
||||||
auto len2 = a2[7] - a2[6];
|
auto len2 = a2[7] - a2[6];
|
||||||
if(len1==0||len2==0)return;
|
if (len1 == 0 || len2 == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if(len1==1){//慢速
|
if (len1 == 1)
|
||||||
|
{ // 慢速
|
||||||
hp->type = USING_CHAR;
|
hp->type = USING_CHAR;
|
||||||
*data = a2[5] + a2[6];
|
*data = a2[5] + a2[6];
|
||||||
*data = *(WORD *)*data;
|
*data = *(WORD *)*data;
|
||||||
auto check = (BYTE)*data; // 换行符
|
auto check = (BYTE)*data; // 换行符
|
||||||
*len = 1 + IsDBCSLeadByteEx(932, check);
|
*len = 1 + IsDBCSLeadByteEx(932, check);
|
||||||
}
|
}
|
||||||
else{//快速&&慢速下立即显示
|
else
|
||||||
|
{ // 快速&&慢速下立即显示
|
||||||
*data = a2[5];
|
*data = a2[5];
|
||||||
*len = len1;
|
*len = len1;
|
||||||
}
|
}
|
||||||
@ -580,9 +627,11 @@ bool Siglusold::attach_function(){
|
|||||||
return succ;
|
return succ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Silkyssakura::attach_function(){
|
bool Silkyssakura::attach_function()
|
||||||
|
{
|
||||||
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)GetGlyphOutlineW, processStartAddress, processStopAddress);
|
auto addr = MemDbg::findCallerAddressAfterInt3((DWORD)GetGlyphOutlineW, processStartAddress, processStopAddress);
|
||||||
if(addr==0)return false;
|
if (addr == 0)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.offset = get_stack(3);
|
hp.offset = get_stack(3);
|
||||||
@ -590,13 +639,17 @@ bool Silkyssakura::attach_function(){
|
|||||||
hp.type = DATA_INDIRECT | USING_CHAR | USING_SPLIT | CODEC_UTF16;
|
hp.type = DATA_INDIRECT | USING_CHAR | USING_SPLIT | CODEC_UTF16;
|
||||||
|
|
||||||
auto xrefs = findxref_reverse_checkcallop(addr, processStartAddress, processStopAddress, 0xe8);
|
auto xrefs = findxref_reverse_checkcallop(addr, processStartAddress, processStopAddress, 0xe8);
|
||||||
if(xrefs.size()==1){
|
if (xrefs.size() == 1)
|
||||||
|
{
|
||||||
addr = MemDbg::findEnclosingAlignedFunction(xrefs[0]);
|
addr = MemDbg::findEnclosingAlignedFunction(xrefs[0]);
|
||||||
if(addr){
|
if (addr)
|
||||||
|
{
|
||||||
xrefs = findxref_reverse_checkcallop(addr, processStartAddress, processStopAddress, 0xe8);
|
xrefs = findxref_reverse_checkcallop(addr, processStartAddress, processStopAddress, 0xe8);
|
||||||
if(xrefs.size()==1){
|
if (xrefs.size() == 1)
|
||||||
|
{
|
||||||
addr = MemDbg::findEnclosingAlignedFunction(xrefs[0]);
|
addr = MemDbg::findEnclosingAlignedFunction(xrefs[0]);
|
||||||
if(addr){
|
if (addr)
|
||||||
|
{
|
||||||
HookParam hp_embed;
|
HookParam hp_embed;
|
||||||
hp_embed.address = addr;
|
hp_embed.address = addr;
|
||||||
hp_embed.offset = get_stack(2);
|
hp_embed.offset = get_stack(2);
|
||||||
@ -611,8 +664,45 @@ bool Silkyssakura::attach_function(){
|
|||||||
return NewHook(hp, "Silkyssakura");
|
return NewHook(hp, "Silkyssakura");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// flutter of birds II 天使たちの翼 DMM版
|
||||||
|
// EDSNHS932#-8@42650:Angel.exe √
|
||||||
|
// HS932#-8@44D90:Angel.exe
|
||||||
|
bool fob2()
|
||||||
|
{
|
||||||
|
// clang-format off
|
||||||
|
const BYTE bytes[] = {
|
||||||
|
0x53,
|
||||||
|
0x56,
|
||||||
|
0x8b,0xf1,
|
||||||
|
0x8b,0xde,
|
||||||
|
0x8d,0x4b,0x01,
|
||||||
|
0x8d,0xa4,0x24,0x00,0x00,0x00,0x00,
|
||||||
|
0x8a,0x03,
|
||||||
|
0x43,
|
||||||
|
0x84,0xc0,
|
||||||
|
0x75,XX,
|
||||||
|
0x2b,0xd9,
|
||||||
|
0xb8,0xa8,0x00,0x00,0x00,
|
||||||
|
0x3b,0xd8,
|
||||||
|
0x68,0xac,0x00,0x00,0x00,
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
||||||
|
if (!addr)
|
||||||
|
return false;
|
||||||
|
HookParam hp;
|
||||||
|
hp.address = addr;
|
||||||
|
hp.offset = get_reg(regs::ecx);
|
||||||
|
hp.newlineseperator = L"\\n";
|
||||||
|
hp.type = USING_STRING | EMBED_ABLE | EMBED_BEFORE_SIMPLE | EMBED_AFTER_NEW | EMBED_DYNA_SJIS;
|
||||||
|
return NewHook(hp, "SilkysX");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Silkysveryveryold::attach_function(){
|
bool Silkysveryveryold_attach_function()
|
||||||
|
{
|
||||||
// flutter of birds II 天使たちの翼
|
// flutter of birds II 天使たちの翼
|
||||||
// https://vndb.org/v2380
|
// https://vndb.org/v2380
|
||||||
const BYTE bytes[] = {
|
const BYTE bytes[] = {
|
||||||
@ -626,12 +716,13 @@ bool Silkysveryveryold::attach_function(){
|
|||||||
0x03, XX, XX,
|
0x03, XX, XX,
|
||||||
0x33, XX,
|
0x33, XX,
|
||||||
0x8a, XX, 0x01,
|
0x8a, XX, 0x01,
|
||||||
0x83,XX,0x6e
|
0x83, XX, 0x6e};
|
||||||
};
|
|
||||||
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
||||||
if (!addr) return false;
|
if (!addr)
|
||||||
|
return false;
|
||||||
addr = MemDbg::findEnclosingAlignedFunction(addr);
|
addr = MemDbg::findEnclosingAlignedFunction(addr);
|
||||||
if (!addr) return false;
|
if (!addr)
|
||||||
|
return false;
|
||||||
HookParam hp;
|
HookParam hp;
|
||||||
hp.address = addr;
|
hp.address = addr;
|
||||||
hp.offset = get_stack(1);
|
hp.offset = get_stack(1);
|
||||||
@ -639,3 +730,8 @@ bool Silkysveryveryold::attach_function(){
|
|||||||
hp.type = USING_STRING;
|
hp.type = USING_STRING;
|
||||||
return NewHook(hp, "SilkysX");
|
return NewHook(hp, "SilkysX");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Silkysveryveryold::attach_function()
|
||||||
|
{
|
||||||
|
return Silkysveryveryold_attach_function() || fob2();
|
||||||
|
}
|
@ -1,8 +1,10 @@
|
|||||||
|
|
||||||
|
|
||||||
class Silkys:public ENGINE{
|
class Silkys : public ENGINE
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
Silkys(){
|
Silkys()
|
||||||
|
{
|
||||||
|
|
||||||
check_by = CHECK_BY::FILE_ALL;
|
check_by = CHECK_BY::FILE_ALL;
|
||||||
check_by_target = check_by_list{L"data.arc", L"effect.arc", L"Script.arc"};
|
check_by_target = check_by_list{L"data.arc", L"effect.arc", L"Script.arc"};
|
||||||
@ -10,9 +12,11 @@ class Silkys:public ENGINE{
|
|||||||
};
|
};
|
||||||
bool attach_function();
|
bool attach_function();
|
||||||
};
|
};
|
||||||
class SilkysOld:public ENGINE{
|
class SilkysOld : public ENGINE
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
SilkysOld(){
|
SilkysOld()
|
||||||
|
{
|
||||||
|
|
||||||
check_by = CHECK_BY::FILE_ALL;
|
check_by = CHECK_BY::FILE_ALL;
|
||||||
check_by_target = check_by_list{L"bgm.AWF", L"effect.AWF", L"gcc.ARC", L"mes.ARC", L"sequence.ARC"};
|
check_by_target = check_by_list{L"bgm.AWF", L"effect.AWF", L"gcc.ARC", L"mes.ARC", L"sequence.ARC"};
|
||||||
@ -21,10 +25,11 @@ class SilkysOld:public ENGINE{
|
|||||||
bool attach_function();
|
bool attach_function();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Siglusold : public ENGINE
|
||||||
class Siglusold:public ENGINE{
|
{
|
||||||
public:
|
public:
|
||||||
Siglusold(){
|
Siglusold()
|
||||||
|
{
|
||||||
// 女系家族
|
// 女系家族
|
||||||
// https://vndb.org/v5650
|
// https://vndb.org/v5650
|
||||||
check_by = CHECK_BY::FILE_ALL;
|
check_by = CHECK_BY::FILE_ALL;
|
||||||
@ -33,10 +38,11 @@ class Siglusold:public ENGINE{
|
|||||||
bool attach_function();
|
bool attach_function();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Silkyssakura : public ENGINE
|
||||||
class Silkyssakura:public ENGINE{
|
{
|
||||||
public:
|
public:
|
||||||
Silkyssakura(){
|
Silkyssakura()
|
||||||
|
{
|
||||||
// いれかわ お姉ちゃん、ぼくの身体でオナニーしちゃうの!
|
// いれかわ お姉ちゃん、ぼくの身体でオナニーしちゃうの!
|
||||||
check_by = CHECK_BY::FILE;
|
check_by = CHECK_BY::FILE;
|
||||||
check_by_target = L"pak\\data001.pak";
|
check_by_target = L"pak\\data001.pak";
|
||||||
@ -44,13 +50,16 @@ class Silkyssakura:public ENGINE{
|
|||||||
bool attach_function();
|
bool attach_function();
|
||||||
};
|
};
|
||||||
|
|
||||||
class Silkysveryveryold:public ENGINE{
|
class Silkysveryveryold : public ENGINE
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
Silkysveryveryold(){
|
Silkysveryveryold()
|
||||||
|
{
|
||||||
// flutter of birds II 天使たちの翼
|
// flutter of birds II 天使たちの翼
|
||||||
// https://vndb.org/v2380
|
// https://vndb.org/v2380
|
||||||
check_by=CHECK_BY::FILE;
|
check_by = CHECK_BY::CUSTOM;
|
||||||
check_by_target=L"*SYS.ifl";
|
check_by_target = []()
|
||||||
|
{ return Util::CheckFile(L"*SYS.ifl") || Util::CheckFile_exits(L"ANSYS.ifl", true); }; // L"*SYS.ifl";
|
||||||
};
|
};
|
||||||
bool attach_function();
|
bool attach_function();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user