(t *testing.T)
| 409 | } |
| 410 | |
| 411 | func TestThreadFilter(t *testing.T) { |
| 412 | pars := event.Params{ |
| 413 | params.ProcessID: {Name: params.ProcessID, Type: params.PID, Value: uint32(os.Getpid())}, |
| 414 | params.ThreadID: {Name: params.ThreadID, Type: params.TID, Value: uint32(3453)}, |
| 415 | params.BasePrio: {Name: params.BasePrio, Type: params.Uint8, Value: uint8(13)}, |
| 416 | params.StartAddress: {Name: params.StartAddress, Type: params.Address, Value: uint64(140729524944768)}, |
| 417 | params.TEB: {Name: params.TEB, Type: params.Address, Value: uint64(614994620416)}, |
| 418 | params.IOPrio: {Name: params.IOPrio, Type: params.Uint8, Value: uint8(2)}, |
| 419 | params.KstackBase: {Name: params.KstackBase, Type: params.Address, Value: uint64(18446677035730165760)}, |
| 420 | params.KstackLimit: {Name: params.KstackLimit, Type: params.Address, Value: uint64(18446677035730137088)}, |
| 421 | params.PagePrio: {Name: params.PagePrio, Type: params.Uint8, Value: uint8(5)}, |
| 422 | params.UstackBase: {Name: params.UstackBase, Type: params.Address, Value: uint64(86376448)}, |
| 423 | params.UstackLimit: {Name: params.UstackLimit, Type: params.Address, Value: uint64(86372352)}, |
| 424 | params.StartAddressSymbol: {Name: params.StartAddressSymbol, Type: params.UnicodeString, Value: "LoadModule"}, |
| 425 | params.StartAddressModule: {Name: params.StartAddressModule, Type: params.UnicodeString, Value: "C:\\Windows\\System32\\kernel32.dll"}, |
| 426 | } |
| 427 | evt := &event.Event{ |
| 428 | Type: event.CreateThread, |
| 429 | Params: pars, |
| 430 | Name: "CreateThread", |
| 431 | PID: windows.GetCurrentProcessId(), |
| 432 | Category: event.Thread, |
| 433 | PS: &pstypes.PS{ |
| 434 | Name: "svchost.exe", |
| 435 | Envs: map[string]string{"ALLUSERSPROFILE": "C:\\ProgramData", "OS": "Windows_NT", "ProgramFiles(x86)": "C:\\Program Files (x86)"}, |
| 436 | Modules: []pstypes.Module{ |
| 437 | {Name: "C:\\Windows\\System32\\kernel32.dll", Size: 2312354, Checksum: 23123343, BaseAddress: va.Address(0x7ffb5c1d0396), DefaultBaseAddress: va.Address(0x7ffb5c1d0396)}, |
| 438 | {Name: "C:\\Windows\\System32\\user32.dll", Size: 32212354, Checksum: 33123343, BaseAddress: va.Address(0x7ffb313953b2), DefaultBaseAddress: va.Address(0x7ffb313953b2)}, |
| 439 | {Name: "C:\\Program Files\\JetBrains\\GoLand 2021.2.3\\jbr\\bin\\java.dll", Size: 32212354, Checksum: 33123343, BaseAddress: va.Address(0x7ffb3138592e), DefaultBaseAddress: va.Address(0x7ffb3138592e)}, |
| 440 | }, |
| 441 | }, |
| 442 | } |
| 443 | |
| 444 | // append the module signature |
| 445 | cert := &sys.Cert{Subject: "US, Washington, Redmond, Microsoft Corporation, Microsoft Windows", Issuer: "US, Washington, Redmond, Microsoft Corporation, Microsoft Windows Production PCA 2011"} |
| 446 | signature.GetSignatures().PutSignature(0x7ffb3138592e, &signature.Signature{Filename: "C:\\Program Files\\JetBrains\\GoLand 2021.2.3\\jbr\\bin\\java.dll", Level: 4, Type: 1, Cert: cert}) |
| 447 | |
| 448 | // simulate unbacked RWX frame |
| 449 | base, err := windows.VirtualAlloc(0, 1024, windows.MEM_COMMIT|windows.MEM_RESERVE, windows.PAGE_EXECUTE_READWRITE) |
| 450 | require.NoError(t, err) |
| 451 | defer func() { |
| 452 | _ = windows.VirtualFree(base, 1024, windows.MEM_DECOMMIT) |
| 453 | }() |
| 454 | insns := []byte{ |
| 455 | 0x4C, 0x8B, 0xD1, // mov r10, rcx |
| 456 | 0xB8, 0x55, 0x0, 0x0, 0x0, // mov eax, 55h |
| 457 | 0xF6, 0x04, 0x25, 0x08, 0x03, 0xFE, 0x7F, 0x01, // test byte ptr[7FFE0308h] |
| 458 | 0x0F, 0x05, // syscall |
| 459 | 0xC3, // ret |
| 460 | } |
| 461 | require.NoError(t, windows.WriteProcessMemory(windows.CurrentProcess(), base, &insns[0], uintptr(len(insns)), nil)) |
| 462 | |
| 463 | evt.Callstack.Init(8) |
| 464 | evt.Callstack.PushFrame(callstack.Frame{PID: evt.PID, Addr: 0x2638e59e0a5, Offset: 0, Symbol: "?", Module: "unbacked"}) |
| 465 | evt.Callstack.PushFrame(callstack.Frame{PID: evt.PID, Addr: va.Address(base), Offset: 0, Symbol: "?", Module: "unbacked"}) |
| 466 | evt.Callstack.PushFrame(callstack.Frame{PID: evt.PID, Addr: 0x7ffb313853b2, Offset: 0x10a, Symbol: "Java_java_lang_ProcessImpl_create", Module: "C:\\Program Files\\JetBrains\\GoLand 2021.2.3\\jbr\\bin\\java.dll"}) |
| 467 | evt.Callstack.PushFrame(callstack.Frame{PID: evt.PID, Addr: 0x7ffb3138592e, ModuleAddress: 0x7ffb3138592e, Offset: 0x3a2, Symbol: "Java_java_lang_ProcessImpl_waitForTimeoutInterruptibly", Module: "C:\\Program Files\\JetBrains\\GoLand 2021.2.3\\jbr\\bin\\java.dll"}) |
| 468 | evt.Callstack.PushFrame(callstack.Frame{PID: evt.PID, Addr: 0x7ffb5d8e61f4, Offset: 0x54, Symbol: "CreateProcessW", Module: "C:\\WINDOWS\\System32\\KERNEL32.DLL"}) |
nothing calls this directly
no test coverage detected