Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 70N1 en 20 Diciembre 2014, 19:49 pm



Título: Por que me da error? ( declarar api y realizar llamada )
Publicado por: 70N1 en 20 Diciembre 2014, 19:49 pm
Por que me tira estos errores?

error C2371: 'SHELLEXECUTEINFO' : nueva definición; tipos básicos distintos

error C2371: 'LPSHELLEXECUTEINFO' : nueva definición; tipos básicos distintos

error C2373: 'ShellExecuteExA' : nueva definición; modificadores de tipo distintos

error C3861: 'ShellExecuteExA': no se encontró el identificador   



Este es el codigo
Código:

#include "stdafx.h"
#include <windows.h>


typedef struct _SHELLEXECUTEINFO {
DWORD     cbSize;
ULONG     fMask;
HWND      hwnd;
LPCTSTR   lpVerb;
LPCTSTR   lpFile;
LPCTSTR   lpParameters;
LPCTSTR   lpDirectory;
int       nShow;
HINSTANCE hInstApp;
LPVOID    lpIDList;
LPCTSTR   lpClass;
HKEY      hkeyClass;
DWORD     dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE    hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


BOOL ShellExecuteEx(
  _Inout_  SHELLEXECUTEINFO *pExecInfo
);

int _tmain(int argc, _TCHAR* argv[])

{

SHELLEXECUTEINFO ShExecInfo;

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "cmd.exe";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;

ShellExecuteEx(&ShExecInfo);



return 0;
}




Título: Re: Por que me da error? ( declarar api y realizar llamada )
Publicado por: Eternal Idol en 20 Diciembre 2014, 20:26 pm
Eso que da error ya esta definido en windows.h ...


Título: Re: Por que me da error? ( declarar api y realizar llamada )
Publicado por: 70N1 en 21 Diciembre 2014, 00:11 am
Mira...

Tengo este code en el .h

Código:
#include <windows.h>

typedef struct _SHELLEXECUTEINFO {
DWORD     cbSize;
ULONG     fMask;
HWND      hwnd;
LPCTSTR   lpVerb;
LPCTSTR   lpFile;
LPCTSTR   lpParameters;
LPCTSTR   lpDirectory;
int       nShow;
HINSTANCE hInstApp;
LPVOID    lpIDList;
LPCTSTR   lpClass;
HKEY      hkeyClass;
DWORD     dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE    hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


typedef  BOOL (WINAPI *ShellExecuteEx)(
_Inout_  _SHELLEXECUTEINFO &pExecInfo
);

y este en el cpp

Código:


#include "stdafx.h"
#include "windef.h"





int _tmain(int argc, _TCHAR* argv[])

{


_SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(_SHELLEXECUTEINFO);
ShExecInfo.fMask = (0x00000040);
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = L"c:\\toni.exe";
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;

ShellExecuteEx( ShExecInfo); /////////////////////////////////////////////AQUI ME TIRA ERROR

//WaitForSingleObject(ShExecInfo.hProcess, INFINITE);



return 0;
}



Error   1   error C2373: 'ShExecInfo' : nueva definición; modificadores de tipo distintos

Como puedo solucionarlo?. No doy pies con bola.





Título: Re: Por que me da error? ( declarar api y realizar llamada )
Publicado por: Eternal Idol en 21 Diciembre 2014, 00:39 am
Solo necesitas incluir windows.h, no hace falta REDEFINIR SHELLEXECUTEINFO y ShellExecuteEx (y menos para cambiar la definicion, el parametro de ShellExecuteEx es un puntero, no una referencia).

La estructura es SHELLEXECUTEINFO, sin guion bajo al principio.

Tenes que pasar la direccion de memoria de la estructura:
Código
  1. ShellExecuteEx(&ShExecInfo);


Título: Re: Por que me da error? ( declarar api y realizar llamada )
Publicado por: 70N1 en 21 Diciembre 2014, 14:03 pm

La cosa es que estoy preparando el codigo para injectarlo y necesito hacer las llamadas a la api.
Estoy lellendo y lellendo y nada. no doy pies con bola.


Código:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
#endif

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

// Disable some useless warnings
#pragma warning(disable: 4996) // declared deprecated
#pragma warning(disable: 4311) // pointer truncation
#pragma warning(disable: 4312) // conversion problems
#pragma warning(disable: 4748) // optimization disabled

#pragma unmanaged
#pragma runtime_checks( "", off )

// TODO: reference additional headers your program requires here




#include <cstdio>

#include "windef.h"





typedef struct SHELLEXECUTEINFO {
DWORD     cbSize;
ULONG     fMask;
HWND      hwnd;
LPCTSTR   lpVerb;
LPCTSTR   lpFile;
LPCTSTR   lpParameters;
LPCTSTR   lpDirectory;
int       nShow;
HINSTANCE hInstApp;
LPVOID    lpIDList;
LPCTSTR   lpClass;
HKEY      hkeyClass;
DWORD     dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE    hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


BOOL ShellExecuteEx(
_Inout_  SHELLEXECUTEINFO *pExecInfo
);


int _tmain(int argc, _TCHAR* argv[])

{
// split the program name into two chunks by :
ULONG SEE_MASK_CLASSNAME = (0x00000001);
char* p = strtok((char*)argv[0], ":");
char drive[3] = { "d:" };
sprintf(drive, "%s:", p); // Create and clear out the shellexecuteinfo
SHELLEXECUTEINFO ShExecInfo;
memset(&ShExecInfo, 0, sizeof(SHELLEXECUTEINFO)); // Set all the parameters
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_CLASSNAME;
ShExecInfo.lpClass = _T("AudioCD");
ShExecInfo.lpVerb = _T("play");
ShExecInfo.hwnd = NULL;
ShExecInfo.lpFile = NULL;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = (LPCWSTR)drive; // drive letter
ShExecInfo.nShow = SW_SHOW; // show the app on screen
ShExecInfo.hInstApp = NULL;

BOOL result = ShellExecuteEx(&ShExecInfo);
if (!result)
{
DWORD error = GetLastError();
return error;
}

return 0;
}