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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 28
71  Programación / Programación C/C++ / Re: Porque dicen C y no C++ cuando... en: 25 Junio 2011, 06:28 am
la respuesta más obvia es que C++ "al traer más cosas" utiliza más "cosas", cuando se programan ese tipo de programas se busca que sean pequeños y que no llamen la atención... C++ tiene (utilizando la parte de objetos dado que de otra forma es "casi" igual a C) más dependencias (librerías propias de C++) que pueden llevarte a problemas de compatibilidad (exigir que la víctima tenga el runtime c++ de la versión del compilador o incluir dicho runtime en tu ejecutable y aumentar su tamaño, etc), C sin embargo al ser un lenguaje muy próximo a ASM (no por la sintaxis sino por la cercanía a lo que el procesador realmente ejecuta) tiene pocas dependencias...

S2

Aclaración: C++ depende mucho del compilador el soporte que tengas, mientras que C no...

EDIT: se me pifió lo de gramática por escribir rápido... :P
72  Seguridad Informática / Análisis y Diseño de Malware / Re: ¿como leer memoria protegida de un proceso y saber cuanto ocupa? en: 18 Junio 2011, 06:01 am
fíjate la API VirtualQuery, te devuelve los tamaños de las secciones de código y los flags de protección de los mismos...

S2
73  Programación / Programación C/C++ / Re: Caja de dialogo para seleccionar directorio. en: 2 Junio 2011, 19:45 pm
Como puedo hacer una caja de dialogo para seleccionar un directorio ? :-\.Lo que quiero es algo como el GetOpenFileName pero para seleccionar carpetas :).

fijate esta api: SHBrowseForFolder

S2
74  Programación / Programación C/C++ / Re: [Game-Hacking/Código] Programación de Cheats: hackeando el buscaminas en: 30 Mayo 2011, 08:41 am
no es por ser hdp, pero esto está explicado en 200 lugarares, usás el cheat engine y sacás la dirección, no es por menospreciar tu trabajo pero el título está mal (por el nivel de conocimientos)... no es un cheat esto, es un simplemente editar de memoria de un programa... no confundas las cosas (a lo sumo es un trainer)

S2
75  Programación / Programación C/C++ / Re: Ayuda con archivo binario, por favor. en: 22 Abril 2011, 09:20 am
lee y escribe de a bytes y no de a 4 bytes, con eso te aseguras copiar el contenido exactamente igual.

S2
76  Programación / Programación C/C++ / Re: Inyección de Codigo para API Hook en: 16 Abril 2011, 23:03 pm
Con respecto a la segunda forma que dijistes te refieres a inyección de DLL o a otra forma de hacer el hook inyectando código?

creo que la inyección de una dll suele ser la mejor opción, te permite hacer modificaciones de ser necesario en forma simple entre otras cosas (además de que es más fácil de implementar), la inyección de código es más para "parcheo" (cracking).

S2
77  Programación / Programación C/C++ / Re: Inyección de Codigo para API Hook en: 16 Abril 2011, 08:07 am
te repito, es poco productivo y poco compatible (lo más probable es que solo funcione en el SO que lo crees), de todas formas, si quieres seguir indagando en el tema fijate este link:

http://www.infomalware.net/t62-inyeccion-de-codigo-sin-dll

es de un user de este foro y lo más probable (como ya lo mensioné) es que esté publicado tb en este foro... ( hoo buscador, si te usaran! )

S2
78  Programación / Programación C/C++ / Re: dev-c++ ----> ¿void? en: 16 Abril 2011, 08:02 am
se debe a modificaciones del standart, en un principio C soportaba el "void main" pero actualmente (luego de muchos años) ya no es soportado y la mayoría de los compiladores te tirara ese warning o error directamente, la solución ya te la contestaron.

S2
79  Programación / Programación C/C++ / Re: Inyección de Codigo para API Hook en: 16 Abril 2011, 05:58 am
no podes hookear funciones de un proceso externo justamente porque es externo (otro espacio de memoria) para hookear algo tenes que estar en el mismo espacio de memoria... a lo sumo lo que podes hacer es (sin inyectar una dll) copiar el código a ejecutarse en el espacio de memoria del programa víctima y crear el hook en base a eso, pero sigue siendo más simple y efectivo la inyección, de todas formas, de lo otro creo que hay varios códigos en esta misma web, sino google.

S2
80  Programación / Programación C/C++ / Code Virtualization en C en: 14 Abril 2011, 19:59 pm
buenas, tras tiempo depurando programas con códigos en parte virtualizados se me planteó la duda como hacer un sistema de virtualización de código, por eso armé "esto" que no está completo ni nada, pero que puede llegar a servir de ejemplo supongo  :P

el conjunto de instrucciones no está totalmente definido, solo definí un par de opcodes para hacer pruebas (faltan muchas instrucciones), además no está implementado la parte de modificación de flags del proceso.

Código
  1. #define _WIN32_WINNT 0x0500
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /*
  7. REGISTERS
  8. =========
  9. 0 eax
  10. 2 ebx
  11. E ecx
  12. 4 edx
  13. C ebp
  14. 6 esp
  15. A edi
  16. 8 esi
  17.  
  18. OPCODES
  19. =======
  20. 00 YYYYYYYY ->  jmp long
  21. 01 YYYY     ->  jmp short
  22. 02 YY       ->  jmp word
  23. 03 YYYY     ->  je  short
  24. 04 YY       ->  je  word
  25. 05 YYYY     ->  jne short
  26. 06 YY       ->  jne word
  27.  
  28. //MOV REG, 00000
  29. 14 YYYYYYYY ->  mov eax, long
  30. 15 YYYYYYYY ->  mov ecx, long
  31. 16 YYYYYYYY ->  mov edx, long
  32. 17 YYYYYYYY ->  mov ebx, long
  33. 18 YYYYYYYY ->  mov esp, long
  34. 19 YYYYYYYY ->  mov ebp, long
  35. 1A YYYYYYYY ->  mov esi, long
  36. 1B YYYYYYYY ->  mov edi, long
  37.  
  38. //MOV [REG-X], XXXXXXXX
  39. 1C XX YYYYYYYY ->  mov (R) , long ->  X reg X offset
  40.  
  41. //MOV REG, [REG-X]
  42. 1E XX  ->  mov eax, (R) ->  X reg X reg
  43. 1F XX  ->  mov ebx, (R)
  44. 20 XX  ->  mov ecx, (R)
  45. 21 XX  ->  mov edx, (R)
  46. 22 XX  ->  mov ebp, (R)
  47. 23 XX  ->  mov esp, (R)
  48. 24 XX  ->  mov edi, (R)
  49. 25 XX  ->  mov esi, (R)
  50.  
  51. //MOV REG, REG
  52. 26 XX  ->  mov R, R
  53.  
  54. //MOV [REG-X], REG
  55. 28 XX  ->  mov (R), eax ->  X reg X offset
  56. 29 XX  ->  mov (R), ebx
  57. 2A XX  ->  mov (R), ecx
  58. 2B XX  ->  mov (R), edx
  59. 2C XX  ->  mov (R), ebp
  60. 2D XX  ->  mov (R), esp
  61. 2E XX  ->  mov (R), edi
  62. 2F XX  ->  mov (R), esi
  63.  
  64. //SUB EDX, EAX
  65. 32 XX  ->  sub R, R   ->  X reg X reg
  66.  
  67. //LEA EAX, [EBP-8]
  68. 3C XX  ->  lea eax, (R) ->  X reg X reg
  69. 3D XX  ->  lea ebx, (R)
  70. 3E XX  ->  lea ecx, (R)
  71. 3F XX  ->  lea edx, (R)
  72. 40 XX  ->  lea ebp, (R)
  73. 41 XX  ->  lea esp, (R)
  74. 42 XX  ->  lea edi, (R)
  75. 43 XX  ->  lea esi, (R)
  76.  
  77. */
  78.  
  79. typedef struct _REGISTERS{
  80.  ULONG Edi;//00
  81.  ULONG Esi;//04
  82.  ULONG Ebp;//08
  83.  ULONG Esp;//0C
  84.  ULONG Ebx;//10
  85.  ULONG Edx;//14
  86.  ULONG Ecx;//18
  87.  ULONG Eax;//1C
  88.  ULONG Flg;//20
  89.  ULONG Eip;//24
  90. }REGISTERS, *PREGISTERS;
  91.  
  92. PULONG GetReg(PREGISTERS p,WORD reg){
  93.  PULONG ret=NULL;
  94.  switch(reg){
  95.    case 0x0:// eax
  96.      ret=&p->Eax;
  97.    break;
  98.    case 0x2:// ebx
  99.      ret=&p->Ebx;
  100.    break;
  101.    case 0xE:// ecx
  102.      ret=&p->Ecx;
  103.    break;
  104.    case 0x4:// edx
  105.      ret=&p->Edx;
  106.    break;
  107.    case 0xC:// ebp
  108.      ret=&p->Ebp;
  109.    break;
  110.    case 0x6:// esp
  111.      ret=&p->Esp;
  112.    break;
  113.    case 0xA:// edi
  114.      ret=&p->Edi;
  115.    break;
  116.    case 0x8:// esi
  117.      ret=&p->Esi;
  118.    break;
  119.  }
  120.  return ret;
  121. }
  122.  
  123. void decrypt(REGISTERS p){
  124.  PBYTE b=(PBYTE)p.Eip;
  125.  BYTE Reg=0,RegEx=0;
  126.  PULONG pReg=0,pRegEx=0;
  127.  CHAR Offset=0;
  128.  
  129.  //FIX ME!
  130.  b+=2;//lo ideal sería un long jmp, pero gcc no deja setearlo (o no se como)
  131.  
  132.  //Code Start!
  133.  while(*b!=0xF0){
  134.    switch(*b){
  135.      case 0x1C://MOV [REG-X], XXXXXXXX
  136.        Reg=*(++b);
  137.        Offset=Reg&0xF;
  138.        Reg>>=4;
  139.        if(Reg&0x1)
  140.          Offset=-Offset;
  141.        Reg&=0xE;
  142.        pReg=GetReg(&p,Reg);
  143.        *((PDWORD)(*pReg+Offset))=*(DWORD*)(++b);
  144.        b+=4;
  145.      break;
  146.      case 0x21://MOV EDX, [REG-X]
  147.        Reg=*(++b);
  148.        Offset=Reg&0xF;
  149.        Reg>>=4;
  150.        if(Reg&0x1)
  151.          Offset=-Offset;
  152.        Reg&=0xE;
  153.        pReg=GetReg(&p,Reg);
  154.        p.Edx=*((PDWORD)(*pReg+Offset));
  155.        ++b;
  156.      break;
  157.      case 0x1E://MOV EAX, [REG-X]
  158.        Reg=*(++b);
  159.        Offset=Reg&0xF;
  160.        Reg>>=4;
  161.        if(Reg&0x1)
  162.          Offset=-Offset;
  163.        Reg&=0xE;
  164.        pReg=GetReg(&p,Reg);
  165.        p.Eax=*((PDWORD)(*pReg+Offset));
  166.        ++b;
  167.      break;
  168.      case 0x32://SUB REG,REG
  169.        Reg=*(++b);
  170.        RegEx=Reg&0xF;
  171.        Reg>>=4;
  172.        pReg=GetReg(&p,Reg);
  173.        pRegEx=GetReg(&p,RegEx);
  174.        p.Eax=*pReg-*pRegEx;
  175.        ++b;
  176.      break;
  177.      case 0x28://MOV [REG-X], EAX
  178.        Reg=*(++b);
  179.        Offset=Reg&0xF;
  180.        Reg>>=4;
  181.        if(Reg&0x1)
  182.          Offset=-Offset;
  183.        Reg&=0xE;
  184.        pReg=GetReg(&p,Reg);
  185.        *((PDWORD)(*pReg+Offset))=p.Eax;
  186.        ++b;
  187.      break;
  188.      default:
  189.        //FIX ME!
  190.        b++;//Opcode no válido?
  191.      break;
  192.    }
  193.  }
  194.  p.Eip=(ULONG)++b;
  195. }
  196.  
  197. void __stdcall vmachine(void);
  198. asm(
  199.  ".globl _vmachine\r\n"
  200.  "_vmachine:\r\n"//function header...
  201.  "  SUB     $0x24,%esp;\r\n"
  202.  "  PUSH    %edi;\r\n"
  203.  "  POP     (%esp);\r\n"
  204.  "  PUSH    %esi;\r\n"
  205.  "  POP     0x4(%esp);\r\n"
  206.  "  PUSH    %ebp;\r\n"
  207.  "  POP     0x8(%esp);\r\n"
  208.  "  PUSH    %ebx;\r\n"
  209.  "  POP     0x10(%esp);\r\n"
  210.  "  PUSH    %edx;\r\n"
  211.  "  POP     0x14(%esp);\r\n"
  212.  "  PUSH    %ecx;\r\n"
  213.  "  POP     0x18(%esp);\r\n"
  214.  "  PUSH    %eax;\r\n"
  215.  "  POP     0x1C(%esp);\r\n"
  216.  "  PUSHF   ;\r\n"
  217.  "  POP     0x20(%esp);\r\n"
  218.  "  LEA     0x28(%esp),%eax;\r\n"
  219.  "  MOV     %eax,0x0C(%esp);\r\n"
  220.  "  CALL    _decrypt;\r\n"
  221.  "  POPA    ;\r\n"
  222.  "  POPF    ;\r\n"
  223.  "  RET"
  224. );
  225.  
  226. void cryptme(){
  227.  int a,b,c;
  228.  asm(
  229.    " call jmp1;\n\t"
  230. "jmp1:jmp _vmachine;\n\t"
  231.  );
  232.  /*a=15,b=8;c=a-b;*/
  233.  asm(".byte\t\
  234.    0x1C,0xD4,0x0F,0x00,0x00,0x00,\
  235.    0x1C,0xD8,0x08,0x00,0x00,0x00,\
  236.    0x21,0xD4,\
  237.    0x1E,0xD8,\
  238.    0x32,0x40,\
  239.    0x28,0xDC,\
  240.    0xF0\
  241.  ");
  242.  printf("%d %d %d\n",a,b,c);
  243.  return;
  244. }
  245.  
  246. int main(void){
  247.  cryptme();
  248.  system("pause");
  249.  return 0;
  250. }

el código fue compilado sobre GCC sin ningún tipo de optimización (si se optimiza puede no funcionar correctamente porque el compilador elimina las variables sin referencias directas u otros tipos de optimizaciones)

el código:

Código
  1.  asm(
  2.    " call jmp1;\n\t"
  3. "jmp1:jmp _vmachine;\n\t"
  4.  );

se lo podría meter en una macro pero como era solo para probar lo posteo así (de paso queda a la vista para el que le interese portarlo a otro compilador).

el resultado es el siguiente, el código sin virtualizar en un debugger como olly sale:

Código
  1. void cryptme(){
  2.  int a,b,c;
  3.  a=15,b=8;c=a-b;
  4.  printf("%d %d %d\n",a,b,c);
  5.  return;
  6. }

Código
  1. 004015F2  /$  55            PUSH    EBP
  2. 004015F3  |.  89E5          MOV     EBP, ESP
  3. 004015F5  |.  83EC 28       SUB     ESP, 28
  4. 004015F8  |.  C745 FC 0F000>MOV     DWORD PTR SS:[EBP-4], 0F         ; |
  5. 004015FF  |.  C745 F8 08000>MOV     DWORD PTR SS:[EBP-8], 8          ; |
  6. 00401606  |.  8B55 F8       MOV     EDX, DWORD PTR SS:[EBP-8]        ; |
  7. 00401609  |.  8B45 FC       MOV     EAX, DWORD PTR SS:[EBP-4]        ; |
  8. 0040160C  |.  29D0          SUB     EAX, EDX                         ; |
  9. 0040160E  |.  8945 F4       MOV     DWORD PTR SS:[EBP-C], EAX        ; |
  10. 00401611  |.  8B45 F4       MOV     EAX, DWORD PTR SS:[EBP-C]        ; |
  11. 00401614  |.  894424 0C     MOV     DWORD PTR SS:[ESP+C], EAX        ; |
  12. 00401618  |.  8B45 F8       MOV     EAX, DWORD PTR SS:[EBP-8]        ; |
  13. 0040161B  |.  894424 08     MOV     DWORD PTR SS:[ESP+8], EAX        ; |
  14. 0040161F  |.  8B45 FC       MOV     EAX, DWORD PTR SS:[EBP-4]        ; |
  15. 00401622  |.  894424 04     MOV     DWORD PTR SS:[ESP+4], EAX        ; |
  16. 00401626  |.  C70424 983040>MOV     DWORD PTR SS:[ESP], CodeVirt.004>; |ASCII "%d %d %d\n"
  17. 0040162D  |.  E8 56080000   CALL    <JMP.&msvcrt.printf>             ; \printf
  18. 00401632  |.  C9            LEAVE
  19. 00401633  \.  C3            RETN

sin embargo, el código virtualizado se ve:

Código
  1. 004015F2  |$  55            PUSH    EBP
  2. 004015F3  |.  89E5          MOV     EBP, ESP
  3. 004015F5  |.  83EC 28       SUB     ESP, 28
  4. 004015F8  |.  E8 00000000   CALL    CodeVirt.004015FD
  5. 004015FD  \$^ EB B9         JMP     SHORT CodeVirt.004015B8
  6. 004015FF      1C            DB      1C
  7. 00401600      D4            DB      D4
  8. 00401601      0F            DB      0F
  9. 00401602      00            DB      00
  10. 00401603      00            DB      00
  11. 00401604      00            DB      00
  12. 00401605      1C            DB      1C
  13. 00401606      D8            DB      D8
  14. 00401607      08            DB      08
  15. 00401608      00            DB      00
  16. 00401609      00            DB      00
  17. 0040160A      00            DB      00
  18. 0040160B      21            DB      21                               ;  CHAR '!'
  19. 0040160C      D4            DB      D4
  20. 0040160D      1E            DB      1E
  21. 0040160E      D8            DB      D8
  22. 0040160F      32            DB      32                               ;  CHAR '2'
  23. 00401610      40            DB      40                               ;  CHAR '@'
  24. 00401611      28            DB      28                               ;  CHAR '('
  25. 00401612   .  DCF0          FDIVR   ST, ST                           ; |
  26. 00401614   .  8B45 F4       MOV     EAX, DWORD PTR SS:[EBP-C]        ; |
  27. 00401617   .  894424 0C     MOV     DWORD PTR SS:[ESP+C], EAX        ; |
  28. 0040161B   .  8B45 F8       MOV     EAX, DWORD PTR SS:[EBP-8]        ; |
  29. 0040161E   .  894424 08     MOV     DWORD PTR SS:[ESP+8], EAX        ; |
  30. 00401622   .  8B45 FC       MOV     EAX, DWORD PTR SS:[EBP-4]        ; |
  31. 00401625   .  894424 04     MOV     DWORD PTR SS:[ESP+4], EAX        ; |
  32. 00401629   .  C70424 983040>MOV     DWORD PTR SS:[ESP], CodeVirt.004>; |ASCII "%d %d %d\n"
  33. 00401630   .  E8 53080000   CALL    <JMP.&msvcrt.printf>             ; \printf
  34. 00401635   .  C9            LEAVE
  35. 00401636   .  C3            RETN

con lo cual se ve claramente la diferencia...

lo que se podría agregar al código es (como ya dije) un conjunto más variado de instrucciones y luego un "virtualizador" que convierta las instrucciones normales a las virtualizadas, pero, ese ya es un arduo trabajo y si a alguien le interesa tomarlo como proyecto podría ayudar  :P

S2
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 28
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines