optimize dll injection and fix memory leaks
- use ZeroMemory where applicable - fixed a couple memory leaks - optimized dll injection (before it would allocate+write MAX_PATH*sizeof(TCHAR) bytes to svchost.exe, now it will only allocate+write what is needed to fit the dll path)
This commit is contained in:
@@ -22,6 +22,7 @@ DWORD WINAPI NewThreadProc(LPVOID lpParam) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECURITY_ATTRIBUTES sa;
|
SECURITY_ATTRIBUTES sa;
|
||||||
|
ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
|
||||||
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
ConvertStringSecurityDescriptorToSecurityDescriptor(_T("D:PAI(A;;FA;;;BA)"), SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL);
|
ConvertStringSecurityDescriptorToSecurityDescriptor(_T("D:PAI(A;;FA;;;BA)"), SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL);
|
||||||
sa.bInheritHandle = FALSE;
|
sa.bInheritHandle = FALSE;
|
||||||
|
@@ -63,6 +63,7 @@ SIZE_T patternfind(LPCBYTE data, SIZE_T datasize, SIZE_T startindex, LPCSTR patt
|
|||||||
SIZE_T result = -1;
|
SIZE_T result = -1;
|
||||||
SIZE_T searchpatternsize = strlen(pattern);
|
SIZE_T searchpatternsize = strlen(pattern);
|
||||||
LPPATTERNBYTE searchpattern = calloc(searchpatternsize, sizeof(PATTERNBYTE));
|
LPPATTERNBYTE searchpattern = calloc(searchpatternsize, sizeof(PATTERNBYTE));
|
||||||
|
|
||||||
if (patterntransform(pattern, searchpattern, &searchpatternsize)) {
|
if (patterntransform(pattern, searchpattern, &searchpatternsize)) {
|
||||||
for (SIZE_T i = startindex, j = 0; i < datasize; i++) //search for the pattern
|
for (SIZE_T i = startindex, j = 0; i < datasize; i++) //search for the pattern
|
||||||
{
|
{
|
||||||
@@ -79,6 +80,7 @@ SIZE_T patternfind(LPCBYTE data, SIZE_T datasize, SIZE_T startindex, LPCSTR patt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(searchpattern);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,12 +102,12 @@ VOID patternwrite(LPBYTE data, SIZE_T datasize, LPCSTR pattern) {
|
|||||||
writepatternsize = datasize;
|
writepatternsize = datasize;
|
||||||
}
|
}
|
||||||
LPPATTERNBYTE writepattern = calloc(writepatternsize, sizeof(PATTERNBYTE));
|
LPPATTERNBYTE writepattern = calloc(writepatternsize, sizeof(PATTERNBYTE));
|
||||||
if (!patterntransform(pattern, writepattern, &writepatternsize)) {
|
if (patterntransform(pattern, writepattern, &writepatternsize)) {
|
||||||
return;
|
for (size_t i = 0; i < writepatternsize; i++) {
|
||||||
}
|
patternwritebyte(&data[i], &writepattern[i]);
|
||||||
for (size_t i = 0; i < writepatternsize; i++) {
|
}
|
||||||
patternwritebyte(&data[i], &writepattern[i]);
|
|
||||||
}
|
}
|
||||||
|
free(writepattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
SIZE_T patternsnr(LPBYTE data, SIZE_T datasize, SIZE_T startindex, LPCSTR searchpattern, LPCSTR replacepattern) {
|
SIZE_T patternsnr(LPBYTE data, SIZE_T datasize, SIZE_T startindex, LPCSTR searchpattern, LPCSTR replacepattern) {
|
||||||
|
@@ -50,15 +50,19 @@ void CALLBACK Rundll32Entry(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int n
|
|||||||
if (!result) {
|
if (!result) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TCHAR lpLibFileName[MAX_PATH];
|
|
||||||
GetModuleFileName(HINST_THISCOMPONENT, lpLibFileName, _countof(lpLibFileName));
|
|
||||||
|
|
||||||
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
|
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
|
||||||
if (!hProcess) {
|
if (!hProcess) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, sizeof(lpLibFileName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
|
||||||
if (lpBaseAddress && WriteProcessMemory(hProcess, lpBaseAddress, lpLibFileName, sizeof(lpLibFileName), NULL)) {
|
TCHAR lpLibFileName[MAX_PATH];
|
||||||
|
GetModuleFileName(HINST_THISCOMPONENT, lpLibFileName, _countof(lpLibFileName));
|
||||||
|
|
||||||
|
SIZE_T size = (_tcslen(lpLibFileName) + 1) * sizeof(TCHAR);
|
||||||
|
|
||||||
|
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||||
|
if (lpBaseAddress && WriteProcessMemory(hProcess, lpBaseAddress, lpLibFileName, size, NULL)) {
|
||||||
|
|
||||||
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
|
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
|
||||||
(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"),
|
(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"),
|
||||||
|
@@ -55,6 +55,7 @@ VOID DetourIAT(HMODULE hModule, LPSTR lpFuncName, LPVOID *lpOldAddress, LPVOID l
|
|||||||
VOID SuspendProcessThreads(DWORD dwProcessId, DWORD dwThreadId, HANDLE *lphThreads, SIZE_T dwSize, SIZE_T *lpcb) {
|
VOID SuspendProcessThreads(DWORD dwProcessId, DWORD dwThreadId, HANDLE *lphThreads, SIZE_T dwSize, SIZE_T *lpcb) {
|
||||||
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
||||||
THREADENTRY32 te;
|
THREADENTRY32 te;
|
||||||
|
ZeroMemory(&te, sizeof(THREADENTRY32));
|
||||||
te.dwSize = sizeof(te);
|
te.dwSize = sizeof(te);
|
||||||
Thread32First(hSnap, &te);
|
Thread32First(hSnap, &te);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user