fix in memory usage

This commit is contained in:
KingKDot
2026-07-13 12:10:28 -05:00
parent 6d1a20206d
commit bbb9fb68e2
@@ -61,6 +61,7 @@ const (
TOKEN_ADJUST_PRIVILEGES = 0x0020 TOKEN_ADJUST_PRIVILEGES = 0x0020
TOKEN_QUERY = 0x0008 TOKEN_QUERY = 0x0008
TOKEN_DUPLICATE = 0x0002
SE_PRIVILEGE_ENABLED = 0x00000002 SE_PRIVILEGE_ENABLED = 0x00000002
CREATE_SUSPENDED = 0x00000004 CREATE_SUSPENDED = 0x00000004
@@ -1197,22 +1198,38 @@ func createSuspendedProcessOnDesktop(filePath, searchPath, replacePath, shmName
} }
func buildEnvironmentBlock(searchPath, replacePath, shmName string, dllSize int) ([]uint16, error) { func buildEnvironmentBlock(searchPath, replacePath, shmName string, dllSize int) ([]uint16, error) {
rawPtr, err := windows.GetEnvironmentStrings() var rawData []uint16
if err != nil { var cleanup func()
return nil, fmt.Errorf("GetEnvironmentStrings: %w", err)
}
defer windows.FreeEnvironmentStrings(rawPtr)
rawSlice := (*[1 << 20]uint16)(unsafe.Pointer(rawPtr))[:] var token windows.Token
blockLen := 0 err := windows.OpenProcessToken(windows.CurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &token)
for i := 0; ; i++ { if err == nil {
if rawSlice[i] == 0 && i > 0 && rawSlice[i-1] == 0 { var envBlock *uint16
blockLen = i + 1 if err := windows.CreateEnvironmentBlock(&envBlock, token, false); err == nil && envBlock != nil {
break if data := readRawEnvironmentBlock(envBlock); data != nil {
rawData = data
cleanup = func() { windows.DestroyEnvironmentBlock(envBlock) }
} else {
windows.DestroyEnvironmentBlock(envBlock)
}
} }
if i >= len(rawSlice)-1 { token.Close()
return nil, fmt.Errorf("environment block appears unterminated") }
if rawData == nil {
rawPtr, err := windows.GetEnvironmentStrings()
if err != nil {
return nil, fmt.Errorf("GetEnvironmentStrings: %w", err)
} }
rawData = readRawEnvironmentBlock(rawPtr)
cleanup = func() { windows.FreeEnvironmentStrings(rawPtr) }
}
if cleanup != nil {
defer cleanup()
}
if rawData == nil {
return nil, fmt.Errorf("failed to read environment block")
} }
extra := []string{ extra := []string{
@@ -1224,16 +1241,28 @@ func buildEnvironmentBlock(searchPath, replacePath, shmName string, dllSize int)
extra = append(extra, fmt.Sprintf("RDI_DLL_SIZE=%d", dllSize)) extra = append(extra, fmt.Sprintf("RDI_DLL_SIZE=%d", dllSize))
} }
block, err := appendEnvironmentOverrides(rawSlice[:blockLen], extra) block, err := appendEnvironmentOverrides(rawData, extra)
if err != nil { if err != nil {
return nil, err return nil, err
} }
log.Printf("backstage inject env: nativeChars=%d finalChars=%d searchRunes=%d replaceRunes=%d hasDllSection=%v dllSize=%d", log.Printf("backstage inject env: nativeChars=%d finalChars=%d searchRunes=%d replaceRunes=%d hasDllSection=%v dllSize=%d",
blockLen, len(block), len([]rune(searchPath)), len([]rune(replacePath)), shmName != "", dllSize) len(rawData), len(block), len([]rune(searchPath)), len([]rune(replacePath)), shmName != "", dllSize)
return block, nil return block, nil
} }
func readRawEnvironmentBlock(p *uint16) []uint16 {
rawSlice := unsafe.Slice(p, 1<<18)
for i := 0; ; i++ {
if rawSlice[i] == 0 && i > 0 && rawSlice[i-1] == 0 {
return rawSlice[:i+1]
}
if i >= len(rawSlice)-1 {
return nil
}
}
}
func appendEnvironmentOverrides(rawBlock []uint16, extra []string) ([]uint16, error) { func appendEnvironmentOverrides(rawBlock []uint16, extra []string) ([]uint16, error) {
entries, err := environmentBlockEntries(rawBlock) entries, err := environmentBlockEntries(rawBlock)
if err != nil { if err != nil {
@@ -1365,8 +1394,8 @@ func reflectiveInject(hProcess uintptr, dllBytes []byte) error {
if waitRet == 0xFFFFFFFF { if waitRet == 0xFFFFFFFF {
return fmt.Errorf("remote loader thread wait failed: %v", waitErr) return fmt.Errorf("remote loader thread wait failed: %v", waitErr)
} }
if exitCode >= 0xC0000000 { if exitCode == 0 {
return fmt.Errorf("remote loader thread failed: %s", describeExitCode(exitCode)) return fmt.Errorf("remote loader thread failed: VirtualAlloc returned NULL")
} }
return nil return nil