mirror of
https://github.com/HIllya51/LunaHook.git
synced 2024-11-23 13:55:36 +08:00
takeout
This commit is contained in:
parent
b28b755167
commit
34edb1bfab
@ -61,7 +61,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/version)
|
||||
include(generate_product_version)
|
||||
|
||||
set(VERSION_MAJOR 3)
|
||||
set(VERSION_MINOR 5)
|
||||
set(VERSION_MINOR 6)
|
||||
set(VERSION_PATCH 0)
|
||||
set(VERSION_REVISION 0)
|
||||
|
||||
|
@ -20,7 +20,8 @@ bool InsertEMEHook()
|
||||
// //-0x1000 as FindCallOrJmpAbs always uses an offset of 0x1000
|
||||
// c = Util::FindCallOrJmpAbs((DWORD)IsDBCSLeadByte,processStopAddress-c-0x1000+4,c-0x1000+4,false);
|
||||
//}
|
||||
if (!addr) {
|
||||
if (!addr)
|
||||
{
|
||||
ConsoleOutput("EME: pattern does not exist");
|
||||
return false;
|
||||
}
|
||||
@ -34,8 +35,92 @@ bool InsertEMEHook()
|
||||
// else ConsoleOutput("Unknown EmonEngine engine");
|
||||
return NewHook(hp, "EmonEngine");
|
||||
}
|
||||
namespace
|
||||
{
|
||||
|
||||
bool EME::attach_function() {
|
||||
// LRU template class, recv two type params: key & value
|
||||
template <typename Key>
|
||||
class LRUCache
|
||||
{
|
||||
|
||||
return InsertEMEHook();
|
||||
private:
|
||||
// cache capacity
|
||||
size_t _capacity = 0;
|
||||
// list _keys中key的指向位置
|
||||
std::unordered_map<Key, typename std::list<Key>::iterator> _cache;
|
||||
std::list<Key> _keys;
|
||||
|
||||
public:
|
||||
// construct function
|
||||
LRUCache(size_t size) : _capacity(size){};
|
||||
|
||||
bool contains(Key key)
|
||||
{
|
||||
auto it = _cache.find(key);
|
||||
if (it == _cache.end())
|
||||
{
|
||||
return false;
|
||||
}; // 返回默认值
|
||||
_keys.splice(_keys.begin(), _keys, it->second);
|
||||
return true;
|
||||
}
|
||||
|
||||
void put(Key key)
|
||||
{
|
||||
auto it = _cache.find(key);
|
||||
if (it != _cache.end())
|
||||
{
|
||||
_keys.splice(_keys.begin(), _keys, it->second);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_keys.size() == _capacity)
|
||||
{
|
||||
Key oldKey = _keys.back();
|
||||
_keys.pop_back();
|
||||
_cache.erase(oldKey);
|
||||
}
|
||||
|
||||
_keys.push_front(key);
|
||||
_cache[key] = _keys.begin();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
bool takeout()
|
||||
{
|
||||
//https://vndb.org/v6187
|
||||
//みちくさ~Loitering on the way~
|
||||
|
||||
trigger_fun = [](LPVOID addr, hook_stack *stack)
|
||||
{
|
||||
if (addr != (LPVOID)GetGlyphOutlineA)
|
||||
return false;
|
||||
auto caller = stack->retaddr;
|
||||
auto add = MemDbg::findEnclosingAlignedFunction(caller);
|
||||
if (!add)
|
||||
return true;
|
||||
HookParam hp;
|
||||
hp.address = add;
|
||||
|
||||
hp.type = USING_STRING;
|
||||
hp.offset = get_stack(4);
|
||||
hp.filter_fun = [](LPVOID data, size_t *size, HookParam *)
|
||||
{
|
||||
auto xx = std::string((char *)data, *size);
|
||||
static LRUCache<std::string> last(10);
|
||||
if (last.contains(xx))
|
||||
return false;
|
||||
last.put(xx);
|
||||
return true;
|
||||
};
|
||||
return NewHook(hp, "takeout");
|
||||
};
|
||||
return false;
|
||||
}
|
||||
}
|
||||
bool EME::attach_function()
|
||||
{
|
||||
|
||||
return InsertEMEHook() | takeout();
|
||||
}
|
Loading…
Reference in New Issue
Block a user