memmod: fix import loading function usage
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									c9fabbd5bf
								
							
						
					
					
						commit
						b6303091fc
					
				
					 5 changed files with 10 additions and 32 deletions
				
			
		
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							|  | @ -3,7 +3,7 @@ module golang.zx2c4.com/wireguard | ||||||
| go 1.13 | go 1.13 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 | 	golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 | ||||||
| 	golang.org/x/net v0.0.0-20201110031124-69a78807bb2b | 	golang.org/x/net v0.0.0-20201110031124-69a78807bb2b | ||||||
| 	golang.org/x/sys v0.0.0-20201117222635-ba5294a509c7 | 	golang.org/x/sys v0.0.0-20201126233918-771906719818 | ||||||
| ) | ) | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.sum
									
									
									
									
									
								
							|  | @ -1,7 +1,7 @@ | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 h1:phUcVbl53swtrUN8kQEXFhUxPlIlWyBfKmidCu7P95o= | golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= | ||||||
| golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||||
| golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= | ||||||
| golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||||
|  | @ -9,8 +9,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h | ||||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20201117222635-ba5294a509c7 h1:s330+6z/Ko3J0o6rvOcwXe5nzs7UT9tLKHoOXYn6uE0= | golang.org/x/sys v0.0.0-20201126233918-771906719818 h1:f1CIuDlJhwANEC2MM87MBEVMr3jl5bifgsfj90XAF9c= | ||||||
| golang.org/x/sys v0.0.0-20201117222635-ba5294a509c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | ||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
|  |  | ||||||
|  | @ -313,7 +313,7 @@ func (module *Module) buildImportTable() error { | ||||||
| 	module.modules = make([]windows.Handle, 0, 16) | 	module.modules = make([]windows.Handle, 0, 16) | ||||||
| 	importDesc := (*IMAGE_IMPORT_DESCRIPTOR)(a2p(module.codeBase + uintptr(directory.VirtualAddress))) | 	importDesc := (*IMAGE_IMPORT_DESCRIPTOR)(a2p(module.codeBase + uintptr(directory.VirtualAddress))) | ||||||
| 	for !isBadReadPtr(uintptr(unsafe.Pointer(importDesc)), unsafe.Sizeof(*importDesc)) && importDesc.Name != 0 { | 	for !isBadReadPtr(uintptr(unsafe.Pointer(importDesc)), unsafe.Sizeof(*importDesc)) && importDesc.Name != 0 { | ||||||
| 		handle, err := loadLibraryA((*byte)(a2p(module.codeBase + uintptr(importDesc.Name)))) | 		handle, err := windows.LoadLibraryEx(windows.BytePtrToString((*byte)(a2p(module.codeBase + uintptr(importDesc.Name)))), 0, windows.LOAD_LIBRARY_SEARCH_SYSTEM32) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("Error loading module: %w", err) | 			return fmt.Errorf("Error loading module: %w", err) | ||||||
| 		} | 		} | ||||||
|  | @ -328,10 +328,10 @@ func (module *Module) buildImportTable() error { | ||||||
| 		} | 		} | ||||||
| 		for *thunkRef != 0 { | 		for *thunkRef != 0 { | ||||||
| 			if IMAGE_SNAP_BY_ORDINAL(*thunkRef) { | 			if IMAGE_SNAP_BY_ORDINAL(*thunkRef) { | ||||||
| 				*funcRef, err = getProcAddress(handle, (*byte)(a2p(IMAGE_ORDINAL(*thunkRef)))) | 				*funcRef, err = windows.GetProcAddressByOrdinal(handle, IMAGE_ORDINAL(*thunkRef)) | ||||||
| 			} else { | 			} else { | ||||||
| 				thunkData := (*IMAGE_IMPORT_BY_NAME)(a2p(module.codeBase + *thunkRef)) | 				thunkData := (*IMAGE_IMPORT_BY_NAME)(a2p(module.codeBase + *thunkRef)) | ||||||
| 				*funcRef, err = getProcAddress(handle, &thunkData.Name[0]) | 				*funcRef, err = windows.GetProcAddress(handle, windows.BytePtrToString(&thunkData.Name[0])) | ||||||
| 			} | 			} | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				windows.FreeLibrary(handle) | 				windows.FreeLibrary(handle) | ||||||
|  |  | ||||||
|  | @ -324,8 +324,6 @@ const ( | ||||||
| 	DLL_PROCESS_DETACH = 0 | 	DLL_PROCESS_DETACH = 0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| //sys	loadLibraryA(libFileName *byte) (module windows.Handle, err error) = kernel32.LoadLibraryA
 |  | ||||||
| //sys	getProcAddress(module windows.Handle, procName *byte) (addr uintptr, err error) = kernel32.GetProcAddress
 |  | ||||||
| //sys	isBadReadPtr(addr uintptr, ucb uintptr) (ret bool) = kernel32.IsBadReadPtr
 | //sys	isBadReadPtr(addr uintptr, ucb uintptr) (ret bool) = kernel32.IsBadReadPtr
 | ||||||
| 
 | 
 | ||||||
| type SYSTEM_INFO struct { | type SYSTEM_INFO struct { | ||||||
|  |  | ||||||
|  | @ -40,31 +40,11 @@ func errnoErr(e syscall.Errno) error { | ||||||
| var ( | var ( | ||||||
| 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||||
| 
 | 
 | ||||||
| 	procGetProcAddress = modkernel32.NewProc("GetProcAddress") | 	procIsBadReadPtr = modkernel32.NewProc("IsBadReadPtr") | ||||||
| 	procIsBadReadPtr   = modkernel32.NewProc("IsBadReadPtr") |  | ||||||
| 	procLoadLibraryA   = modkernel32.NewProc("LoadLibraryA") |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func getProcAddress(module windows.Handle, procName *byte) (addr uintptr, err error) { |  | ||||||
| 	r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procName)), 0) |  | ||||||
| 	addr = uintptr(r0) |  | ||||||
| 	if addr == 0 { |  | ||||||
| 		err = errnoErr(e1) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func isBadReadPtr(addr uintptr, ucb uintptr) (ret bool) { | func isBadReadPtr(addr uintptr, ucb uintptr) (ret bool) { | ||||||
| 	r0, _, _ := syscall.Syscall(procIsBadReadPtr.Addr(), 2, uintptr(addr), uintptr(ucb), 0) | 	r0, _, _ := syscall.Syscall(procIsBadReadPtr.Addr(), 2, uintptr(addr), uintptr(ucb), 0) | ||||||
| 	ret = r0 != 0 | 	ret = r0 != 0 | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func loadLibraryA(libFileName *byte) (module windows.Handle, err error) { |  | ||||||
| 	r0, _, e1 := syscall.Syscall(procLoadLibraryA.Addr(), 1, uintptr(unsafe.Pointer(libFileName)), 0, 0) |  | ||||||
| 	module = windows.Handle(r0) |  | ||||||
| 	if module == 0 { |  | ||||||
| 		err = errnoErr(e1) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue