A menudo se utilizan funciones en scripts de PowerShell como por ejemplo (Hacer clic en una posición de la pantalla con PowerShell):
1 2 3 4 5 6 7 8 9 10 |
$MouseEventSig=@' [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); '@ $MouseEvent = Add-Type -memberDefinition $MouseEventSig -name "MouseEventWinApi" -passThru [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(10,10) $MouseEvent::mouse_event(0x00000002, 0, 0, 0, 0) $MouseEvent::mouse_event(0x00000004, 0, 0, 0, 0) |
Vemos que se usa una dll en concreto user32.dll y luego se hace referencia a la función mouse_event que sirve para tratar con el mouse.
Pongamos otro ejemplo (Escribir texto en el proceso Notepad):
1 2 3 4 5 6 7 8 9 10 11 |
$codigo=' [DllImport("user32.dll", EntryPoint = "FindWindowEx")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll")]public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); ' $notepad=Start-Process notepad -PassThru $notepad.WaitForInputIdle() $acciones=Add-Type -MemberDefinition $codigo -Name TextoNotepad -PassThru #FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow) #SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam) $acciones::SendMessage([IntPtr]$acciones::FindWindowEx($notepad.MainWindowHandle, [IntPtr]::Zero, "Edit", $null), 0x000C, 0, "Texto") |
En este caso, se usa la dll user32.dll y luego se hace referencia a las funciones FindWindowEx y SendMessage para escribir un texto en el proceso Notepad.
Aplicaciones
La información sobre el uso de las funciones se puede obtener analizando las dll con aplicaciones como por ejemplo:
- https://www.jesusninoc.com/04/15/ejecutar-microsoft-coff-binary-file-dumper-dumpbin-exe-desde-powershell/
- https://www.jesusninoc.com/04/18/ver-las-dependencias-de-un-fichero-dll-con-dumpbin-desde-powershell/
- https://www.jesusninoc.com/04/19/listar-funciones-exportadas-de-un-archivo-dll-con-dumpbin-desde-powershell/
- https://www.jesusninoc.com/01/31/winspy/
- https://www.jesusninoc.com/11/29/dependency-walker/
Información sobre archivos DLL
- https://www.jesusninoc.com/02/02/informacion-sobre-el-archivo-dll-user32-dll/
- https://www.jesusninoc.com/11/29/mostrar-los-procesos-que-estan-ejecutando-una-dll-de-un-listado-de-dlls-con-powershell/
- https://www.jesusninoc.com/11/28/mostrar-la-descripcion-de-un-fichero-filedescription-mediante-el-cmdlet-get-childitem-en-powershell/
- https://www.jesusninoc.com/11/28/mostrar-la-descripcion-filedescription-de-todos-los-ficheros-que-hay-en-una-carpeta-en-windows-mediante-el-cmdlet-get-childitem-en-powershell/
Más ejemplos que ayudan a comprenderlo mejor:
- https://www.jesusninoc.com/04/21/obtener-los-nombres-de-las-funciones-exportadas-de-un-archivo-dll-con-dumpbin-desde-powershell-explicacion-paso-a-paso-del-script/
- https://www.jesusninoc.com/04/26/llamar-con-el-valor-de-la-aplicacion-calculadora-calc-exe-a-cada-funcion-obtenida-con-dumbin-para-cada-dll/
- https://www.jesusninoc.com/04/27/llamar-con-el-valor-de-la-aplicacion-calculadora-calc-exe-a-cada-funcion-obtenida-con-dumbin-para-cada-dll-el-valor-de-la-dll-que-se-analiza-esta-en-una-variable/