Pokazywanie postów oznaczonych etykietą Windows. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Windows. Pokaż wszystkie posty

1 listopada 2016

paramiko/rforward.py i py2exe

Dobrze jest mieć w zanadrzu mechanizm pozwalający na uruchomienie pythonowego skryptu na systemie pozbawiony interpretera. Do celów testowych wybrałem rforward.py, który pozwala na stworzenie tunelowanego połączenia, pochodzący z biblioteki Paramiko. Wydaje się, że biblioteka jest całkiem rozbudowana, więc może być dobrym polem do testów. Zestaw linków:
Instalacja pakietów dla Paramiko i py2exe:
c:\Python34\Scripts>pip install cryptography
c:\Python34\Scripts>pip install pycrypto
c:\Python34\Scripts>pip install paramiko

c:\Python34\Scripts>pip install py2exe
Domyślny pip dostarczony wraz z interpreterem miał kłopot, aby zainstalować niektóre pakiety. Okazało się, że aktualizacja do najnowszej wersji rozwiązuje problem.
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
Problemem okazała się również wersja pythona, której używałem. py2exe działa do wersji 3.4. Wersji 3.5 towarzyszą jakieś zawirowania i trzeba będzie na nią jeszcze poczekać.
Building 'dist\rforward.exe'.
error: [Errno 2] No such file or directory: 'c:\\Python35\\lib\\site-packages\\py2exe\\run-py3.5-win-amd64.exe'
Aby stworzyć plik wykonywalny należy stworzyć skrypt setup.py, w którym wyszczególnimy z jakich plików składa się nasz program.
from distutils.core import setup
import py2exe
from glob import glob

setup(console=['rforward.py'],
      data_files = [('', ['C:\\Windows\\System32\\msvcr100.dll',
                          'C:\\Windows\\System32\\msvcp100.dll'])])
To czego może zabraknąć na docelowej maszynie, to biblioteki z Visual Studio 2010, których wymaga do działania python. Można je również zainstalować za pomocą Microsoft Visual C++ 2010 Redistributable Package (x86). Ja wybrałem wersję na 32-bitową, zgodną z zainstalowanym interpreterem. Tutorial py2exe (dla starszej wersji pythona), ostrzega o restrykcjach odnośnie kopiowania tych bibliotek, a mianowicie powinno kopiować się wszystkie trzy, a nie tylko wybraną oraz manifest. Pozostawię to jako kwestię otwartą, ponieważ, nie mogłem znaleźć tego w dokumentacji, ponadto jeden z plików (msvcp100.dll), gdzieś wyparował. Z tego co wiem do działania wymagany jest jedynie msvcr100.dll (nie testowałem). Pliki należy skopiować, do głównego katalogu, tak, by exe mógł je odnaleźć.
Aby zbudować plik wykonywalny wystarczy wywołać setup.py z opcją py2exe. Całość potrzebna do działania programu powinna znaleźć się w katalogu dist.
c:\Python34\python.exe setup.py py2exe

23 października 2016

Windows 7 update ...

Jak wymusić aktualizację sytemu (Windows 7) po świeżej instalacji. Mechanizm nie informuje o postępie poszukiwań i można czekać na to kilka dni. Ratunkiem są dwa patche, (może będą kolejne, bo co jakiś czas przestaje działać): KB3102810, KB3172605.

Warto sprawdzić, czy są one już obecne w systemie, a przed dokonaniem aktualizacji najlepiej wyłączyć usługę odpowiedzialną za aktualizację (Start | services.msc | "Windows Update | Stop) i włączyć ją ponownie po:
PS C:\Users\beru> get-hotfix -id KB3102810
PS C:\Users\beru> get-hotfix -id KB3172605

26 września 2015

Windows Kernel Exploitation - warsztat

Kilka interesujących artykułów, które znalazłem, a dotyczyły one wykorzystanie podatności w jądrze systemu Windows. Punktem wejścia jest tutaj przede wszystkim interakcja z API win32k.sys. Podstawowe funkcje:
  • zawiera windows manager
    • kontroluje wyświetlania okien
    • zarządza wyjściem na ekran
    • kolekcjonuje dane wejściowe z klawiatury, myszy itd.,
    • woła zdefiniowane przez aplikacja hook-i
    • przekazuje mesgi użytkownika do aplikacji
    • zarządza obiektami użytkownika
  • zawiera graphics device interface (GDI) - bibilioteki funkcji graficznych
    • rysowanie i manipulowanie obiektami: liniami, tekstem i figurami
    • zarządza obiektami (GDI) takimi jak brushes, pens, DCs itp.
    • dostarcza API dla sterowników viedeo/drukarki
W sumie po stronie użytkownika można wywołać ponad 800 funkcji. Warto też wiedzieć, że każdy typ obiektu zdefiniowany jest prze unikalną strukturę (np. win32k!tagWND, win32k!tagCURSOR, itp.).

Szczerze mówiąc najbardziej zainteresował mnie warsztat, jakim posługują się autorzy artykułów. Nie kierowałem się żadnym kluczem, po znalezieniu pierwszego artykuły przeskakiwałem do przypisów i tym sposobem stworzyłem sobie małą listę. Nie zagłębiałem się też zbyt mocno w samą tematykę, więc jest to coś do czego będzie warto wrócić.
Ostatnia źródło informacji to bardzo fajna prezentacja z konferencji Blackhat 2011 ("Kernel Attacks Through User- Mode Callbacks") i opowiada o samej architekturze systemu i klasach błędów jakie można w nim napotkać: use-after-free (alokacja i niszczenie obiektów np. znajdujących się w menu), null-pointer-dereference. Więcej około 30-35 minuty.


2 sierpnia 2015

[python] WinAppDbg

Natchniony bardzo fajnym wykładem Wesley-a McGrew - Instrumenting Point-of-Sale Malware (DEF CON 22), przyjrzałem się bibliotece WinAppDbg.



Biblioteka daje możliwość wygodnego analizowania, debugowania i manipulowania procesami w środowisku Windows. Niestety od wersji 1.5 python 3 nie jest już oficjalnie wspierany, pozostaje więc wersja dla python-a 2. Na stronie głównej projektu, autorzy podają także pokaźny zbiór linków, do podobnych projektów. Najciekawszą rzeczą jest bardzo bogata dokumentacja.
Instalacja za pomocą pip.
pip install winappdbg
I przykładowy program, nic nadzwyczajnego, moja modyfikacja drugiego przykładu z innym/lepszym formatowaniem.
from winappdbg import System

# Create a system snaphot.
system = System()

print('PID:    Exe Name:')
print('-----------------')
for process in system:
    space = ' ' * (8 - len(str(process.get_pid())) - 1)
    print(str(process.get_pid()) + ':' + space + str(process.get_filename()))

4 kwietnia 2015

[PowerShell] Wyszukiwanie plików ukrytych

Gdyby zaszła potrzeba znalezienia ukrytego pliku, konfigurującego wirusa rządowego:
Wydaj mi się, że PowerShell jest całkiem potężnym narzędziem, ale gdy chce rozwiązać nim jakiś problem zawsze napotykam na jego ograniczenia. Właściwe wyszukiwanie
  • -Force - zwraca wszystkie pliki w folderze, nawet te ukryte
  • -ErrorAction SilentlyContinue - niektóre zasoby jak np. "c:\Users\beru\Documents\My Music" występują jako jakaś windowsowa forma dowiązania (junction). Ta opcja ukrywa las błędów, który jest generowany przez nieudane próby wejścia. Plik z "My Music" są umieszczone w "c:\Users\beru\Music" i ten folder zostanie przeszukany
# Pomoc
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Detailed

# Sprawdzenie atrybuty pliku
(Get-ItemProperty .\Music\f14.conf).attributes.ToString() -match "Hidden"

# Wyszukiwanie
Get-ChildItem . -Force -Recurse -ErrorAction SilentlyContinue | Where-Object {$_.mode -match "h" -and $_.name -eq "f14.conf"}

24 grudnia 2014

[Defrag] procdump

Kolejny fajna porcja podcastów z Defrag dostępna na channel9, dotycząca narzędzia ProcDump (sysinternals).
ProcDump jest programem konsolowym do zrzucania dump-ów pamięci (zdolności takie posiada też TaskManager, czy Process Explorer, ale nie tak zaawansowane). To co w nim najfajniejsze to tworzenie dump-ów programów w wyniku wystąpienia określonych warunków (pojawienie się wyjątku, określone zużycie pracy procesora/pamięci). Warto zacząć do przeglądnięcia dostępnych przykładów:
procdump.exe -? -e
Trzeba pamiętać o podaniu nazwy pliku gdzie dump zostanie zrzucony, jakoś przykłady o tym nie wspominają, a komunikat zwrotny nie jest intuicyjny. Kilka użytecznych przełączników:
  • -mp, -ma - domyślnie procdump, tworzy mini-dump, czasami jest to wystarczające, ale jeżeli będzie potrzebna nam większa ilość pamięci, można skorzystać z opcji Mini-Plus (-mp), lub do zrzutu całej pamięci (-ma)
  • -r - opcja tworzy klon pamięci, dzięki czemu proces tworzenia dumpa, nie przerywa działania oryginalnego programu
  • -w - jeżeli proces jeszcze nie jest odpalony, poczekaj na niego
  • -e - zrzuć dump w razie wystąpienie wyjątku. Domyślnie zadziała, gdy nie obsłużona zostanie druga szansa na złapanie wyjątku. Np. program zgłosi wyjątku access violation, na który system nie będzie umiał zareagować, więc nastąpi crash aplikacji. W ten sposób w dump-ie pojawi się miejsce, z którego pierwszy wyjątek został złapany, a nie gdzie został rzucony. Aby reagować na pierwsze pojawienie się wyjątku można skorzystać z opcji "-e 1"
  • -f - filter na wyjątki i debug logi
Przykład użycia:
#include "stdafx.h"
#include <iostream>

int main() {
    std::cout << "Hello crash" << std::endl;
    int *ptr = new((int *)0xdeadbeaf) int(44);
    return 0;
}
C:\userdata\>procdump.exe -mp -e 1 -f "ACCESS_VIOLATION" -w ConsoleCrash.exe crash.dmp

ProcDump v7.1 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards

Waiting for process named ConsoleCrash.exe...

Process:               ConsoleCrash.exe (3344)
CPU threshold:         n/a
Performance counter:   n/a
Commit threshold:      n/a
Threshold seconds:     10
Hung window check:     Disabled
Log debug strings:     Disabled
Exception monitor:     First Chance+Unhandled
Exception filter:      *ACCESS_VIOLATION*
Terminate monitor:     Disabled
Cloning type:          Disabled
Concurrent limit:      n/a
Avoid outage:          n/a
Number of dumps:       1
Dump folder:           C:\userdata\
Dump filename/mask:    crash


Press Ctrl-C to end monitoring without terminating the process.

[22:33:05] Exception: C0000005.ACCESS_VIOLATION
[22:33:05] Dump 1 initiated: C:\userdata\crash.dmp
[22:33:06] Dump 1 complete: 1 MB written in 0.5 seconds
[22:33:06] Waiting for dump to complete...
[22:33:07] Dump count reached.

14 grudnia 2014

Migracja repozytorium svn do git-a

Nie jest to nawet takie skomplikowane. Dodatkowo, skonfigurowałem msysGit-a pod windows-em. Wymagało to wygenerowania kluczy i skonfigurowania kilku dodatkowych narzędzi (plink/pageant). Przydatne okazały się dwa poniższe linki:
Powtarzając częściowo za poradnikiem, zaczynamy od wygenerowania listy użytkowników svn-a, na tej podstawie tworzymy plik user.txt, w którym mapujemy ich na użytkowników git-a
$ svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /'
$ cat users.txt
kungfurry = Robert <robert@example.com>
Następnie klonujemy repozytorium (flaga -s umożliwia śledzenie gałęzi trunk/branch/tags, ale ja nie utrzymywałem tej konwencji i nie testowałem tej opcji). Poradnik zaleca też skasowanie jakiś śmieci z katalogu .git
$ git svn clone svn+ssh://kungfurry@example.com/svn/some_project \
      --authors-file=users.txt --no-metadata my_project
$ rm -Rf my_project/.git/refs/remotes
Wybrałem najprostszą z możliwych ścieżek, chodziło mi bowiem o przeniesienie się na git-a całkowicie. Z tego co już miałem stworzyłem gołego klona i wypchnąłem go na zdalny serwer. Po skasowaniu lokalnego repo, zrobiłem klona z serwera, w ten sposób automatycznie zostały stworzone odniesienie do zdalnego repozytorium.
$ git clone --bare my_project my_project.git
$ scp -r my_project.git kungfurry@example.com:/home/kungfurry/git_repos/
$ rm -rf my_project
$ git clone kungfurry@example.com:/home/kungfurry/git_repos/my_project.git

7 sierpnia 2014

[Windows] Defrag Toos - sysinternals konfiguracja

Zbiór fajnych podcastów na temat diagnozowania problemów w Windowsie, za pomocą narzędzi sysinternals. Aby uzyskać lepszą diagnostykę niezbędna jest instalacja "Microsoft Windows SDK for Windows 7 and .NET Framework 4", w którym to znajduje się się lepsza wersja dbghelp.dll.
Oczywiście nie obyło się bez problemów. Po pierwsze, trzeba było odinstalować "Microsoft Visual C++ 2010 x86 Redistributable", aby w ogóle doprowadzić do instalacji (doprowadziły mnie do tego fail logi).
Po drugie nie wszystkie narzędzie z SDK rozpakowują się tam, gdzie to zostało wskazane, większość i tak wędruje do Program Files.

Interesują nas narzędzie dostępne w "Redistributable Packages" (czyli Microsoft Visual C++ 2010, Application Verifier, Debbuging Tools, Windows Performance Toolkit). Jednak SDK ściągnie jedynie instalatory. Nas interesują instalatory debbugera dla wersji 32 i 64 bitowej.
c:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_amd64.msi
c:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_x86.msi
Można je zainstalować w dowolnej lokalizacji. Każda posiada odpowiednią wersję dbghelp.dll, która będzie nam potrzebna - można ją nawet przekopiować na USB (diagnostyczny) z innymi narzędziami sysinternals.

Niektóre z narzędzi (jak Process Explorer) potrafią pokazywać jakie biblioteki dll, są załadowane przez dany proces do pamięci. Przydać się mogę symbole debbugjące dostępne do Microsoftu. Ścieżki, gdzie będą przechowywane, można ustawić za pomocą poniższego skryptu. Ważne są też zmienne środowiskowe (które zdaje się, są również wykonywane przez inne tego typu programy). Magiczne SRV, z tego co zrozumiałem, ustawia przeszukiwanie najpierw w lokalnym katalogu, a jeżeli ich tam nie znajdzie, ściąga symbole z serwera i robi ich backup w lokalnym katalogu (działanie magicznych gwiazdek).

Symbols.cmd:
md c:\My
md c:\My\Src
md c:\My\Sym
md c:\My\SymCache
setx /M _NT_SOURCE_PATH SRV*C:\My\Src
setx /M _NT_SYMBOL_PATH SRV*C:\My\Sym*http://msdl.microsoft.com/download/symbols
setx /M _NT_SYMCACHE_PATH C:\My\SymCache
pause

Drugi skrypt podawany przez autorów, służy do drukowania większej ilości detali (jeżeli dobrze zrozumiałem) - nie testowałem. Informacje na stronie mówią, że może to spowolnić wczytywanie symboli, więc warto włączać flagę tylko, gdy jest to uzasadnione.

DbgHelp_Logging.cmd:
rem msdn.microsoft.com/en-us/library/windows/desktop/ms680687.aspx
md c:\My
md c:\My\DbgHelp
setx DBGHELP_DBGOUT 1 
setx DBGHELP_LOG C:\My\DbgHelp\DbgHelpLog.txt
pause

28 czerwca 2014

[Notki] Działanie i budowanie plików dll

Notki z godzinnego podcastu Gynvaela Coldwinda odnośnie budowania oraz działania plików dll. Tutaj tylko budowanie.



Plik asdf.c.
#include <stdio.h>

__declspec(dllimport) int add(int a, int b);

int main(void) {
    printf("5+6 ==  %d\n", add(5, 6));
    return 0;
}
Biblioteka (my_dll.c) będzie udostępniać tylko jedną funkcję. __declspec nie jest konieczne, jeżeli będziemy korzystać z pliku z definicjami.
__declspec(dllexport) int add(int a, int b) {
    return a + b;
}
Plik z definicjami my_dll.def.
LIBRARY my_dll
EXPORTS
    add
    dodaj=add
Budowanie:

Najpierw kompilujemy do pliku obiektowego, następnie trzeba posłużyć się dllwrap, który jest rodzajem linkera, dla plików dll. Dodawanie pliku z definicjami nie jest obowiązkowe, przydaje się dopiero wtedy, gdy chcemy stworzyć aliasy na nasze funkcje.

dlltool pozwala na tworzenie bibliotek (dla kompilatorów) (.a), coś z czym będziemy linkować dany program. Jest to konieczne, bowiem nie każdemu kompilatorowi możemy powiedzieć, aby korzystał z dll, akurat gcc to potrafi. W tej bibliotece będzie wyłącznie informacja dla linker, że dany kod znajduje się w jakiejś dll-ce. Wymagany jest plik z definicjami exportu.
> gcc -c my_dll.c
> dllwrap my_dll.o -o my_dll.dll --def my_dll.def 
> dlltool -l libmy_dll.a -D my_dll.dll -d my_dll.def

> gcc asdf.c my_dll.dll
# alternatywne rozwiązanie z wskazaniem biblioteki libmy_dll.a 
# będzie poszukiwana w obecnym katalogu
> gcc asdf.c -L. -lmy_dll

Name mangling

Funkcje stworzone w C++, są exportowane pod innymi nazwami np. _Z4addii - udekorowane są dodatkowymi informacjami. Wynika to z faktu, że C++ pozwala na istnieje kilku funkcji o tej samej nazwie, pod warunkiem, że różnią się one przyjmowanymi typami. Aby móc w kodzie C++ skorzystać z funkcji add (funkcji C z dll) należy skorzystać z takiej deklaracji:
extern "C" {
    int add(int a, int b);
}
W odwrotnej sytuacji, gdy mamy kod w C i chcemy skorzystać z funkcji C++ w dll, trzeba posłużyć się tą udekorowaną nazwą _Z4addii.

8 marca 2014

Windows 7 - odzyskiwanie miejsca na dysku

Microsoft wydał w październiku zeszłego roku (2013) poprawkę (KB2852386) do swojego narzędzie cleanmgr, pozwalającą na usunięcie kopii wszystkich aktualizacji, nawet tych zamienionych przez nowsze wersje. Poprawka pozwala na usunięcie tych starych wersji i zwolnienie całkiem sporej ilości miejsca na dysku (u mnie 10GB).

Najpierw sprawdzenie, czy aktualizacja jest dostępna w systemie.
PS C:\Users\beru> get-hotfix -id KB2852386

Source        Description      HotFixID      InstalledBy          InstalledOn              
------        -----------      --------      -----------          -----------              
BERU-KOMP...  Update           KB2852386     ZARZĄDZANIE NT\SY... 2013-10-09 00:00:00      
W przypadku braku, trzeba ją zainstalować ręcznie:
Następnym krokiem jest uruchomienie cleanmgr (Start | Akcesoria | Narzędzia systemowe | Oczyszczanie dysku/Disk Cleanup), koniecznie z prawami administratora, tylko wtedy pojawi się opcja do "Windows Update - oczyszczanie"/"Windows Update Cleanup".

6 października 2013

[Win] Redmond Path - edycja ścieżek przeszukiwania

Kolega pokazał mi bardzo fajne narzędzie, pozwalające na edycję ścieżek przeszukiwania w Windows. Wraz z kolejnymi wersjami systemu, problem miniaturowego okienka, w którym można tego dokonać jakoś nie jest rozwiązywany. Redmond Path jest tutaj wspaniałym udogodnieniem:

9 kwietnia 2013

Windows Sysinternals

Zbiór fajnych narzędzi administracyjnych i diagnostycznych dla system Windows - z firmay przejętej przez Microsoft, jakiś czas temu. Już dawno o tym słyszałem, ale jakoś nie miałem czasu, się im bliżej przyjrzeć. Wśród narzędzi m.in. Process Explorer, reszta osiągalna za pomocą odnośnika:
http://technet.microsoft.com/en-us/sysinternals/default

4 kwietnia 2013

python.ctypes - wołanie funkcji (shared/dynamic libs)

ctypes, to biblioteka pytahon-a umożliwiająca wołanie funkcji z dynamicznych i współdzielonych bibliotek, dla różnych platform. Przydatne linki:
By przekazać wartości przez wskaźnik/referencję można skorzystać z metody byref(), albo pointer() (ta jest jednak wolniejsza, bo tworzy prawdziwy wskaźnik). Link.
Przykład poniżej woła funkcję sscanf() (msvcrt jest Windows-ową biblioteką zawierającą większość funkcji z biblioteki standardowej C).
from ctypes import *
i = c_int()
f = c_float()
s = create_string_buffer('\000' * 32)
ctypes.cdll.msvcrt.sscanf("1 3.14 Hello", "%d %f %s", byref(i), pointer(f), s)

print i.value, f.value, s.value
I wynik:
1 3.1400001049 Hello
Chociaż interesowało mnie jeszcze kilka zagadnień (np. tworzenie struktur, tablic), nie starczyło czasu, by zrobić sobie przykłady. W razie czego, trzeba będzie wrócić do dokumentacji. A tymczasem, postanowiłem pobawić się biblioteką dźwięku BASS. Przykład poniżej, ma za zadanie przez 3 sekundy w pętli odtwarzać zawartość adios.wav.

Jeżeli mamy do czynienia z prostymi wartościami, funkcje z biblioteki możemy wołać bezpośrednio na obiekcie (bassDll).
None, integers, longs, byte strings and unicode strings are the only native Python objects that can directly be used as parameters in these function calls
import ctypes
import time

BASSVERSION      = 0x204
BASS_SAMPLE_LOOP = 4

def HIWORD(value):
    return value >> 16

bassDll = ctypes.WinDLL ("d:\\bass.dll")
if HIWORD(bassDll.BASS_GetVersion()) != BASSVERSION:
    raise Exception("An incorrect version of BASS was loaded")

if not bassDll.BASS_Init(-1, 44100, 0, 0, None):
    raise Exception("Can't initialize device")

chan = bassDll.BASS_StreamCreateFile(False, 'd:\\adios.wav', \
                                     ctypes.c_longlong(0), ctypes.c_longlong(0), \
                                     BASS_SAMPLE_LOOP)
if not chan:
    raise Exception("Can't play the file")

bassDll.BASS_ChannelPlay(chan, False)
time.sleep(3)
bassDll.BASS_Free()
print 'Success!'
W przypadku, gdy mamy do czynienia z bardziej wyrafinowanymi funkcjami, można skorzystać z WINFUNCTYPE (to dla Windows), który stworzy prototyp funkcji. Do środka przekazujemy jako pierwszy "typ zwracany", reszta to parametry jakie pobiera już właściwa funkcja. Tworząc funkcję z prototypu, przekazujemy jako drugi argument parametry właściwego wołania (linijka 13).
Pojedynczy parametr może składać się z trzech pól:
  1. Kombinacja flag określających rodzaj parametru (1 - IN, 2 - OUT, 4 - IN będący int-em ustawionym na 0 (?))
  2. Nazwa parametru (opcjonalna)
  3. Domyślna wartość dla parametru (opcjonalna)
Poniżej niezbyt wyrafinowany przykład, który wywołuje Message Box z tekstem "Hello".
import ctypes
from ctypes.wintypes import HWND, LPCSTR, UINT

# (C++)
#int WINAPI MessageBox(
#  _In_opt_  HWND hWnd,
#  _In_opt_  LPCTSTR lpText,
#  _In_opt_  LPCTSTR lpCaption,
#  _In_      UINT uType
#);

func_prototype = ctypes.WINFUNCTYPE(ctypes.c_int, HWND, LPCSTR, LPCSTR, UINT)
func_param = (1, "hwnd", 0), (1, "text", "Hello"), (1, "caption", None), (1, "flags", 0)
MessageBox = func_prototype(("MessageBoxA", ctypes.windll.user32), func_param)

MessageBox()