elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: 1 ... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 [69] 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 ... 123
681  Programación / ASM / Re: Ayuda con ejercicios de ensamblador 8086 en: 14 Diciembre 2015, 07:33 am
Sí, te podemos ayudar, que es lo que no entiendes o donde te quedas atascado? enseñanos lo que llevas programado  :rolleyes:
682  Programación / Programación C/C++ / Re: Pequeña duda sobre punteros en: 13 Diciembre 2015, 19:58 pm
No puedes declarar dos variables con el mismo nombre en la misma función  :xD

Si hubieras probado te habrías dado cuenta.

683  Programación / Programación C/C++ / Re: Offests de los miembros de la estructura DEVMODE en: 13 Diciembre 2015, 16:22 pm
En realidad no tiene que llevar los union, fijate en este mismo ejemplo de la msdn:

https://msdn.microsoft.com/en-us/library/aa251430(v=vs.60).aspx

Código
  1. typedef struct _devicemode {    /* dvmd */
  2.    TCHAR  dmDeviceName[32];
  3.    WORD   dmSpecVersion;
  4.    WORD   dmDriverVersion;
  5.    WORD   dmSize;
  6.    WORD   dmDriverExtra;
  7.    DWORD  dmFields;
  8.    short  dmOrientation;
  9.    short  dmPaperSize;
  10.    short  dmPaperLength;
  11.    short  dmPaperWidth;
  12.    short  dmScale;
  13.    short  dmCopies;
  14.    short  dmDefaultSource;
  15.    short  dmPrintQuality;
  16.    short  dmColor;
  17.    short  dmDuplex;
  18.    short  dmYResolution;
  19.    short  dmTTOption;
  20.    short  dmCollate;
  21.    TCHAR  dmFormName[32];
  22.    WORD   dmUnusedPadding;
  23.    USHORT dmBitsPerPel;
  24.    DWORD  dmPelsWidth;
  25.    DWORD  dmPelsHeight;
  26.    DWORD  dmDisplayFlags;
  27.    DWORD  dmDisplayFrequency;
  28. } DEVMODE;

WORD = 2 bytes
DWORD = 4 bytes
TCHAR [32] = 32 bytes
USHORT = 2 bytes
short = 2 bytes

Espero que ahora si lo puedas resolver.
684  Programación / Programación C/C++ / Re: Offests de los miembros de la estructura DEVMODE en: 13 Diciembre 2015, 16:06 pm
En C#

Código
  1. Structure DEVMODE
  2.    Public Const CCHDEVICENAME As Integer = 32
  3.    Public Const CCHFORMNAME As Integer = 32
  4.  
  5.    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHDEVICENAME)> _
  6.    <System.Runtime.InteropServices.FieldOffset(0)> _
  7.    Public dmDeviceName As String
  8.    <System.Runtime.InteropServices.FieldOffset(32)> _
  9.    Public dmSpecVersion As Int16
  10.    <System.Runtime.InteropServices.FieldOffset(34)> _
  11.    Public dmDriverVersion As Int16
  12.    <System.Runtime.InteropServices.FieldOffset(36)> _
  13.    Public dmSize As Int16
  14.    <System.Runtime.InteropServices.FieldOffset(38)> _
  15.    Public dmDriverExtra As Int16
  16.    <System.Runtime.InteropServices.FieldOffset(40)> _
  17.    Public dmFields As DM
  18.    <System.Runtime.InteropServices.FieldOffset(44)> _
  19.    Private dmOrientation As Int16
  20.    <System.Runtime.InteropServices.FieldOffset(46)> _
  21.    Private dmPaperSize As Int16
  22.    <System.Runtime.InteropServices.FieldOffset(48)> _
  23.    Private dmPaperLength As Int16
  24.    <System.Runtime.InteropServices.FieldOffset(50)> _
  25.    Private dmPaperWidth As Int16
  26.    <System.Runtime.InteropServices.FieldOffset(52)> _
  27.    Public dmScale As Int16
  28.    <System.Runtime.InteropServices.FieldOffset(54)> _
  29.    Public dmCopies As Int16
  30.    <System.Runtime.InteropServices.FieldOffset(56)> _
  31.    Private dmDefaultSource As Int16
  32.    <System.Runtime.InteropServices.FieldOffset(58)> _
  33.    Private dmPrintQuality As Int16
  34.    <System.Runtime.InteropServices.FieldOffset(44)> _
  35.    Public dmPosition As POINTL
  36.    <System.Runtime.InteropServices.FieldOffset(52)> _
  37.    Public dmDisplayOrientation As Int32
  38.    <System.Runtime.InteropServices.FieldOffset(56)> _
  39.    Public dmDisplayFixedOutput As Int32
  40.    <System.Runtime.InteropServices.FieldOffset(60)> _
  41.    Public dmColor As Short
  42.    <System.Runtime.InteropServices.FieldOffset(62)> _
  43.    Public dmDuplex As Short
  44.    <System.Runtime.InteropServices.FieldOffset(64)> _
  45.    Public dmYResolution As Short
  46.    <System.Runtime.InteropServices.FieldOffset(66)> _
  47.    Public dmTTOption As Short
  48.    <System.Runtime.InteropServices.FieldOffset(68)> _
  49.    Public dmCollate As Short
  50.    <System.Runtime.InteropServices.FieldOffset(72)> _
  51.    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHFORMNAME)> _
  52.    Public dmFormName As String
  53.    <System.Runtime.InteropServices.FieldOffset(102)> _
  54.    Public dmLogPixels As Int16
  55.    <System.Runtime.InteropServices.FieldOffset(104)> _
  56.    Public dmBitsPerPel As Int32
  57.    <System.Runtime.InteropServices.FieldOffset(108)> _
  58.    Public dmPelsWidth As Int32
  59.    <System.Runtime.InteropServices.FieldOffset(112)> _
  60.    Public dmPelsHeight As Int32
  61.    <System.Runtime.InteropServices.FieldOffset(116)> _
  62.    Public dmDisplayFlags As Int32
  63.    <System.Runtime.InteropServices.FieldOffset(116)> _
  64.    Public dmNup As Int32
  65.    <System.Runtime.InteropServices.FieldOffset(120)> _
  66.    Public dmDisplayFrequency As Int32
  67. End Structurecode

ó:

Código
  1. [/ [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
  2.    struct DEVMODE
  3.    {
  4.        public const int CCHDEVICENAME = 32;
  5.        public const int CCHFORMNAME = 32;
  6.  
  7.        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
  8.        [System.Runtime.InteropServices.FieldOffset(0)]
  9.        public string dmDeviceName;
  10.        [System.Runtime.InteropServices.FieldOffset(32)]
  11.        public Int16 dmSpecVersion;
  12.        [System.Runtime.InteropServices.FieldOffset(34)]
  13.        public Int16 dmDriverVersion;
  14.        [System.Runtime.InteropServices.FieldOffset(36)]
  15.        public Int16 dmSize;
  16.        [System.Runtime.InteropServices.FieldOffset(38)]
  17.        public Int16 dmDriverExtra;
  18.        [System.Runtime.InteropServices.FieldOffset(40)]
  19.        public DM dmFields;
  20.  
  21.        [System.Runtime.InteropServices.FieldOffset(44)]
  22.        Int16 dmOrientation;
  23.        [System.Runtime.InteropServices.FieldOffset(46)]
  24.        Int16 dmPaperSize;
  25.        [System.Runtime.InteropServices.FieldOffset(48)]
  26.        Int16 dmPaperLength;
  27.        [System.Runtime.InteropServices.FieldOffset(50)]
  28.        Int16 dmPaperWidth;
  29.        [System.Runtime.InteropServices.FieldOffset(52)]
  30.        Int16 dmScale;
  31.        [System.Runtime.InteropServices.FieldOffset(54)]
  32.        Int16 dmCopies;
  33.        [System.Runtime.InteropServices.FieldOffset(56)]
  34.        Int16 dmDefaultSource;
  35.        [System.Runtime.InteropServices.FieldOffset(58)]
  36.        Int16 dmPrintQuality;
  37.  
  38.        [System.Runtime.InteropServices.FieldOffset(44)]
  39.        public POINTL dmPosition;
  40.        [System.Runtime.InteropServices.FieldOffset(52)]
  41.        public Int32 dmDisplayOrientation;
  42.        [System.Runtime.InteropServices.FieldOffset(56)]
  43.        public Int32 dmDisplayFixedOutput;
  44.  
  45.        [System.Runtime.InteropServices.FieldOffset(60)]
  46.        public short dmColor;
  47.        [System.Runtime.InteropServices.FieldOffset(62)]
  48.        public short dmDuplex;
  49.        [System.Runtime.InteropServices.FieldOffset(64)]
  50.        public short dmYResolution;
  51.        [System.Runtime.InteropServices.FieldOffset(66)]
  52.        public short dmTTOption;
  53.        [System.Runtime.InteropServices.FieldOffset(68)]
  54.        public short dmCollate;
  55.        [System.Runtime.InteropServices.FieldOffset(72)]
  56.        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
  57.        public string dmFormName;
  58.        [System.Runtime.InteropServices.FieldOffset(102)]
  59.        public Int16 dmLogPixels;
  60.        [System.Runtime.InteropServices.FieldOffset(104)]
  61.        public Int32 dmBitsPerPel;
  62.        [System.Runtime.InteropServices.FieldOffset(108)]
  63.        public Int32 dmPelsWidth;
  64.        [System.Runtime.InteropServices.FieldOffset(112)]
  65.        public Int32 dmPelsHeight;
  66.        [System.Runtime.InteropServices.FieldOffset(116)]
  67.        public Int32 dmDisplayFlags;
  68.        [System.Runtime.InteropServices.FieldOffset(116)]
  69.        public Int32 dmNup;
  70.        [System.Runtime.InteropServices.FieldOffset(120)]
  71.        public Int32 dmDisplayFrequency;
  72.    }
  73. code]
685  Programación / Ingeniería Inversa / Re: Problema con OllyDbg y ejecutables en FASM en: 13 Diciembre 2015, 01:48 am
hay que mirar las opciones del olly para ver donde está parando, puede estar configurado en system breakpoint en lugar de entry point

Esta en WinMain.

A ver si subo el exe.
686  Seguridad Informática / Análisis y Diseño de Malware / Re: El arte del API Hooking. en: 12 Diciembre 2015, 22:25 pm
Para hacer eso, solo hay que establecer una bandera, para que nuestro gancho sepa cuando modificar los parámetros y cuando no, fíjate:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.        USER32          db 'USER32.DLL',0
  6.        funcion         db 'MessageBoxA',0
  7.        dirfun          dd ?
  8.        proteccion      dd ?
  9.        msghook         db 'API Hookeada!',0
  10.  
  11.        HookState       dd 0
  12.  
  13. .code
  14. start:
  15.  
  16.    call Hook
  17.  
  18.    invoke MessageBoxA,0,msg1,0,0
  19.  
  20.    mov [HookState],1      ; No Hook
  21.  
  22.    invoke MessageBoxA,0,msg1,0,0
  23.  
  24.    mov [HookState],0   ; Hook de nuevo
  25.  
  26.    invoke MessageBoxA,0,msg1,0,0
  27.  
  28.    ret
  29.  
  30.    proc Hook
  31.        mov [HookState],0
  32.  
  33.        invoke LoadLibrary, USER32
  34.        invoke GetProcAddress,eax,funcion   ; Obtenemos la  direccion de la función
  35.        mov [dirfun],eax
  36.  
  37.        mov ebx,eax
  38.  
  39.        mov eax, mMessageBox     ; Calculamos el salto relativo.
  40.        sub eax,ebx
  41.        sub eax,5
  42.  
  43.  
  44.        push eax
  45.  
  46.        invoke VirtualProtect,[dirfun],5,PAGE_EXECUTE_READWRITE,addr proteccion   ; damos derechos de acceso.
  47.  
  48.        pop eax
  49.  
  50.        mov ebx, [dirfun]
  51.  
  52.        mov byte[ebx],0xE9  ;escribimos un jmp al inicio de la API verdadera
  53.        inc ebx
  54.        mov dword[ebx],eax   ; escribimos el salto que tiene que dar en el inicio de la api verdadera
  55.        add ebx,4
  56.  
  57.        ret
  58.    endp
  59.  
  60.    proc mMessageBox     ; Funcion que saltará cuando el programa llame a la API Original
  61.        cmp [HookState],1 ; Si no queremos que se establezca el hook
  62.        je NoHook
  63.  
  64.        pop eax       ; obtenemos la direccion de retorno que introdujo el call
  65.  
  66.        pop ebx       ; sacamos los parametros original que se pasaron a la API
  67.        pop ebx
  68.        pop ebx
  69.        pop ebx
  70.  
  71.        push 0       ; Introducimos los parametros que queremos que ejecute nuestra API
  72.        push 0
  73.        push msghook
  74.        push 0
  75.  
  76.        push eax
  77.  
  78.        NoHook:
  79.  
  80.        mov edi, edi    ; Ejecutamos los 5 primeros bytes originales de la API
  81.        push ebp
  82.        mov ebp, esp
  83.  
  84.        mov ebx, [dirfun]   ; Calculamos el salto hacia la API original
  85.        add ebx,5
  86.  
  87.        jmp ebx           ; Saltamos a la direccion de la API original + 5 bytes
  88.  
  89.        ret
  90.    endp
  91.  
  92. .end start      

Sí, si la gente se interesa seguiré escribiendo cosillas.
687  Seguridad Informática / Análisis y Diseño de Malware / Re: El arte del API Hooking. en: 12 Diciembre 2015, 22:00 pm
Hola kub0x !

El problema en tu código es que imagínate que las primeras instrucciones no ocupan la longitud que tu esperas, que crees que pasaría?  :laugh:

Lo que yo hice para implementar eso mismo fue hacer una tabla con las instrucciones mas comunes que solían aparecer en los primeros bytes y ya calcular cuando ocupaban.

saludos.
688  Seguridad Informática / Análisis y Diseño de Malware / El arte del API Hooking. en: 12 Diciembre 2015, 21:18 pm
Bueno, en este texto voy a intentar explicar de que se trata el API hooking.

Una descripción rapida de lo que es este metodo sería algo así: realizar un gancho a una función del sistema para poder modificar su retorno o bién sus parametros.

¿Que podemos hacer con este metodo?

Pues de todo lo que se nos ocurra desde ocultar archivos, procesos, hasta espiar conversaciones de skype, bloquear llamadas al sistema de detecminados procesos, etc.


¿Que nociones debo tener para aplicar correctamente esta técnica?


Se deberá tener nociones de ensamblador, ademas el ejemplo que aquí usare esta en FASM, además de saber manejar un poco Ollydbg.


¿En que consiste dicha técnica?

Consiste en modificar los primeros bytes de la funcion que queremos hookear,  en esos primeros bytes escribiremos un salto a nuestra funcion (Que emulara la función original pero con los parametros que nosotros queramos).

Para modificar los primeros bytes de la API deberémos dar permisos de escritura y ejecución ya que si no no podremos escribir nuestro salto.


Dicho todo esto pasemos al código y a aprender su funcionamiento.

En este caso hookearemos la API  MessageBoxA, para ello crearemos nuestro propio ejecutable:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.  
  6.  
  7. .code
  8. start:
  9.  
  10.    invoke MessageBoxA,0,msg1,0,0
  11.    ret
  12.  
  13. .end start                    

la salida del programa es la siguiente:



Obtetivo: que nuestro programa cante lo que nosotros queramos.

El primer paso será ver el inicio de la API desde el olly DBG para que cuando nosotros escribamos el salto no dejemos ninguna instruccion a medias (si dejamos alguna instruccion a medias nuestro programa petara)

Asique abrimos OllyDbg y vemos que contiene el inicio de la API.



A nosotros en realidad solo nos interesan los primero 5 bytes, que es lo que ocupa el salto (jmp + Direccion).

En este caso nos viene perfecto ya que las 3 primeras instrucciones:

Código
  1. mov edi, edi
  2. push ebp
  3. mov ebp, esp

Ocupan exactamente 5 bytes.

Bien, copiamos esas 3 instrucciones y las guardamos en un archivo de texto para no olvidarlas, ya que nos harán falta mas adelante.

Una vez hecho esto, lo que haremos será lo siguiente, obtendremos la dirección de MessageBoxA, y sobreescribiremos sus primeros bytes para que salte a nuestra función.

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.        USER32          db 'USER32.DLL',0
  6.        funcion         db 'MessageBoxA',0
  7.        dirfun          dd ?
  8.        proteccion      dd ?
  9.  
  10. .code
  11. start:
  12.  
  13.    call Hook
  14.  
  15.    invoke MessageBoxA,0,msg1,0,0
  16.    ret
  17.  
  18.    proc Hook
  19.        invoke LoadLibrary, USER32
  20.        invoke GetProcAddress,eax,funcion   ; Obtenemos la  direccion de la función
  21.        mov [dirfun],eax
  22.  
  23.        mov ebx,eax
  24.  
  25.        mov eax, mMessageBox     ; Calculamos el salto relativo.
  26.        sub eax,ebx
  27.        sub eax,5
  28.  
  29.  
  30.        push eax
  31.  
  32.        invoke VirtualProtect,[dirfun],5,PAGE_EXECUTE_READWRITE,addr proteccion   ; damos derechos de acceso.
  33.  
  34.        pop eax
  35.  
  36.        mov ebx, [dirfun]
  37.  
  38.        mov byte[ebx],0xE9  ;escribimos un jmp al inicio de la API verdadera
  39.        inc ebx
  40.        mov dword[ebx],eax   ; escribimos el salto que tiene que dar en el inicio de la api verdadera
  41.        add ebx,4
  42.  
  43.        ret
  44.    endp
  45.  
  46.    proc mMessageBox     ; Funcion que saltará cuando el programa llame a la API Original
  47.  
  48.        ret
  49.    endp
  50.  
  51. .end start    


El texto esta comentado pero de igual forma puntualizaré algunas cosillas.

1- Para poder escribir sobre la API original es OBLIGATORIO dar derechos de escritura, en este ejemplo esto se hace con VirtualProtect
2- Tendremos que calcular el salto relativo a nuestra función,  como se ve claramente en el código
3- Llegados a este punto ya tenemos establecido el hook por lo que si probamos a ejecutar el programa de arriba no imprimira nada en pantalla, ya que hemos roto los primeros bytes de la API, es más, queda totalmente inutilizada llegados a este punto.

Ahora tendremos que programar la funcion mMessageBox, para que cante lo que nosotros queramos.

Algunos datos que tenemos que tener en cuenta es que los valores que se introdujeron en la pila sigue ahí, junto con la dirección de retorno de la función, nosotros tendremos que recuperar la funcion de retorno para que el programa siga su ejecución correctamente.

Para aplicar esto debemos saber que, al realizar un call lo que hace el procesador es introducir en la pila la siguiente instruccion que se ejecutara cuando la función a la que llamamos retorne. Por eso lo que nosotros hacemos será recuperarla, introducir lo que nosotros queramos que cante la API, ejecutar los primeros bytes originales de la API y saltar a la dirección original de la API + 5 bytes (recordemos que en esos primeros 5 bytes esta el hook, por eso los emulamos desde nuestra funcion).

Ahí va el código completo del hook comentado.

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.        USER32          db 'USER32.DLL',0
  6.        funcion         db 'MessageBoxA',0
  7.        dirfun          dd ?
  8.        proteccion      dd ?
  9.        msghook         db 'API Hookeada!',0
  10.  
  11. .code
  12. start:
  13.  
  14.    call Hook
  15.  
  16.    invoke MessageBoxA,0,msg1,0,0
  17.    ret
  18.  
  19.    proc Hook
  20.        invoke LoadLibrary, USER32
  21.        invoke GetProcAddress,eax,funcion   ; Obtenemos la  direccion de la función
  22.        mov [dirfun],eax
  23.  
  24.        mov ebx,eax
  25.  
  26.        mov eax, mMessageBox     ; Calculamos el salto relativo.
  27.        sub eax,ebx
  28.        sub eax,5
  29.  
  30.  
  31.        push eax
  32.  
  33.        invoke VirtualProtect,[dirfun],5,PAGE_EXECUTE_READWRITE,addr proteccion   ; damos derechos de acceso.
  34.  
  35.        pop eax
  36.  
  37.        mov ebx, [dirfun]
  38.  
  39.        mov byte[ebx],0xE9  ;escribimos un jmp al inicio de la API verdadera
  40.        inc ebx
  41.        mov dword[ebx],eax   ; escribimos el salto que tiene que dar en el inicio de la api verdadera
  42.        add ebx,4
  43.  
  44.        ret
  45.    endp
  46.  
  47.    proc mMessageBox     ; Funcion que saltará cuando el programa llame a la API Original
  48.        pop eax       ; obtenemos la direccion de retorno que introdujo el call
  49.  
  50.        pop ebx       ; sacamos los parametros original que se pasaron a la API
  51.        pop ebx
  52.        pop ebx
  53.        pop ebx
  54.  
  55.        push 0       ; Introducimos los parametros que queremos que ejecute nuestra API
  56.        push 0
  57.        push msghook
  58.        push 0
  59.  
  60.        push eax     ; Introducimos la direccion de retorno original
  61.  
  62.        mov edi, edi    ; Ejecutamos los 5 primeros bytes originales de la API
  63.        push ebp
  64.        mov ebp, esp
  65.  
  66.        mov ebx, [dirfun]   ; Calculamos el salto hacia la API original
  67.        add ebx,5
  68.  
  69.        jmp ebx           ; Saltamos a la direccion de la API original + 5 bytes
  70.  
  71.        ret
  72.    endp
  73.  
  74. .end start

Ejecutamos nuestro programa y veremos que solo cantará lo que nosotros queramos.  :D



¿Pero, como puedo hookear una función que esta en otro proceso?

Estando en su mismo proceso, esto se puede conseguir inyectando nuestra DLL con el hook en el proceso o bién desde una inyección de código.

Bueno pues de momento eso ha sido todo, lo he intentado explicar de manera simple y para que se entienda bien.

Decir también que los ejemplos han sido desarrollados y probados en una máquina x64 con Windows 7.

Cualquier duda o colsulta será respondida gustosamente.

saludos!

689  Programación / Ingeniería Inversa / Problema con OllyDbg y ejecutables en FASM en: 12 Diciembre 2015, 20:26 pm
Bueno pues el caso es que cuando cargo mi programa hecho en FASM para debuguearlo antes me carga una serie de instrucciones y unos SYSENTER que no los he programado yo y de hecho en ocasiones nisiquiera salen las instrucciones verdaderas que yo programe o ni aparecen  :huh:

alguien sabe algo?

saludos.
690  Programación / Programación C/C++ / Re: ¿Como cambiar un puntero de caracteres desde otra función? en: 12 Diciembre 2015, 20:01 pm
Como te dice Coper, vas a tener problemas para hacerlo porque la memoria es de solo lectura pero dandole privilegios lo puedes lograr. Aparte de eso si la cadena nueva es mas grande que la vieja puedes tener problemas porque puedes sobreescribir otros datos, en tu caso esto no pasará ya que las dos cadenas son identicas.

Aquí te dejo como lograrlo:

Código
  1. // Juan fary (mDrinky)
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <windows.h>
  6.  
  7. void hacerIgualAChauMundo(char * cadena) {
  8.    char * adios = "Chau mundo";
  9.    DWORD ViejaPro;
  10.  
  11.    VirtualProtect(cadena, strlen(adios),PAGE_READWRITE,&ViejaPro); // obtenemos derechos de acceso
  12.  
  13.    memcpy(cadena,adios,strlen(adios)); // Copiamos nuestra nueva cadena
  14. }
  15.  
  16. int main() {
  17.    char *cadena = "Hola mundo";
  18.  
  19.    hacerIgualAChauMundo(cadena);
  20.  
  21.    printf("%s\n",cadena);
  22.  
  23.    return 0;
  24. }
  25.  

saludos.
Páginas: 1 ... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 [69] 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 ... 123
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines