[Proxy] Cleaner interface disassembly
This commit is contained in:
parent
4c6694026b
commit
8e5446e198
@ -39,7 +39,7 @@ namespace Steam
|
|||||||
return this->methodCache[method];
|
return this->methodCache[method];
|
||||||
}
|
}
|
||||||
|
|
||||||
auto methodData = Interface::lookupMethod(method);
|
auto methodData = this->lookupMethod(method);
|
||||||
this->methodCache[method] = methodData;
|
this->methodCache[method] = methodData;
|
||||||
return methodData;
|
return methodData;
|
||||||
}
|
}
|
||||||
@ -48,16 +48,16 @@ namespace Steam
|
|||||||
{
|
{
|
||||||
if (!::Utils::Memory::IsBadReadPtr(this->interfacePtr))
|
if (!::Utils::Memory::IsBadReadPtr(this->interfacePtr))
|
||||||
{
|
{
|
||||||
unsigned char** vftbl = *static_cast<unsigned char***>(this->interfacePtr);
|
auto* vftbl = this->interfacePtr->vftbl;
|
||||||
|
|
||||||
while (!::Utils::Memory::IsBadReadPtr(vftbl) && !::Utils::Memory::IsBadCodePtr((FARPROC(*vftbl))))
|
while (!::Utils::Memory::IsBadReadPtr(vftbl) && !::Utils::Memory::IsBadCodePtr(vftbl->func))
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
uint16_t params;
|
uint16_t params;
|
||||||
|
|
||||||
if (this->getMethodData(*vftbl, &name, ¶ms) && name == method)
|
if (this->getMethodData(*vftbl, &name, ¶ms) && name == method)
|
||||||
{
|
{
|
||||||
return{ *vftbl, params };
|
return{ vftbl->data, params };
|
||||||
}
|
}
|
||||||
|
|
||||||
++vftbl;
|
++vftbl;
|
||||||
@ -67,17 +67,17 @@ namespace Steam
|
|||||||
return { nullptr, 0 };
|
return { nullptr, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Interface::getMethodData(unsigned char* methodPtr, std::string* name, uint16_t* params)
|
bool Interface::getMethodData(VInterface::VMethod method, std::string* name, uint16_t* params)
|
||||||
{
|
{
|
||||||
name->clear();
|
name->clear();
|
||||||
*params = 0;
|
*params = 0;
|
||||||
if (::Utils::Memory::IsBadCodePtr(methodPtr)) return false;
|
if (::Utils::Memory::IsBadCodePtr(method.data)) return false;
|
||||||
|
|
||||||
ud_t ud;
|
ud_t ud;
|
||||||
ud_init(&ud);
|
ud_init(&ud);
|
||||||
ud_set_mode(&ud, 32);
|
ud_set_mode(&ud, 32);
|
||||||
ud_set_pc(&ud, reinterpret_cast<uint64_t>(methodPtr));
|
ud_set_pc(&ud, method.value);
|
||||||
ud_set_input_buffer(&ud, reinterpret_cast<uint8_t*>(methodPtr), INT32_MAX);
|
ud_set_input_buffer(&ud, method.data, INT32_MAX);
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -146,7 +146,7 @@ namespace Steam
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Interface() : interfacePtr(nullptr) {}
|
Interface() : interfacePtr(nullptr) {}
|
||||||
Interface(void* _interfacePtr) : interfacePtr(_interfacePtr) {}
|
Interface(void* _interfacePtr) : interfacePtr(static_cast<VInterface*>(_interfacePtr)) {}
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
T invoke(std::string methodName, Args... args)
|
T invoke(std::string methodName, Args... args)
|
||||||
@ -195,56 +195,66 @@ namespace Steam
|
|||||||
template<std::size_t X, std::size_t ... Xs>
|
template<std::size_t X, std::size_t ... Xs>
|
||||||
struct AddSizes<X, Xs...> : std::integral_constant<std::size_t, X + ((AddSizes<Xs...>::value + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1))> {};
|
struct AddSizes<X, Xs...> : std::integral_constant<std::size_t, X + ((AddSizes<Xs...>::value + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1))> {};
|
||||||
|
|
||||||
void* interfacePtr;
|
struct VInterface
|
||||||
|
{
|
||||||
|
union VMethod
|
||||||
|
{
|
||||||
|
unsigned char* data;
|
||||||
|
unsigned int value;
|
||||||
|
FARPROC func;
|
||||||
|
}* vftbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
VInterface* interfacePtr;
|
||||||
std::unordered_map<std::string, std::pair<void*, uint16_t>> methodCache;
|
std::unordered_map<std::string, std::pair<void*, uint16_t>> methodCache;
|
||||||
std::pair<void*, uint16_t> getMethod(std::string method);
|
std::pair<void*, uint16_t> getMethod(std::string method);
|
||||||
std::pair<void*, uint16_t> lookupMethod(std::string method);
|
std::pair<void*, uint16_t> lookupMethod(std::string method);
|
||||||
bool getMethodData(unsigned char* methodPtr, std::string* name, uint16_t* params);
|
bool getMethodData(VInterface::VMethod method, std::string* name, uint16_t* params);
|
||||||
};
|
};
|
||||||
|
|
||||||
class KeyValuesBuilder
|
class KeyValuesBuilder
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::stringstream m_buffer;
|
std::string buffer;
|
||||||
|
|
||||||
inline void packBytes(const void* bytes, size_t size)
|
inline void packBytes(const void* bytes, size_t size)
|
||||||
{
|
{
|
||||||
m_buffer << std::string(reinterpret_cast<const char*>(bytes), size);
|
this->buffer.append(reinterpret_cast<const char*>(bytes), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void packDataType(uint8_t type)
|
inline void packDataType(uint8_t type)
|
||||||
{
|
{
|
||||||
packBytes(&type, 1);
|
this->packBytes(&type, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void packNullTerminated(const char* string)
|
inline void packNullTerminated(const char* string)
|
||||||
{
|
{
|
||||||
packBytes(string, strlen(string) + 1);
|
this->packBytes(string, strlen(string) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline void packString(const char* key, const char* value)
|
inline void packString(const char* key, const char* value)
|
||||||
{
|
{
|
||||||
packDataType(1);
|
this->packDataType(1);
|
||||||
packNullTerminated(key);
|
this->packNullTerminated(key);
|
||||||
packNullTerminated(value);
|
this->packNullTerminated(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void packUint64(const char* key, uint64_t value)
|
inline void packUint64(const char* key, uint64_t value)
|
||||||
{
|
{
|
||||||
packDataType(7);
|
this->packDataType(7);
|
||||||
packNullTerminated(key);
|
this->packNullTerminated(key);
|
||||||
packBytes(&value, sizeof(value));
|
this->packBytes(&value, sizeof(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void packEnd()
|
inline void packEnd()
|
||||||
{
|
{
|
||||||
packDataType(8);
|
this->packDataType(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string getString()
|
inline std::string getString()
|
||||||
{
|
{
|
||||||
return m_buffer.str();
|
return this->buffer;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user