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 - x64core

#641
Cita de: amchacon en 20 Marzo 2013, 23:09 PM

Pues es una buena pregunta, al pasar un cast como void nos quedaría algo así:

void eliminar_espacios(char *contenido_linea) {
...
return;


Es decir, no devuelves nada.

Seguro, yo realmente no entiendo lo que querian ellos hacer.

-

Por cierto, El codigo de Khronos14 genera una excepción.

#642
Cita de: Khronos14 en 20 Marzo 2013, 22:15 PM
amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena.

Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault.


void eliminar_espacios(char *contenido_linea) {
char *cadena_temporal = (char *)malloc(strlen(contenido_linea) + 1);

while(*contenido_linea) {
if((*contenido_linea != 32) && (*contenido_linea != '\t')) {
contenido_linea++;
} else {
*cadena_temporal = *contenido_linea;
*(++cadena_temporal) = '\0';
}
}

return (void)contenido_linea;
}



Saludos.

???

-

Por cierto, alguien me puede explicar que es esto:

void eliminar_espacios(char *contenido_linea) {
...
return (void)contenido_linea;



#643
Cita de: amchacon en 20 Marzo 2013, 21:10 PM
El fallo está en la condición del while:

while(*contenido_linea)
Esa condición siempre va a ser cierta, incluso aunque se sobrepase la cadena (no tienes garantía que haya un NULL al final!).

Está es la alternativa que te propongo:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>

int main()
{
   char* contenido_linea = "Cosita linda y hermosa";
   char* cadena_temporal = (char *)malloc(255);
   int tamanyo = strlen(contenido_linea);
   int i = 0;
   int posicion = 0;

for (i = 0; i < tamanyo;i++)
{
if((contenido_linea[i] != 32) && (contenido_linea[i] != '\t')) {
cadena_temporal[posicion] = contenido_linea[i];
posicion++;
}
}
   cadena_temporal[posicion] = '\0'; // Añadimos el caracter nulo al final
   printf("%s",cadena_temporal);
   return 0;
}


Que quieres decir que la condición while es incorrecta?
Igual si se le pasa a strlen una secuencia de bytes sin ninguna garantización que haya un null, también fallaria.
o algun valor incorrecto, lo mejor seria depurar el codigo. Por cierto, si yo pasara una cadena con una longitud de 1000 con ningun espacio y el buffer
reservado es de 255 bytes?


mi version:

Código (cpp) [Seleccionar]


PCHAR StrRemoveSpace(PCHAR lpStr)
{
   PCHAR lpStrRet;
   PCHAR lpStrIndx;
   SIZE_T MaxSizeOfStr;
   
   
   if(!lpStr)
       return FALSE;
   
   MaxSizeOfStr = strlen(lpStr);
   if(!(MaxSizeOfStr > 0))
       return FALSE;
       
   lpStrRet = lpStrIndx = (PCHAR) malloc(MaxSizeOfStr);
   if(!lpStrRet)
       return FALSE;
   
   for(INT x = 0; x < MaxSizeOfStr+1; x++)
   {  
       if(lpStr[x] != 32)
           *lpStrIndx++ = lpStr[x];
       
   }
   return lpStrRet;
}



Comprueba cualquier tipo de valor incorrecto o no esperado, y para más seguridad podrias agregar un controlador de excepcion, debido a que podria aún darse una.

#644
Estas usando GetWindowText ( #ifdef UNICODE ) Al parecer version Unicode puedes cambiar a GetWindowTextA explicitamente o usar
otra funcion en lugar de cout como por ejemplo wprintf, además seria buena obtener la longitud del titulo de la ventana antes.
#645
Cita de: [Kayser] en 20 Marzo 2013, 18:21 PM

No entiendo porque se sustraen 4 bytes al registro esp y despues se mueve lo que hay en ebp-4 a eax.

Alguien puede echarme una mano?
Aun estoy verde en ASM  :P

Reserva un DWORD en la pila para uso local de la función.
Aunque en realidad esto no tiene sentido ( pasar un dato no inicializado? ), supongo que es solo para saber.
#646
Programación C/C++ / Re: Array Unicode
20 Marzo 2013, 07:25 AM
Existen funciones que te facilitan la conversion:
MultiByteToWideChar
WideCharToMultiByte
#647
Cita de: Arkhin en 20 Marzo 2013, 01:55 AM
Buenas, hace tiempo ya que programo, pero no en este magnifico lenguaje. Programo en Visual Basic hace ya un tiempo largo y cuando empeze a investigar y conocer el debuggin en ensamblador, comenze a aumentar mis horizontes. Tengo algo basico en programacion en C, pero tengo codigos base de inyecciones de DLLS como para guiarme.
La idea que tengo es la siguiente, de por si ya se como inyectarme en un programa por medio de una dll. Ahora, estando YO inyectado en ese programa, ya soy parte del programa por lo tanto si fuera ASM y quisiera hacer una llamada a X funcion del programa, podria hacerlo libremente ya que soy parte dle mismo, por lo tanto puedo llamar a adress del mismo. Mi intención es inyectarme en un juego online, y llamar a funciones como por ejemplo, para equipar/desequipar un objeto. EL juego esta hecho en VB por lo tanto es bastante facil manipularlo, de hecho por dar un ejemplo, con llamar al adress 004BC23A (Por dar un ejemplo) ya estaria equipando/desequipando el objeto seleccionado, y editando una variable de memoria podriamos editar el objeto que seleccionó. Lo que quiero hacer es poder llamar a ese adress desde la dll en C, y luego de buscar realmente no encuentro como hacerlo, si pueden ayudarme con sus grandes conocimientos se los agradeceria.

¿Así que cual es el problema?
Creo que todo lo has dicho, buscar la dirección de la función, analizarla ( convención de llamada, Number de parametros , Tipo de los parametros, etc )
Programar la DLL, inyectarla, Comprobar algunos patrones posibles ( recomendable ), Llamar a la funcíon. Se más especifico con tu problema, lo que quiero decir es,
Ya que dices que tienes algunos codigos de inyecciónes y al parecer sabes lo que estas haciendo, Cual es el problema?
Por cierto, esto no tiene nada que ver con ASM y C/C++. todo lo mencionado se puede hacer tanto en C/C++ como en Ensamblador.
#648
ASM / Re: GUI y eventos
17 Marzo 2013, 00:37 AM
Cita de: mDrinky en 16 Marzo 2013, 23:33 PM
Tampoco le da el foco con Beep@Kernel32.dll  :-\

En realidad me referia que usando MessageBox window le da el foco al cuadro de texto no que Beep le daria el foco, Beep se usaria solo para saber que el EIP pasa por ahi. un winproc en C no tengo ningun problema, o talvez puedes explicar mejor lo que buscas o talvez lo encuentres en el winproc, nitemact tiene toda la information que estas pidiendo:


// test only
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  static   char           szColumnHeader[][12] = {" col1", "col2", "col3"};
  static   Item           ListItem[3];
  static   HWND           hWndListView;
  static   LV_ITEM        lv;
  int                     index;
  int                     iiWidth[3];
  LV_COLUMN               lvC;
  RECT                    rect;

  LV_DISPINFO             *Lvinfo;
  NMITEMACTIVATE          *nitemact;

  switch (iMsg)
  {
  case WM_CREATE :
     hWndListView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW,"", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS,0, 0, 0, 0, hwnd,(HMENU)ID_LISTVIEW, NULL, NULL);
     ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

     iiWidth[0] = 100;
     iiWidth[1] = 100;
     iiWidth[2] = 100;

     lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
     lvC.fmt = LVCFMT_LEFT;

     for(index = 0; index < 3; index++)
     {
        lvC.iSubItem = index;
        lvC.cx = iiWidth[index];
        lvC.pszText = szColumnHeader[index];
        ListView_InsertColumn(hWndListView,index,&lvC);
     }

     strcpy(ListItem[0].szItemNr, "item1");
     strcpy(ListItem[0].szItem, "subitem1");
     strcpy(ListItem[0].szItemDescription, "subitem1");

     strcpy(ListItem[1].szItemNr, "item2");
     strcpy(ListItem[1].szItem, "subitem2");
     strcpy(ListItem[1].szItemDescription, "subitem2");

     AdjustListView(hWndListView, &lv, index);
     break;

  case WM_SIZE :
     GetClientRect(hwnd, &rect);
     MoveWindow(hWndListView, 3, 3, rect.right - 6, rect.bottom - 6, 1);
     break;

  case WM_NOTIFY :
     switch(((LPNMnitemact)lParam)->code)
     {
     case NM_RCLICK :
         
        nitemact = (NMITEMACTIVATE *)lParam;
        break;
     case LVN_GETDISPINFO :
        Lvinfo = (LV_DISPINFO FAR*)lParam;
        if((((LPNMnitemact)lParam)->hwndFrom == hWndListView))
        {
           switch(Lvinfo->item.iSubItem)
           {
           case 0:
              Lvinfo->item.pszText =  ListItem[Lvinfo->item.iItem].szItemNr;
              break;
           case 1:
              Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItem;
              break;
           case 2:
              Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItemDescription;
              break;
           }
           break;
        }
     }
     
     break;
     
  case WM_CLOSE :
     DestroyWindow(hwnd);
     break;

  case WM_DESTROY :
     PostQuitMessage(0);
     break;
  }
  return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
#649
ASM / Re: GUI y eventos
16 Marzo 2013, 21:17 PM
Cita de: mDrinky en 16 Marzo 2013, 21:06 PM
Código (asm) [Seleccionar]

miWM_NOTIFY:
           mov eax,[lparam]
           add eax,0x8
           mov eax,[eax]  ; EAX = lparam->code


           .if eax = 0xFFFFFFFB ; NM_RCLICK
               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
           .endif

           jmp salirWPROC


Ahí me lo detecta bien el clic derecho pero no se me seleciona el item :S



Y si llamas a Beep en lugar de Messagebox debido a que Windows da el foco inmediatamente al box de mensaje?  :silbar:
#650
ASM / Re: GUI y eventos
16 Marzo 2013, 20:54 PM
Item,Subitem:

WM_NOTIFY->NM_RCLICK