Skip to content

Commit b3a1ead

Browse files
committed
Add winmine module
1 parent 0c611b1 commit b3a1ead

5 files changed

Lines changed: 119 additions & 0 deletions

File tree

mimikatz/mimikatz.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const KUHL_M * mimikatz_modules[] = {
2121
&kuhl_m_token,
2222
&kuhl_m_vault,
2323
&kuhl_m_minesweeper,
24+
&kuhl_m_winmine,
2425
#if defined(NET_MODULE)
2526
&kuhl_m_net,
2627
#endif

mimikatz/mimikatz.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "modules/kuhl_m_token.h"
2222
#include "modules/kuhl_m_vault.h"
2323
#include "modules/kuhl_m_minesweeper.h"
24+
#include "modules/kuhl_m_winmine.h"
2425
#if defined(NET_MODULE)
2526
#include "modules/kuhl_m_net.h"
2627
#endif

mimikatz/mimikatz.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@
341341
<ClCompile Include="modules\misc\kuhl_m_misc_citrix.c">
342342
<Filter>local modules\misc</Filter>
343343
</ClCompile>
344+
<ClCompile Include="modules\kuhl_m_winmine.c">
345+
<Filter>local modules</Filter>
346+
</ClCompile>
344347
</ItemGroup>
345348
<ItemGroup>
346349
<ClInclude Include="mimikatz.h" />
@@ -701,6 +704,9 @@
701704
<ClInclude Include="modules\misc\kuhl_m_misc_citrix.h">
702705
<Filter>local modules\misc</Filter>
703706
</ClInclude>
707+
<ClInclude Include="modules\kuhl_m_winmine.h">
708+
<Filter>local modules</Filter>
709+
</ClInclude>
704710
</ItemGroup>
705711
<ItemGroup>
706712
<Filter Include="local modules">

mimikatz/modules/kuhl_m_winmine.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/* Benjamin DELPY `gentilkiwi`
2+
https://blog.gentilkiwi.com
3+
benjamin@gentilkiwi.com
4+
Licence : https://creativecommons.org/licenses/by/4.0/
5+
*/
6+
#include "kuhl_m_winmine.h"
7+
8+
const CHAR DISP_WINMINE[] = " 123456789*x*?F.";
9+
10+
const KUHL_M_C kuhl_m_c_winmine[] = {
11+
{kuhl_m_winmine_infos, L"infos", L"infos"},
12+
};
13+
14+
const KUHL_M kuhl_m_winmine = {
15+
L"winmine", L"WinMine module", NULL,
16+
ARRAYSIZE(kuhl_m_c_winmine), kuhl_m_c_winmine, NULL, NULL
17+
};
18+
19+
NTSTATUS kuhl_m_winmine_infos(int argc, wchar_t* argv[])
20+
{
21+
DWORD dwPid;
22+
HANDLE hProcess;
23+
PEB Peb;
24+
PIMAGE_NT_HEADERS pNtHeaders;
25+
KULL_M_MEMORY_SEARCH sMemory = { {{NULL, NULL}, 0}, NULL };
26+
KULL_M_MEMORY_ADDRESS aRemote = { NULL, NULL };
27+
PVOID ptrTemp = NULL;
28+
BYTE patternStartGame[] = { 0x6a, 0x04, 0xeb, 0x02, 0x6a, 0x06, 0x5b, 0xa3 };
29+
KULL_M_MEMORY_ADDRESS aBuffer = { patternStartGame, &KULL_M_MEMORY_GLOBAL_OWN_HANDLE };
30+
STRUCT_MON_DEMINEUR monDemineur = { 0, 0, 0, 0, {0} };
31+
32+
if (kull_m_process_getProcessIdForName(L"winmine.exe", &dwPid)) {
33+
if (hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, dwPid))
34+
{
35+
if (kull_m_memory_open(KULL_M_MEMORY_TYPE_PROCESS, hProcess, &aRemote.hMemory))
36+
{
37+
if (kull_m_process_peb(aRemote.hMemory, &Peb, FALSE))
38+
{
39+
aRemote.address = Peb.ImageBaseAddress;
40+
if (kull_m_process_ntheaders(&aRemote, &pNtHeaders))
41+
{
42+
sMemory.kull_m_memoryRange.kull_m_memoryAdress.hMemory = aRemote.hMemory;
43+
sMemory.kull_m_memoryRange.kull_m_memoryAdress.address = (LPVOID)pNtHeaders->OptionalHeader.ImageBase;
44+
sMemory.kull_m_memoryRange.size = pNtHeaders->OptionalHeader.SizeOfImage;
45+
if (kull_m_memory_search(&aBuffer, sizeof(patternStartGame), &sMemory, TRUE))
46+
{
47+
aRemote.address = (PBYTE)sMemory.result + sizeof(patternStartGame);
48+
aBuffer.address = &ptrTemp;
49+
if (kull_m_memory_copy(&aBuffer, &aRemote, sizeof(PVOID)))
50+
{
51+
ptrTemp = (PVOID)((char*)ptrTemp - sizeof(PVOID));
52+
aRemote.address = ptrTemp;
53+
aBuffer.address = &monDemineur;
54+
if (kull_m_memory_copy(&aBuffer, &aRemote, sizeof(STRUCT_MON_DEMINEUR)))
55+
{
56+
//kprintf(L"Adresse : 0x%08X\n", ptrTemp);
57+
kprintf(L"Mines : %d\n", monDemineur.nbMines);
58+
kprintf(L"Dimension : %d lignes x %d colonnes\n", monDemineur.hauteur, monDemineur.longueur);
59+
kprintf(L"Champ :\n\n");
60+
61+
for (DWORD y = 1; y <= monDemineur.hauteur; y++)
62+
{
63+
kprintf(L"\t");
64+
for (DWORD x = 1; x <= monDemineur.longueur; x++)
65+
{
66+
BYTE laCase = monDemineur.tabMines[y][x];
67+
kprintf(L" %c", (laCase & 0x80) ? '*' : DISP_WINMINE[laCase & 0x0f]);
68+
}
69+
kprintf(L"\n");
70+
}
71+
}
72+
else PRINT_ERROR(L"monDemineur copy\n");
73+
74+
}
75+
else PRINT_ERROR(L"Copy ptrTemp\n");
76+
}
77+
else PRINT_ERROR(L"Search is KO\n");
78+
}
79+
else PRINT_ERROR(L"winmine NT Headers\n");
80+
}
81+
else PRINT_ERROR(L"winmine PEB\n");
82+
kull_m_memory_close(aRemote.hMemory);
83+
}
84+
CloseHandle(hProcess);
85+
}
86+
else PRINT_ERROR(L"OpenProcess\n");
87+
}
88+
else PRINT_ERROR(L"No winmine in memory!\n");
89+
90+
return STATUS_SUCCESS;
91+
}

mimikatz/modules/kuhl_m_winmine.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* Benjamin DELPY `gentilkiwi`
2+
https://blog.gentilkiwi.com
3+
benjamin@gentilkiwi.com
4+
Licence : https://creativecommons.org/licenses/by/4.0/
5+
*/
6+
#pragma once
7+
#include "kuhl_m.h"
8+
#include "../modules/kull_m_process.h"
9+
10+
const KUHL_M kuhl_m_winmine;
11+
12+
NTSTATUS kuhl_m_winmine_infos(int argc, wchar_t* argv[]);
13+
14+
typedef struct _STRUCT_MON_DEMINEUR {
15+
DWORD nbMines;
16+
DWORD longueur;
17+
DWORD hauteur;
18+
DWORD alignOffset;
19+
BYTE tabMines[26][32];
20+
} STRUCT_MON_DEMINEUR, *PSTRUCT_MON_DEMINEUR;

0 commit comments

Comments
 (0)