Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - naderST

#41
grupo es un arreglo, debes acceder a un elemento de dicho arreglo con el operador [] para así poder acceder a los capos de la estructura alumno. Ej

grupo[0].precio
#42
Donde declaras la variable r como float, la declaras como char y en el scanf() utilizas %c y no %f.
#43
Programación C/C++ / Re: Números capicúa
10 Marzo 2013, 00:21 AM
Aquí tienes uno de N dígitos


#include <stdio.h>
#include <string.h>
#define N 30

char num[N + 1]; // N dígitos máximo
int i, j, flag;

int main() {
    printf("Número: ");
    scanf("%s", num);

    j = strlen(num) - 1;
    flag = 1;

    // Validar si es de un dígito
    if(j == i)
        flag = 0;

    while(j > i)
        if(num[i++] != num[j--]) {
            flag = 0;
            break;
        }

    if(flag)
        printf("Es capicua\n");
    else
        printf("No es capicua\n");

    return 0;
}
#44
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_RICKROLL);

Cambia ese valor por NULL.
#46
nombre tiene un máximo de 20 caracteres, no se por qué utilizas 80. Qué problema te da?
#47
Programación C/C++ / Re: Duda GetProcAddress
5 Marzo 2013, 03:38 AM
Muchas gracias por la aclaratoria x64Core esa era mi duda
#48
Programación C/C++ / Re: Duda GetProcAddress
5 Marzo 2013, 03:15 AM
Mi duda me surge cuando vi este código:


#include <windows.h>
#include <stdio.h>

typedef int (WINAPI *_MessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT);

struct sTDatos_MessageBoxA
{
    _MessageBoxA direccionMessageBoxA;
    char titulo[255], texto[255];
};

typedef struct sTDatos_MessageBoxA TDatos_MessageBoxA;

void Hilo_MessageBoxA(TDatos_MessageBoxA *datos)
{
    datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0);
}

void Inyectar_MessageBoxA(DWORD pID, char* titulo, char* texto)
{
    DWORD tamFunc;
    HANDLE tHandle, funcionRemota;
    TDatos_MessageBoxA datos, *direccionDatosRemotos;
    void* direccionFuncionRemota;

    tHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, 0, pID);

    datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");
    sprintf(datos.titulo, titulo);
    sprintf(datos.texto, texto);

    direccionDatosRemotos = (TDatos_MessageBoxA*)VirtualAllocEx(tHandle, 0, sizeof(TDatos_MessageBoxA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(tHandle, direccionDatosRemotos, &datos, sizeof(TDatos_MessageBoxA), NULL);

tamFunc = (DWORD)Inyectar_MessageBoxA - (DWORD)Hilo_MessageBoxA;

direccionFuncionRemota = VirtualAllocEx(tHandle, 0, tamFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(tHandle, direccionFuncionRemota, (void*)Hilo_MessageBoxA, tamFunc, NULL);

funcionRemota = CreateRemoteThread(tHandle, NULL, 0, (LPTHREAD_START_ROUTINE)direccionFuncionRemota, direccionDatosRemotos, 0, NULL);

WaitForSingleObject(funcionRemota,INFINITE);
   CloseHandle(funcionRemota);

   VirtualFreeEx(tHandle,direccionFuncionRemota,0,MEM_RELEASE);
   VirtualFreeEx(tHandle,direccionDatosRemotos,0,MEM_RELEASE);   

   CloseHandle(tHandle);   
}

int main()
{
    DWORD pID;
    HWND hWnd;

    hWnd = FindWindow("SciCalc", NULL);

    if(hWnd!=NULL)
    {
        GetWindowThreadProcessId(hWnd, &pID);
        Inyectar_MessageBoxA(pID, "descifra.me", "Codigo inyectado!");
    }

    return 0;
}


Cómo es que al crear un hilo en otro proceso se puede utilizar esta dirección en el hilo creado en el otro proceso:

datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");

Me surge la duda porque la llamada a GetModuleHandle se hace en un proceso distinto.
#49
Programación C/C++ / Duda GetProcAddress
5 Marzo 2013, 02:41 AM
Buenas a todos, he visto varios códigos donde hacen algo como esto:


GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");


Entiendo que obtiene la dirección de memoria de la función MessageBoxA, pero lo que no logro entender es cómo es que es la misma dirección para todos los procesos? No se si me explico bien, pero no entiendo como funciona esto.
#50
(((mes<1) || (mes>12))

Si el mes es menor a uno y mayor a doce? Esto sería más bien así:

mes>=1 && mes<=12

Todas las comparaciones las deberías hacer estrictamente, es decir, mayor o igual y menor o igual

EDIT:

No te hace falta la comparación del rango en el cual está comprendido el mes, ya que compruebas directamente con el número del mes.