-
Notifications
You must be signed in to change notification settings - Fork 3
/
Tools.h
144 lines (117 loc) · 3.57 KB
/
Tools.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#ifndef __TOOLS_H_
#define __TOOLS_H_
#pragma once
#include <xtl.h>
#include <stdio.h>
#include <xkelib.h>
#ifdef DEVKIT
#include <xbdm.h>
#endif
typedef HRESULT (*pDmSetMemory)(LPVOID lpbAddr, DWORD cb, LPCVOID lpbBuf, LPDWORD pcbRet);
class MemoryBuffer
{
public:
MemoryBuffer( DWORD dwSize = 512 )
{
m_pBuffer = NULL;
m_dwDataLength = 0;
m_dwBufferSize = 0;
if( ( dwSize < UINT_MAX ) && ( dwSize != 0 ) )
{
m_pBuffer = ( BYTE* )malloc( dwSize + 1 ); // one more char, in case when using string funcions
if( m_pBuffer )
{
m_dwBufferSize = dwSize;
m_pBuffer[0] = 0;
}
}
};
~MemoryBuffer()
{
if( m_pBuffer )
free( m_pBuffer );
m_pBuffer = NULL;
m_dwDataLength = 0;
m_dwBufferSize = 0;
};
// Add chunk of memory to buffer
BOOL Add( const void* p, DWORD dwSize )
{
if( CheckSize( dwSize ) )
{
memcpy( m_pBuffer + m_dwDataLength, p, dwSize );
m_dwDataLength += dwSize;
*( m_pBuffer + m_dwDataLength ) = 0; // fill end zero
return TRUE;
}
else
{
return FALSE;
}
};
// Get the data in buffer
BYTE* GetData() const
{
return m_pBuffer;
};
// Get the length of data in buffer
DWORD GetDataLength() const
{
return m_dwDataLength;
};
// Rewind the data pointer to the begining
void Rewind()
{
m_dwDataLength = 0; m_pBuffer[ 0 ] = 0;
};
// Automatically adjust increase buffer size if necessary
BOOL CheckSize( DWORD dwSize )
{
if( m_dwBufferSize >= ( m_dwDataLength + dwSize ) )
{
return TRUE; // Enough space
}
else
{
// Try to double it
DWORD dwNewSize = max( m_dwDataLength + dwSize, m_dwBufferSize * 2 );
BYTE* pNewBuffer = ( UCHAR* )realloc( m_pBuffer, dwNewSize + 1 ); // one more char
if( pNewBuffer )
{
m_pBuffer = pNewBuffer;
m_dwBufferSize = dwNewSize;
return TRUE;
}
else
{
// Failed
return FALSE;
}
}
}
private:
BYTE* m_pBuffer;
DWORD m_dwDataLength;
DWORD m_dwBufferSize;
};
VOID XNotifyUI(PWCHAR pwszStringParam);
BOOL DumpFile(CHAR *szFileName, BYTE *pbData, DWORD dwSize);
BYTE *GetFile(CHAR *szPath, PDWORD pdwOutSize);
HRESULT SetMemory(VOID* Destination, VOID* Source, DWORD Length);
DWORD ResolveFunction(PCHAR modname, DWORD ord);
VOID PatchInJump(PDWORD addr, DWORD dest, BOOL linked);
HRESULT MountPath(const char* szDrive, const char* szDevice, BOOL both);
DWORD PatchModuleImport(CHAR* Module, CHAR* ImportedModuleName, DWORD Ordinal, DWORD PatchAddress);
DWORD PatchModuleImport(PLDR_DATA_TABLE_ENTRY Module, CHAR* ImportedModuleName, DWORD Ordinal, DWORD PatchAddress);
BOOL XeKeysPkcs1Verify(const BYTE* pbHash, const BYTE* pbSig, XECRYPT_RSA* pRsa);
BOOL CReadFile(const CHAR * FileName, MemoryBuffer &pBuffer);
BOOL CWriteFile(const CHAR* FilePath, const VOID* Data, DWORD Size);
BOOL FileExists(LPCSTR lpFileName);
HRESULT CreateSymbolicLink(CHAR* szDrive, CHAR* szDeviceName, BOOL System);
HRESULT DeleteSymbolicLink(CHAR* szDrive, BOOL System);
VOID PatchInBranch(DWORD* Address, DWORD Destination, BOOL Linked);
#ifdef DEVKIT
VOID PatchInJumpDev(DWORD addr, DWORD dest, BOOL linked);
#endif
VOID hookFunctionStartEx(...);//(Address, SaveStubAddress, Destination)
#endif