| 704 | ); |
| 705 | pNtCreateThreadEx Real_NtCreateThreadEx = NULL; |
| 706 | NTSTATUS NTAPI Catch_NtCreateThreadEx( |
| 707 | OUT PHANDLE ThreadHandle, |
| 708 | IN ACCESS_MASK DesiredAccess, |
| 709 | IN POBJECT_ATTRIBUTES ObjectAttributes, |
| 710 | IN HANDLE ProcessHandle, |
| 711 | IN PVOID StartRoutine, |
| 712 | IN PVOID Argument, |
| 713 | IN ULONG CreateFlags, |
| 714 | IN ULONG_PTR ZeroBits, |
| 715 | IN SIZE_T StackSize, |
| 716 | IN SIZE_T MaximumStackSize, |
| 717 | IN PVOID AttributeList |
| 718 | ) { |
| 719 | int64_t time = get_time(); |
| 720 | char buf[DATA_BUFFER_SIZE] = ""; |
| 721 | |
| 722 | NTSTATUS ret = Real_NtCreateThreadEx(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, StartRoutine, Argument, CreateFlags, ZeroBits, StackSize, MaximumStackSize, AttributeList); |
| 723 | if (HooksInitialized) { // dont log our own hooking |
| 724 | HANDLE rThreadHandle = (ThreadHandle != NULL) ? *ThreadHandle : NULL; |
| 725 | |
| 726 | int offset = 0; |
| 727 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "{"); |
| 728 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"type\":\"dll\","); |
| 729 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"time\":%llu,", time); |
| 730 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"pid\":%lu,", (DWORD)GetCurrentProcessId()); |
| 731 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"tid\":%lu,", (DWORD)GetCurrentThreadId()); |
| 732 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"func\":\"NtCreateThreadEx\","); |
| 733 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"thread_handle\":%lld,", rThreadHandle); |
| 734 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"handle\":%lld,", (long long)ProcessHandle); |
| 735 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"start_routine\":%llu,", StartRoutine); |
| 736 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "\"argument\":%llu", Argument); |
| 737 | //offset += LogMyStackTrace(&buf[offset], DATA_BUFFER_SIZE - offset); |
| 738 | offset += sprintf_s(buf + offset, DATA_BUFFER_SIZE - offset, "}"); |
| 739 | SendDllPipe(buf); |
| 740 | } |
| 741 | return ret; |
| 742 | } |
| 743 | |
| 744 | |
| 745 | /******************* NtOpenProcess ************************/ |
nothing calls this directly
no test coverage detected