ReadMe.txt
Reversing.Kr CrackMe – WindowsKernel
Please authenticate to lowercase.
Exeinfo PE
WindowKernel.exe
WinKer.sys
Analysis
WindowKernel.exe – sub_401110
HWND __thiscall sub_401110(HWND hDlg) { HWND result; // eax HWND v3; // eax HWND v4; // eax HWND DlgItem; // eax WCHAR String[256]; // [esp+8h] [ebp-204h] BYREF GetDlgItemTextW(hDlg, 1003, String, 512); if ( lstrcmpW(String, L"Enable") ) { result = (HWND)lstrcmpW(String, L"Check"); if ( !result ) { if ( ((int (__cdecl *)(int))sub_401280)(0x2000) == 1 ) MessageBoxW(hDlg, L"Correct!", L"Reversing.Kr", 0x40u); else MessageBoxW(hDlg, L"Wrong", L"Reversing.Kr", 0x10u); SetDlgItemTextW(hDlg, 1002, &word_4021F0); DlgItem = GetDlgItem(hDlg, 1002); EnableWindow(DlgItem, 0); return (HWND)SetDlgItemTextW(hDlg, 1003, L"Enable"); } } else if ( ((int (__cdecl *)(int))sub_401280)(0x1000) ) { v3 = GetDlgItem(hDlg, 1002); EnableWindow(v3, 1); SetDlgItemTextW(hDlg, 1003, L"Check"); SetDlgItemTextW(hDlg, 1002, &word_4021F0); v4 = GetDlgItem(hDlg, 1002); return SetFocus(v4); } else { return (HWND)MessageBoxW(hDlg, L"Device Error", L"Reversing.Kr", 0x10u); } return result; }
sub_401280에서 반환된 리턴값이 1이면 Correct 문구를 띄우도록 되어있다.
WindowKernel.exe – sub_401280
int __usercall sub_401280@<eax>(HWND a1@<edi>, DWORD dwIoControlCode) { HANDLE FileW; // esi DWORD BytesReturned; // [esp+4h] [ebp-8h] BYREF int OutBuffer; // [esp+8h] [ebp-4h] BYREF FileW = CreateFileW(L"\\\\.\\RevKr", 0xC0000000, 0, 0, 3u, 0, 0); if ( FileW == (HANDLE)-1 ) { MessageBoxW(a1, L"[Error] CreateFile", L"Reversing.Kr", 0x10u); return 0; } else if ( DeviceIoControl(FileW, dwIoControlCode, 0, 0, &OutBuffer, 4u, &BytesReturned, 0) ) { CloseHandle(FileW); return OutBuffer; } else { MessageBoxW(a1, L"[Error] DeviceIoControl", L"Reversing.Kr", 0x10u); return 0; } }
https://learn.microsoft.com/ko-kr/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol
“DeviceIoControl: 지정된 디바이스 드라이버에 직접 제어 코드를 보내 해당 디바이스가 해당 작업을 수행하도록 합니다.”
여기까지만 봐왔을때, WinKer.sys 드라이버 파일을 로드시켜서 제어 코드를 보내는 것으로 확인된다.
OutBuffer를 1로 만들어야 Correct 문구를 띄울 수 있을 것이다.
윈도우 커널모드 디버깅
Vmware Workstation 17.5.1 Pro, 윈도우7 32비트 기준으로
위와 같이 시리얼 포트를 구성하고,
WinDbg에서도 포트를 설정해준다음,
가상머신에서 윈도우를 부팅할때 F8키를 무한연타해서 “디버깅 모드”로 부팅한다.
그리고 다시 WinDbg의 Start debugging 창에서 OK 버튼을 눌러주면, 위 사진처럼 디버깅 환경 구성이 완성된다.
이 중 몇가지 명령어에 대해 살펴보자면,
sxe ld WinKer.sys
WinKer.sys가 로드될때 디버거가 멈춘다.
u WinKer+0x1266
해당 메모리 주소 지점의 어셈블리 코드를 보여준다.
bp WinKer+0x12B8
해당 메모리 주소에 브레이크포인트를 설치한다.
r <레지스터>, r <레지스터>=<값>
특정 레지스터값을 읽거나 쓸 수 있다.
WinKer.sys 드라이버를 다시 분석해보면,
WinKer.sys – sub_11288
dwIoControlCode가 0x2000일때 처리하는 코드는 sub_11288의 16줄에서 확인할 수 있다.
dword_13024의 값을 edx로 가져오고 난뒤의 브레이크포인트를 설치해서
edx값을 1로 임의로 바꾸면,
Correct 문구가 뜨는 것을 알 수 있었다.
따라서, dword_13024가 1로 지정되게끔 만들려면 어떻게 해야되는지 확인하기 위해 역참조해보았다.
sub_110D0+3A에서 1로 지정되는 것을 확인했다.
sub_110D0 함수는
DriverEntry -> sub_11266 -> sub_111DC -> sub_11156을 거쳐
최종 호출된다.
WinKer.sys – sub_11266
void __stdcall sub_11266(struct _KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) { char v4; // al v4 = READ_PORT_UCHAR((PUCHAR)0x60); sub_111DC(v4); }
“READ_PORT_UCHAR 루틴은 지정된 포트 주소에서 바이트를 읽습니다.”
https://learn.microsoft.com/ko-kr/windows-hardware/drivers/ddi/wdm/nf-wdm-read_port_uchar
https://wiki.osdev.org/%228042%22_PS/2_Controller
https://ggangjo.tistory.com/32
0x60 번지를 읽으면 키보드에 전송한 데이터를 읽을 수 있다고 한다.
따라서 sub_11266 함수는 키보드에 대한 데이터를 읽어와서 sub_111DC 함수에서 처리한다고 보면 된다.
WinKer.sys – sub_111DC, sub_11156, sub_110D0
https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc
스캔 코드 테이블을 확인하면 어떤 키를 입력해야 dword_13024가 1로 지정되게끔 만들 수 있는지 확인할 수 있다.
여기서 주의할 점은
sub_11156에서는 0x12을 한번 XOR,
sub_110D0에서는 0x12을 한번 XOR, 0x5를 한번 더 XOR을 해야 스캔 코드를 구할 수 있다.
Scan Code Table
The following table lists the full set of Scan Codes as presently recognized by the Microsoft operating systems. The US Key assignments are for reference to a type 101/102 Enhanced keyboard as supported by the Type 4 Keyboard layout. If there is no entry in the 101/102 Enhanced keyboard column, this scan code is currently not recognized by the operating system. The Key Location field has been added to aid in the placement of keys as illustrated in the
Recommended Physical Locations of the Windows Keys on page 10.
key location | 101/102 Enhanced Keyboard | scan 1 make | scan 1 break | scan 2 make | scan 2 brake |
DO NOT USE | 00 | 80 | 00 | F0 00 | |
DO NOT USE | E0_00 | E0_80 | E0_00 | E0_F0 00 | |
1 | ~ ` | 29 | A9 | 0E | F0 0E |
E0_29 | E0_A9 | E0_0E | E0_F0 0E | ||
2 | ! 1 | 02 | 82 | 16 | F0 16 |
E0_02 | E0_82 | E0_16 | E0_F0 16 | ||
3 | @ 2 | 03 | 83 | 1E | F0 1E |
E0_03 | E0_83 | E0_1E | E0_F0 1E | ||
4 | # 3 | 04 | 84 | 26 | F0 26 |
E0_04 | E0_84 | E0_26 | E0_F0 26 | ||
5 | $ 4 | 05 | 85 | 25 | F0 25 |
E0_05 | E0_85 | E0_25 | E0_F0 25 | ||
6 | % 5 | 06 | 86 | 2E | F0 2E |
E0_06 | E0_86 | E0_2E | E0_F0 2E | ||
7 | ^ 6 | 07 | 87 | 36 | F0 36 |
E0_07 | E0_87 | E0_36 | E0_F0 36 | ||
8 | & 7 | 08 | 88 | 3D | F0 3D |
E0_08 | E0_88 | E0_3D | E0_F0 3D | ||
9 | * 8 | 09 | 89 | 3E | F0 3E |
E0_09 | E0_89 | E0_3E | E0_F0 3E | ||
10 | ( 9 | 0A | 8A | 46 | F0 46 |
E0_0A | E0_8A | E0_46 | E0_F0 46 | ||
11 | ) 0 | 0B | 8B | 45 | F0 45 |
E0_0B | E0_8B | E0_45 | E0_F0 45 | ||
12 | _ – | 0C | 8C | 4E | F0 4E |
E0_0C | E0_8C | E0_4E | E0_F0 4E | ||
13 | + = | 0D | 8D | 55 | F0 55 |
E0_0D | E0_8D | E0_55 | E0_F0 55 | ||
15 | Backspace | 0E | 8E | 66 | F0 66 |
E0_0E | E0_8E | E0_66 | E0_F0 66 | ||
16 | Tab | 0F | 8F | 0D | F0 0D |
E0_0F | E0_8F | E0_0D | E0_F0 0D | ||
17 | Q | 10 | 90 | 15 | F0 15 |
E0_10 | E0_90 | E0_15 | E0_F0 15 | ||
18 | W | 11 | 91 | 1D | F0 1D |
E0_11 | E0_91 | E0_1D | E0_F0 1D | ||
19 | E | 12 | 92 | 24 | F0 24 |
E0_12 | E0_92 | E0_24 | E0_F0 24 | ||
20 | R | 13 | 93 | 2D | F0 2D |
E0_13 | E0_93 | E0_2D | E0_F0 2D | ||
21 | T | 14 | 94 | 2C | F0 2C |
E0_14 | E0_94 | E0_2C | E0_F0 2C | ||
22 | Y | 15 | 95 | 35 | F0 35 |
E0_15 | E0_95 | E0_35 | E0_F0 35 | ||
23 | U | 16 | 96 | 3C | F0 3C |
E0_16 | E0_96 | E0_3C | E0_F0 3C | ||
24 | I | 17 | 97 | 43 | F0 43 |
E0_17 | E0_97 | E0_43 | E0_F0 43 | ||
25 | O | 18 | 98 | 44 | F0 44 |
E0_18 | E0_98 | E0_44 | E0_F0 44 | ||
26 | P | 19 | 99 | 4D | F0 4D |
E0_19 | E0_99 | E0_4D | E0_F0 4D | ||
27 | { [ | 1A | 9A | 54 | F0 54 |
E0_1A | E0_9A | E0_54 | E0_F0 54 | ||
28 | } ] | 1B | 9B | 5B | F0 5B |
E0_1B | E0_9B | E0_5B | E0_F0 5B | ||
29* | | \ | 2B | AB | 5D | F0 5D |
E0_2B | E0_AB | E0_5D | E0_F0 5D | ||
30 | Caps Lock | 3A | BA | 58 | F0 58 |
E0_3A | E0_BA | E0_58 | E0_F0 58 | ||
31 | A | 1E | 9E | 1C | F0 1C |
E0_1E | E0_9E | E0_1C | E0_F0 1C | ||
32 | S | 1F | 9F | 1B | F0 1B |
E0_1F | E0_9F | E0_1B | E0_F0 1B | ||
33 | D | 20 | A0 | 23 | F0 23 |
E0_20 | E0_A0 | E0_23 | E0_F0 23 | ||
34 | F | 21 | A1 | 2B | F0 2B |
E0_21 | E0_A1 | E0_2B | E0_F0 2B | ||
35 | G | 22 | A2 | 34 | F0 34 |
E0_22 | E0_A2 | E0_34 | E0_F0 34 | ||
36 | H | 23 | A3 | 33 | F0 33 |
E0_23 | E0_A3 | E0_33 | E0_F0 33 | ||
37 | J | 24 | A4 | 3B | F0 3B |
E0_24 | E0_A4 | E0_3B | E0_F0 3B | ||
38 | K | 25 | A5 | 42 | F0 42 |
E0_25 | E0_A5 | E0_42 | E0_F0 42 | ||
39 | L | 26 | A6 | 4B | F0 4B |
E0_26 | E0_A6 | E0_4B | E0_F0 4B | ||
40 | : ; | 27 | A7 | 4C | F0 4C |
E0_27 | E0_A7 | E0_4C | E0_F0 4C | ||
41 | “ ‘ | 28 | A8 | 52 | F0 52 |
E0_28 | E0_A8 | E0_52 | E0_F0 52 | ||
42** | 2B | AB | 5D | F0 5D | |
E0_2B | E0_AB | E0_5D | E0_F0 5D | ||
43 | Enter | 1C | 9C | 5A | F0 5A |
44 | L SHIFT | 2A | AA | 12 | F0 12 |
E0_2A | E0_AA | E0_12 | E0_F0 12 | ||
45** | 56 | D6 | 61 | F0 61 | |
E0_56 | E0_D6 | E0_61 | E0_F0 61 | ||
46 | Z | 2C | AC | 1A | F0 1A |
E0_2C | E0_AC | E0_1A | E0_F0 1A | ||
47 | X | 2D | AD | 22 | F0 22 |
E0_2D | E0_AD | E0_22 | E0_F0 22 | ||
48 | C | 2E | AE | 21 | F0 21 |
E0_2E | E0_AE | E0_21 | E0_F0 21 | ||
49 | V | 2F | AF | 2A | F0 2A |
E0_2F | E0_AF | E0_2A | E0_F0 2A | ||
50 | B | 30 | B0 | 32 | F0 32 |
E0_30 | E0_B0 | E0_32 | E0_F0 32 | ||
51 | N | 31 | B1 | 31 | F0 31 |
E0_31 | E0_B1 | E0_31 | E0_F0 31 | ||
52 | M | 32 | B2 | 3A | F0 3A |
E0_32 | E0_B2 | E0_3A | E0_F0 3A | ||
53 | < , | 33 | B3 | 41 | F0 41 |
E0_33 | E0_B3 | E0_41 | E0_F0 41 | ||
54 | > . | 34 | B4 | 49 | F0 49 |
E0_34 | E0_B4 | E0_49 | E0_F0 49 | ||
55 | ? / | 35 | B5 | 4A | F0 4A |
E0_35 | E0_B5 | E0_4A | E0_F0 4A | ||
56*** | 73 | F3 | 51 | F0 51 | |
E0_73 | E0_F3 | E0_51 | E0_F0 51 | ||
57 | R SHIFT | 36 | B6 | 59 | F0 59 |
E0_36 | E0_B6 | E0_59 | E0_F0 59 | ||
58 | L CTRL | 1D | 9D | 14 | F0 14 |
60 | L ALT | 38 | B8 | 11 | F0 11 |
E0_38 | E0_B8 | E0_11 | E0_F0 11 | ||
61 | Space Bar | 39 | B9 | 29 | F0 29 |
E0_39 | E0_B9 | E0_29 | E0_F0 29 | ||
62 | R ALT | E0 38 | E0 B8 | E0 11 | E0 F0 11 |
64 | R CTRL | E0 1D | E0 9D | E0 14 | E0 F0 14 |
75 | Insert | Note 1 | Note 1 | Note 2 | Note 2 |
76 | Delete | Note 1 | Note 1 | Note 2 | Note 2 |
79 | L Arrow | Note 1 | Note 1 | Note 2 | Note 2 |
80 | Home | Note 1 | Note 1 | Note 2 | Note 2 |
81 | End | Note 1 | Note 1 | Note 2 | Note 2 |
83 | Up Arrow | Note 1 | Note 1 | Note 2 | Note 2 |
84 | Dn Arrow | Note 1 | Note 1 | Note 2 | Note 2 |
85 | Page Up | Note 1 | Note 1 | Note 2 | Note 2 |
86 | Page Down | Note 1 | Note 1 | Note 2 | Note 2 |
89 | R Arrow | Note 1 | Note 1 | Note 2 | Note 2 |
90 | Num Lock | 45 | C5 | 77 | F0 77 |
E0_45 | E0_C5 | E0_77 | E0_F0 77 | ||
91 | Numeric 7 | 47 | C7 | 6C | F0 6C |
92 | Numeric 4 | 4B | CB | 6B | F0 6B |
93 | Numeric 1 | 4F | CF | 69 | F0 69 |
95 | Numeric / | Note 3 | Note 3 | Note 3 | Note 3 |
96 | Numeric 8 | 48 | C8 | 75 | F0 75 |
97 | Numeric 5 | 4C | CC | 73 | F0 73 |
98 | Numeric 2 | 50 | D0 | 72 | F0 72 |
99 | Numeric 0 | 52 | D2 | 70 | F0 70 |
100 | Numeric * | 37 | B7 | 7C | F0 7C |
E0_37 | E0_B7 | E0_7C | E0_F0 7C | ||
101 | Numeric 9 | 49 | C9 | 7D | F0 7D |
102 | Numeric 6 | 4D | CD | 74 | F0 74 |
103 | Numeric 3 | 51 | D1 | 7A | F0 7A |
104 | Numeric . | 53 | D3 | 71 | F0 71 |
105 | Numeric – | 4A | CA | 7B | F0 7B |
106 | Numeric + | 4E | CE | 79 | F0 79 |
107*** | 7E | FE | 6D | F0 6D | |
DO NOT USE | E0_7E | E0_FE | E0_6D | E0_F0 6D | |
108 | Numeric Enter | E0 1C | E0 9C | E0 5A | E0 F0 5A |
110 | Esc | 01 | 81 | 76 | F0 76 |
E0_01 | E0_81 | E0_76 | E0_F0 76 | ||
112 | F1 | 3B | BB | 05 | F0 05 |
E0_3B | E0_BB | E0_05 | E0_F0 05 | ||
113 | F2 | 3C | BC | 06 | F0 06 |
E0_3C | E0_BC | E0_06 | E0_F0 06 | ||
114 | F3 | 3D | BD | 04 | F0 05 |
E0_3D | E0_BD | E0_04 | E0_F0 05 | ||
115 | F4 | 3E | BE | 0C | F0 0C |
E0_3E | E0_BE | E0_0C | E0_F0 0C | ||
116 | F5 | 3F | BF | 03 | F0 03 |
E0_3F | E0_BF | E0_03 | E0_F0 03 | ||
117 | F6 | 40 | C0 | 0B | F0 0B |
E0_40 | E0_C0 | E0_0B | E0_F0 0B | ||
118 | F7 | 41 | C1 | 83 | F0 83 |
E0_41 | E0_C1 | E0_83 | E0_F0 83 | ||
119 | F8 | 42 | C2 | 0A | F0 0A |
E0_42 | E0_C2 | E0_0A | E0_F0 0A | ||
120 | F9 | 43 | C3 | 01 | F0 01 |
E0_43 | E0_C3 | E0_01 | E0_F0 01 | ||
121 | F10 | 44 | C4 | 09 | F0 09 |
E0_44 | E0_C4 | E0_09 | E0_F0 09 | ||
122 | F11 | 57 | D7 | 78 | F0 78 |
123 | F12 | 58 | D8 | 07 | F0 07 |
124 | Print Screen | Note 4 | Note 4 | Note 4 | Note 4 |
125 | Scroll Lock | 46 | C6 | 7E | F0 7E |
E0_46 | E0_C6 | E0_7E | E0_F0 7E | ||
126 | Pause | Note 5 | Note 5 | Note 5 | Note 5 |
59 | D9 | 0F | F0 0F | ||
E0_59 | E0_D9 | E0_0F | E0_F0 0F | ||
5B | DB | 1F | F0 1F | ||
Left Win | E0_5B | E0_DB | E0_1F | E0_F0 1F | |
5C | DC | 27 | F0 27 | ||
Right Win | E0_5C | E0_DC | E0_27 | E0_F0 27 | |
5D | DD | 2F | F0 2F | ||
Application | E0_5D | E0_DD | E0_2F | E0_F0 2F | |
5E | DE | 37 | F0 37 | ||
ACPI Power | E0_5E | E0_DE | E0_37 | E0_F0 37 | |
5F | DF | 3F | F0 3F | ||
ACPI Sleep | E0_5F | E0_DF | E0_3F | E0_F0 3F | |
DO NOT USE | 60 | E0 | 47 | F0 47 | |
DO NOT USE | E0_60 | E0_E0 | E0_47 | E0_F0 47 | |
DO NOT USE | 61 | E1 | 4F | F0 4F | |
DO NOT USE | E0_61 | E0_E1 | E0_4F | E0_F0 4F | |
62 | E2 | 56 | F0 56 | ||
E0_62 | E0_E2 | E0_56 | E0_F0 56 | ||
63 | E3 | 5E | F0 5E | ||
ACPI Wake | E0_63 | E0_E3 | E0_5E | E0_F0 5E | |
64 | E4 | 08 | F0 08 | ||
E0_64 | E0_E4 | E0_08 | E0_F0 08 | ||
65 | E5 | 10 | F0 10 | ||
E0_65 | E0_E5 | E0_10 | E0_F0 10 | ||
66 | E6 | 18 | F0 18 | ||
E0_66 | E0_E6 | E0_18 | E0_F0 18 | ||
67 | E7 | 20 | F0 20 | ||
E0_67 | E0_E7 | E0_20 | E0_F0 20 | ||
68 | E8 | 28 | F0 28 | ||
E0_68 | E0_E8 | E0_28 | E0_F0 28 | ||
69 | E9 | 30 | F0 30 | ||
E0_69 | E0_E9 | E0_30 | E0_F0 30 | ||
6A | EA | 38 | F0 38 | ||
E0_6A | E0_EA | E0_38 | E0_F0 38 | ||
6B | EB | 40 | F0 40 | ||
E0_6B | E0_EB | E0_40 | E0_F0 40 | ||
6C | EC | 48 | F0 48 | ||
E0_6C | E0_EC | E0_48 | E0_F0 48 | ||
6D | ED | 50 | F0 50 | ||
E0_6D | E0_ED | E0_50 | E0_F0 50 | ||
6E | EE | 57 | F0 57 | ||
E0_6E | E0_EE | E0_57 | E0_F0 57 | ||
6F | EF | 6F | F0 6F | ||
E0_6F | E0_EF | E0_6F | E0_F0 6F | ||
DBE_KATAKANA‡ | 70 | F0 | 13 | F0 13 | |
E0_70 | E0_F0 | E0_13 | E0_F0 13 | ||
71 | F1 | 19 | F0 19 | ||
E0_71 | E0_F1 | E0_19 | E0_F0 19 | ||
72 | F2 | 39 | F0 39 | ||
E0_72 | E0_F2 | E0_39 | E0_F0 39 | ||
74 | F4 | 53 | F0 53 | ||
E0_74 | E0_F4 | E0_53 | E0_F0 53 | ||
75 | F5 | 5C | F0 5C | ||
E0_75 | E0_F5 | E0_5C | E0_F0 5C | ||
76 | F6 | 5F | F0 5F | ||
E0_76 | E0_F6 | E0_5F | E0_F0 5F | ||
DBE_SBCSCHAR‡ | 77 | F7 | 62 | F0 62 | |
E0_77 | E0_F7 | E0_62 | E0_F0 62 | ||
78 | F8 | 63 | F0 63 | ||
E0_78 | E0_F8 | E0_63 | E0_F0 63 | ||
CONVERT‡ | 79 | F9 | 64 | F0 64 | |
E0_79 | E0_F9 | E0_64 | E0_F0 64 | ||
DO NOT USE | 7A | FA | 65 | F0 65 | |
DO NOT USE | E0_7A | E0_FA | E0_65 | E0_F0 65 | |
NONCONVERT‡ | 7B | FB | 67 | F0 67 | |
DO NOT USE | E0_7B | E0_FB | E0_67 | E0_F0 67 | |
DO NOT USE | 7C | FC | 68 | F0 68 | |
DO NOT USE | E0_7C | E0_FC | E0_68 | E0_F0 68 | |
DO NOT USE | 7D | FD | 6A | F0 6A | |
DO NOT USE | E0_7D | E0_FD | E0_6A | E0_F0 6A | |
DO NOT USE | 7F | FF | 6E | F0 6E | |
DO NOT USE | E0_7F | E0_FF | E0_6E | E0_F0 6E |
FLAG
keybdinthook