Páginas

anun1

miércoles, 2 de septiembre de 2026

Generador De Claves Del Crackme 2 de tHE ANALYST

Hola amigos hoy les traigo el crackme número 2 de ANALYST por si no lo vieron la solución de el crackme 1 aquí les dejo el link


Este reto es un poco más complicado que el primero por eso me tarde en traer la solución, bueno lo abrimos con el x32dbg y buscamos en los string el mensaje correcto y lo encontramos este



Ahora damos doble clic y nos manda a esta zona


Como podemos ver hay esta la API de comparación hay podemos ver con que compara nuestro serial si ponemos un breakpoint y más arriba se encuentra la generación del serial aquí les pego el código en ensamblador

004010F7 | 33D2                     | xor edx,edx                                    | edx:EntryPoint
004010F9 | 33DB                     | xor ebx,ebx                                    |
004010FB | 8B55 D4                  | mov edx,dword ptr ss:[ebp-2C]                  | edx:EntryPoint
004010FE | 0155 C4                  | add dword ptr ss:[ebp-3C],edx                  | edx:EntryPoint
00401101 | 0155 C4                  | add dword ptr ss:[ebp-3C],edx                  | edx:EntryPoint
00401104 | 8BC2                     | mov eax,edx                                    | edx:EntryPoint
00401106 | 83C0 05                  | add eax,5                                      |
00401109 | 8945 B8                  | mov dword ptr ss:[ebp-48],eax                  |
0040110C | 33C0                     | xor eax,eax                                    |
0040110E | 8BCF                     | mov ecx,edi                                    | ecx:EntryPoint, edi:EntryPoint
00401110 | 83C1 04                  | add ecx,4                                      | ecx:EntryPoint
00401113 | 894D B4                  | mov dword ptr ss:[ebp-4C],ecx                  | ecx:EntryPoint
00401116 | 33C9                     | xor ecx,ecx                                    | ecx:EntryPoint
00401118 | 0155 BC                  | add dword ptr ss:[ebp-44],edx                  | edx:EntryPoint
0040111B | 017D BC                  | add dword ptr ss:[ebp-44],edi                  | edi:EntryPoint
0040111E | 6BFF 03                  | imul edi,edi,3                                 | edi:EntryPoint
00401121 | 897D C0                  | mov dword ptr ss:[ebp-40],edi                  | edi:EntryPoint
00401124 | 33FF                     | xor edi,edi                                    | edi:EntryPoint
00401126 | 0FBE8C05 44FFFFFF        | movsx ecx,byte ptr ss:[ebp+eax-BC]             | ecx:EntryPoint
0040112E | 83F9 61                  | cmp ecx,61                                     | ecx:EntryPoint, 61:'a'
00401131 | 7C 07                    | jl k4n2.40113A                                 |
00401133 | 90                       | nop                                            |
00401134 | 90                       | nop                                            |
00401135 | 90                       | nop                                            |
00401136 | 90                       | nop                                            |
00401137 | 83E9 20                  | sub ecx,20                                     | ecx:EntryPoint
0040113A | 8BF1                     | mov esi,ecx                                    | esi:EntryPoint, ecx:EntryPoint
0040113C | 03DE                     | add ebx,esi                                    | esi:EntryPoint
0040113E | 0FAFD9                   | imul ebx,ecx                                   | ecx:EntryPoint
00401141 | 4A                       | dec edx                                        | edx:EntryPoint
00401142 | 0FBE8C2F 44FFFFFF        | movsx ecx,byte ptr ds:[edi+ebp-BC]             | ecx:EntryPoint
0040114A | 0FBEB42F 45FFFFFF        | movsx esi,byte ptr ds:[edi+ebp-BB]             | esi:EntryPoint
00401152 | 83F9 61                  | cmp ecx,61                                     | ecx:EntryPoint, 61:'a'
00401155 | 7D 12                    | jge k4n2.401169                                |
00401157 | 90                       | nop                                            |
00401158 | 90                       | nop                                            |
00401159 | 90                       | nop                                            |
0040115A | 90                       | nop                                            |
0040115B | 83FE 61                  | cmp esi,61                                     | esi:EntryPoint, 61:'a'
0040115E | 7D 0E                    | jge k4n2.40116E                                |
00401160 | 90                       | nop                                            |
00401161 | 90                       | nop                                            |
00401162 | 90                       | nop                                            |
00401163 | 90                       | nop                                            |
00401164 | EB 0B                    | jmp k4n2.401171                                |
00401166 | 90                       | nop                                            |
00401167 | 90                       | nop                                            |
00401168 | 90                       | nop                                            |
00401169 | 83E9 20                  | sub ecx,20                                     | ecx:EntryPoint
0040116C | EB ED                    | jmp k4n2.40115B                                |
0040116E | 83EE 20                  | sub esi,20                                     | esi:EntryPoint
00401171 | 47                       | inc edi                                        | edi:EntryPoint
00401172 | 03DE                     | add ebx,esi                                    | esi:EntryPoint
00401174 | 0FAFD9                   | imul ebx,ecx                                   | ecx:EntryPoint
00401177 | 4A                       | dec edx                                        | edx:EntryPoint
00401178 | 75 C8                    | jne k4n2.401142                                |
0040117A | 895D C8                  | mov dword ptr ss:[ebp-38],ebx                  |
0040117D | 33C9                     | xor ecx,ecx                                    | ecx:EntryPoint
0040117F | 33D2                     | xor edx,edx                                    | edx:EntryPoint
00401181 | 33DB                     | xor ebx,ebx                                    |
00401183 | 33C0                     | xor eax,eax                                    |
00401185 | 837D D4 32               | cmp dword ptr ss:[ebp-2C],32                   | 32:'2'
00401189 | 0F8D A0000000            | jge k4n2.40122F                                |
0040118F | 0FBE840D 44FFFFFF        | movsx eax,byte ptr ss:[ebp+ecx-BC]             |
00401197 | 03C1                     | add eax,ecx                                    | ecx:EntryPoint
00401199 | 03D8                     | add ebx,eax                                    |
0040119B | 41                       | inc ecx                                        | ecx:EntryPoint
0040119C | 3B4D D4                  | cmp ecx,dword ptr ss:[ebp-2C]                  | ecx:EntryPoint
0040119F | 75 EE                    | jne k4n2.40118F                                |
004011A1 | D1C0                     | rol eax,1                                      |
004011A3 | 35 40E20100              | xor eax,1E240                                  | 1E240:"???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
004011A8 | 8945 B0                  | mov dword ptr ss:[ebp-50],eax                  |
004011AB | 33C9                     | xor ecx,ecx                                    | ecx:EntryPoint
004011AD | 33D2                     | xor edx,edx                                    | edx:EntryPoint
004011AF | 33DB                     | xor ebx,ebx                                    |
004011B1 | 33C0                     | xor eax,eax                                    |
004011B3 | 0FBE840D 44FFFFFF        | movsx eax,byte ptr ss:[ebp+ecx-BC]             |
004011BB | 6BD0 06                  | imul edx,eax,6                                 | edx:EntryPoint
004011BE | 33C2                     | xor eax,edx                                    | edx:EntryPoint
004011C0 | 03D8                     | add ebx,eax                                    |
004011C2 | 41                       | inc ecx                                        | ecx:EntryPoint
004011C3 | 3B4D D4                  | cmp ecx,dword ptr ss:[ebp-2C]                  | ecx:EntryPoint
004011C6 | 75 EB                    | jne k4n2.4011B3                                |
004011C8 | 035D B0                  | add ebx,dword ptr ss:[ebp-50]                  |
004011CB | 895D AC                  | mov dword ptr ss:[ebp-54],ebx                  |

Es algo extenso la generación del serial así que solo les traeré el generador de claves, así que aquí el código de mi keygen

<html>
<head>
<title>Keygen Crackme 2 tHE ANALYST  ...:::Flamer:::...</title>
</head>
<body bgcolor="black">
<center>
<marquee style="font-size:30;color:yellow;">Generador De Claves Crackme 2 tHE ANALYST ...:::By Flamer:::...</marquee><br><br>
<label style="color:white;">Nombre:</label>
<input type="text" id="nom" size='75' style="background-color:Gray;color:white;text-align:center;">
<input type="button" value="Copy" onclick="copiar1()"><br><br>
<label style="color:white;">Serial:</label>
<input type="text" id="pass" size='90' style="background-color:Gray;color:white;text-align:center;">
<input type="button" value="Copy" onclick="copiar2()"><br><br>

<input type="button"  value="Generar" onclick="manual()" id="boton1">
<input type="button"  value="Automatico" onclick="auto()" id="boton2">
<input type="button"  value="Limpiar" onclick="limpia()" id="boton3">
</center>
<script>
let tiempo;
function copiar1() 
{
   let c=document.getElementById('nom'); 
   navigator.clipboard.writeText(c.value);
}
//==================================================================================
function copiar2() 
{
   let c=document.getElementById('pass'); 
   navigator.clipboard.writeText(c.value);
}
//==================================================================================
function limpia()
{
   document.getElementById("nom").value="";
   document.getElementById("pass").value="";
}
//==================================================================================
function corre()
{
   let cadena="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
   let l=cadena.length-1
   let largo=parseInt(Math.random() * (l - 4) + 4);
   let x,posi,nick="";
   
   for(x=0;x<largo;x++)
   {
      posi=parseInt(Math.random() * (l - 0) + 0);
      nick+=cadena[posi];
	  
   }
   document.getElementById("nom").value=nick;
   document.getElementById("pass").value=genera(nick); 
   
   tiempo=setTimeout("corre()",10);
}
//==================================================================================
function auto()
{
   if(document.getElementById("boton2").value=="Automatico")
   {
      document.getElementById("boton2").value="Detener";
      document.getElementById("boton1").disabled = true;
      document.getElementById("boton3").disabled = true;
      corre();
   }
   else 
   {
      document.getElementById("boton2").value="Automatico";
      document.getElementById("boton1").disabled = false;
      document.getElementById("boton3").disabled = false;
     clearTimeout(tiempo);
   }
}
//==================================================================================
function genera(nombre)
{
   let parte1=nombre.length * 2;
   let parte2=nombre.length + 5;
   let parte3="1AF254";
   let parte4=(1765968*3).toString(16);
   let edi=0,ebx=0,esi=0,ecx=0,txt="",edx=nombre.length;
   let nom=nombre;
   let parte8=1765968+ nom.length;
   nombre=nombre.toUpperCase();
   
   ecx=nombre[edi].charCodeAt(0);
   esi=ecx;
   ebx=ebx+esi;
   ebx=ebx*ecx;
   edx--;
   while(edx>0)
   {
      ecx=nombre[edi].charCodeAt(0);
      esi=nombre[edi+1].charCodeAt(0);
      edi++;
      ebx=ebx+esi;
      ebx=ebx*ecx;
      txt=ebx.toString(16);
      txt=txt.slice(-8);
      ebx=parseInt(txt,16);
      edx--;
   }
   
   let parte5=ebx;
   
   eax=nom[nom.length-1].charCodeAt(0);
   eax=eax + nom.length-1;
   txt=eax.toString(2);
   txt=txt + "0";
   eax=parseInt(txt,2);
   let parte6=eax ^ 123456;
   
   ebx=0;
   for(ecx=0;ecx<nom.length;ecx++)
   {
      eax=nom[ecx].charCodeAt(0);
      edx=eax*6;
      eax=eax ^ edx;
      ebx=ebx+eax;
   }
   let parte7=ebx + parte6;
   
   return (parte6.toString(16) + parte7.toString() + "-" + parte2.toString() + parte3 + "-" +  + parte5.toString() + parte8.toString() + "-" + parte1.toString(16) + parte4.toString(16)).toUpperCase();
}
//==================================================================================
function manual()
{
   let nom=document.getElementById("nom").value;
   if(nom.length>3 && nom.length<50)
   {
      document.getElementById("pass").value=genera(nom);
   }
   else
   {
      alert("Error Nombre Muy Corto o Muy Largo, De 4 a 49 Digitos...");  ///menor a 50
   }
}
</script>
</body>
</html>

Así que lo copeamos y pegamos en el bloc de notas y lo aguardamos como "key.html" y aprobar aquí una foto



Ahora probamos la clave en el crackme y nos manda este cartelito


Bueno espero les guste y perdonen por no explicar nada de la generación del serial, pero serial algo extenso y seme hizo más fácil solo subir la solución...Bueno saludos Flamer




miércoles, 26 de agosto de 2026

Solucion al Crackme 1 De Enigmagroup

Hola amigos hoy veremos la solución de el crackme 1 de enigmagroup como es el primero es algo sencillo, vamos a ver si los hacemos todos son 14 crackmes en total, bueno empecemos primero lo abrimos con x32dbg

y buscamos las string


Como podemos ver hay esta el mensaje correcto así que damos clic en el y nos lleva a esta zona


Como podemos ver más arriba se encuentra la API que compara 2 cadenas así que ponemos un breakpoint en esa línea y lo ejecutamos para ver si se detiene, ponemos como serial  "123456" y presionamos el botón Submit y se detiene justo donde pusimos el breakpoint y nos vamos traceando con F7 para entrar en ese call y averiguar con que cadena compara... Bueno me fui traseando con F7 hasta llegar a esta zona


Hay podemos ver que compara la contraseña que pusimos nosotros "123456" con la palabra "WAY2EASY" bueno así que la copeamos y ponemos en el crackme a ver que pasa y nos muestra esto


Como podemos ver nos arroja el cartelito correcto así que esa es la clave... Bueno creo que eso es todo saludos Flamer

 

sábado, 22 de agosto de 2026

Solucion Al Crackme Threadhell Crackme De Nyan

Hola amigos hoy veremos como resolver el crackme de Nyan que fue publicado en el grupo de CrackSLatinoS al cual le mando un saludo y por publicar este reto...bueno empesemos primero lo analizamos con el ExeInfo PE y a ver que nos dice


y vemos que está programado en Golang un lenguaje que no había escuchado y Google nos dice esto


también no dice que es un ejecutable de 64 bits así que lo abrimos con x64dbg y buscamos los string a ver que nos dice, a ver si encontramos el mensaje correcto o el incorrecto y vemos lo siguiente.


Es mucha basura está claro que aquí no vamos a encontrar nada y como dice Nyan ese es el objetivo que no encuentres como resolverlo... Bueno así que lo ejecutamos y al ingresar alguna contraseña y presionar enter vemos que se cierra de repente no se pausa y eso es por los hilos... Si queremos saber cuantos hilos tiene no vamos a la pantalla de hilos y vemos lo siguiente


Si los detenemos no nos deja trabajar bien... así que por hay no es, bueno se me acaban las opciones así que se me ocurre algo la API que cierra el programa y nos vamos a los módulos donde están las APIs y encontramos la API ExitProcess esta


Si se preguntan que vamos a hacer con esa API, les cuento vamos a seguir el camino que sigue el programa para cerrarse o terminar, ya que al presionar enter se cierra, así que damos doble clic en ella y nos manda a esta parte del código


Como vemos nos manda a una parte sin salida, ese pedazo de código se ejecuta con los hilos y cierra el programa... Pero los hilos no nos importan vamos a seguir el camino y averiguar que call manda llamar esa función y para eso damos clic derecho al push rbp y después clic en encontrar referencias así como en la imagen


Y nos muestra lo siguiente


Como vemos son muchos call que mandan llamar esa función, así que ponemos un breakpoint en cada una y ejecutamos el crackme para después ingresar como contraseña "polomon" y presionamos enter y vemos que se detiene en la siguiente


Vemos que se detiene en una....yo quite los breakpoint para no tener tantos y damos doble clic en ese call y no manda a esta zona


Otra zona que no muestra nada, pero no se apresuren vamos a averiguar de donde mandan llamar esa función...así que primero quitamos el brackpoint para no tener tantos y damos clic derecho en él push rbp y clic en encontrar referencias así como en la imagen


Y nos muestra lo siguiente


Esta vez solo hace referencia a un solo call así que damos doble clic en él a ver donde nos lleva y nos lleva a esta zona


Ahora vamos a dar clic derecho en la comparación(cmp) y después clic en encontrar referencias así como en la imagen


Y nos muestra los siguientes


No vamos a poner breackpoins, damos clic en el primer call y miramos lo siguiente


Como podemos ver hay algunos string que llaman la atención uno de ellos es el que se imprime cuando inicia el programa y otro que no sabemos para qué es... Damos clic en el segundo call y nos muestra el chico bueno o el mensaje correcto


Ese pedazo de código se ejecuta con los hilos y si asemos lo mismo para ver de que parte del código es llamado nos manda a un salto JMP que está abajo... Modificando los saltos podemos imprimir el mensaje correcto, pero ese no es suficiente, tenemos que encontrar el serial y el tercer call no nos lleva a nada así que la opción es el primer call y ponemos un breackpoint en uno de los string así como en la imagen


Nota: en este momento estoy corriendo el crackme no lo cerré por eso me muestra el serial, así que lo cerramos y lo ejecutamos para ver si se detiene donde pusimos el breakpoint....y si se detiene ahora es irnos presionando F8 para ver donde se detiene para que ingresemos el serial y se detiene aquí en este call


así que ponemos un breakpoin en la línea de abajo e ingresamos como serial "polomon" y damos enter y se detiene donde le dijimos al programa


Para revisarlos y echarles una mira dita y no trasearlos con F7 y F8 solo nos ponemos encima de ellos y presionamos enter para ver que contienen o que hacen y nos regresamos con la tecla menos y en uno de ellos vemos que pregunta el número de dígitos del serial y eso lo sé porque ingrese varios seriales distintos con números distintos de dígitos y descubrí que el serial contiene 9 dígitos este es el call


después por casualidad ingrese "123456789" y medio el serial correcto.... Luego mire esa cadena arriba y me dije si pongo "012345678" funcionara algo tiene que ver esa cadena y si funciono después ingrese pedazos de 9 dígitos de esa cadena y funcionaban, no sé porque, pero funcionan así que le hice un keygen tomando pedazos de esa cadena aquí se los dejo

EDITO: El serial solo tiene que tener 9 caracteres pueden ser cualquiera solo con longitud 9 eso lo muestra en la imagen de arriba pero para mas muestra les dejo una imagen entramos en el call ese y yo ingrese como serial "polomon" y vemos que compara la longitud de este serial con 9


                                     

Como vemos compara el largo de la cadena y si es 9 elige un ret y sino el otro

<html>
<head>
<title>Keygen Crackme ThreadHell Crackme Nyan  ...:::Flamer:::...</title>
</head>
<body bgcolor="black">
<center>
<marquee style="font-size:30;color:yellow;">Keygen Crackme El Infierno De Los Hilos Crackme Nyan ...:::By Flamer:::...</marquee><br><br>
<label style="color:white;">Serial:</label>
<input type="text" id="pass" size='50' style="background-color:Gray;color:white;text-align:center;">
<input type="button" value="Copy" onclick="copiar()"><br><br>

<input type="button"  value="Generar" onclick="auto()" id="boton1">
<input type="button"  value="Detener" onclick="stop()" id="boton2" disabled>
<input type="button"  value="Limpiar" onclick="limpia()" id="boton3">
</center>
<script>
let tiempo;
function copiar() 
{
   let c=document.getElementById('pass'); 
   navigator.clipboard.writeText(c.value);
}
//==================================================================================
function limpia()
{
   document.getElementById("nom").value="";
   document.getElementById("pass").value="";
}
//==================================================================================
function auto()
{
   document.getElementById("boton1").disabled = true;
   document.getElementById("boton2").disabled = false;
   genera(); 
   tiempo=setTimeout("auto()",10);
}
//==================================================================================
function stop()
{
   document.getElementById("boton1").disabled = false;
   document.getElementById("boton2").disabled = true;
   clearTimeout(tiempo);
}
//==================================================================================
function genera()
{
   let cadena="[rsp+58]:&" + String.fromCharCode(34) + "Password:0123456789winsymlink/dev/stdinParseFloatcomplex128t.Kind==IsValidSidLogonUserWLockFileExReOpenFileNetUserAddNetUserDelNtOpenFileWSASocketWws2_32.dllvgetrandomnotifyListprofInsertstackLargeNotworkermSpanInUseGOMAXPROCSstoptracedisablethpinvalidptrschedtracesemacquiredebugcall<badpcflushGenMBgoal,cleanups\ns.state=s.base()=heapGoal=GOMEMLIMITKiBnow,pagesatsweepgen=sweepgen,bound=,limit=exitThreadBadvarintGCforced\nrunqueue=stopwait=runqsize=gfreec";
   let largo,posi,pass;
   
   largo=cadena.length-10;
   posi=parseInt(Math.random() * (largo - 0) + 0);
   pass=cadena.substr(posi,9);
   document.getElementById("pass").value=pass;
}
</script>
</body>
</html>

Aquí una foto de él


Así que probamos unos cuantos seriales para probar el keygen y nos muestra esto


Bueno es todo por hoy espero les haya gustado saludo a Neutrino, a Nyan por este crackme y a todos los CrackSLatinoS




jueves, 20 de agosto de 2026

Solucion al Crackme 1 De Hendrix Reto WarZone Del Foro.ElHacker.Net

Hola amigos hoy veremos la solución al crackme 1 de hendrix, sin más que decir aquí les dejo una foto del reto

 


Bueno ahora le pasamos el Exeinfo PE para ver que nos dice y esto nos arroja


Nos dice que está empacado con upx así que nos vamos a la consola y a escribir "upx -d" para ver que nos dice


Valla nos arroja error esto quiere decir que han modificado algo, no nos queda otra que desempacar a mano, así que nos vamos al depurador x32dbg y nos muestra la palabra pushad así que solo presionamos, solo una vez F8, solo una vez y revisamos el registro ESP y asemos lo siguiente


Clic derecho y seleccionamos mostrar en el volcado  y hay se mostró esto


Hay nos muestra la dirección del Original Entry Point (OEP) asi que le ponemos un breakpoint en esa dirección y presionamos F9 y después nos vamos solo con F8 hasta llegar al main o que se muestre esto


Ahora lo vamos a dumpear de memoria para eso usamos Scylla y damos clic en


Y al presionar Fix Dump seleccionamos el archivo Dump que se creó así


Y nos crea un archivo llamado "Crackme1_dump_SCY.exe" y pues ya lo podemos abrir con el x32dbg y ya lo podemos tracear..... Bueno para empezar este crackme toma el nombre que ingresamos y calcula su longitud o sea el número de dígitos y los multiplica por 2 yo ingrese el nombre "polo" tiene 4 dígitos multiplicado por 2 son 8... Luego compara ese resultado 8 por la longitud de el serial que ingresamos yo ingrese "123456"

                                       

Como ven esa es la zona que les digo así que ingresaremos "polo" y como serial "12345678" y vemos que si pasa, ahora nos vamos hasta la dirección 00402774 donde vemos que toma los 2 primeros dígitos del serial  "12" y más abajo una intrusión de multiplicación


En la primera multiplicación lo hace por 56 

(49*56=2744)  después el resultado lo multiplica por el valor ASCII de 2 que es 50

(50*2744=137200) ese es el resultado...y más abajo vemos una intrusión de división
(137200 / 255=538) y sobran 10 o sea A en hexadecimal


Después multiplica el valor ASCII de "p" de "polo" por 2 y es E0 y el resultado es comparado por A
70 * 2= E0



Como vemos toma de 2 dígitos del serial y los multiplica el primero por 56 y después el resultado por el segundo digito y luego los divide por 255 y el residuo lo compara por el primer digito de el nombre por 2 y luego toma el "34" del serial y multiplica el valor ASCII del 3 que es 51 * 56 y el resultado por el valor ASCII de  el 4 que es 52 para después dividirlo entre 255 y el residuo lo compara por el valor ASCII de "o" de el nombre "polo" que es

111 * 2 = 222 y así sucesivamente con todos los dígitos del serial y con los dígitos del nombre.... Bueno espero me hayan entendido aquí les dejo el keygen


<html>
<head>
<title>Keygen Crackme 1 De Hendrix  ...:::Flamer:::...</title>
</head>
<body bgcolor="black">
<center>
<marquee style="font-size:30;color:yellow;">Generador De Claves Del Crackme 1 De Hendrix ...:::By Flamer:::...</marquee><br><br>

<label style="color:white;">Nombre:&nbsp&nbsp&nbsp</label>
<input type="text" id="nom" size='50' style="background-color:Gray;color:white;text-align:center;">
<input type="button" value="Copy" onclick="copiar1()"><br><br>

<label style="color:white;">Serial:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp</label>
<input type="text" id="pass" size='50' style="background-color:Gray;color:white;text-align:center;">
<input type="button" value="Copy" onclick="copiar2()"><br><br>

<input type="button"  value="Generar" onclick="genera()" id="boton1">
<input type="button"  value="Automatico" onclick="auto()" id="boton2">
<input type="button"  value="Limpiar" onclick="limpia()" id="boton3">
</center>
<script>
let tiempo;
function copiar1() 
{
   let c=document.getElementById('nom'); 
   c.select();
   document.execCommand('copy');
}
//==================================================================================
function copiar2() 
{
   let c=document.getElementById('pass'); 
   c.select();
   document.execCommand('copy');
}
//==================================================================================
function limpia()
{
   document.getElementById("nom").value="";
   document.getElementById("pass").value="";
}
//==================================================================================
function auto()
{
   if(document.getElementById("boton2").value=="Automatico")
   {
      document.getElementById("boton2").value="Detener";
	  document.getElementById("boton1").disabled=true;
	  document.getElementById("boton3").disabled=true;
	  corre();
   }
   else
   {
      document.getElementById("boton2").value="Automatico";
	  document.getElementById("boton1").disabled=false;
	  document.getElementById("boton3").disabled=false;
	  clearTimeout(tiempo);
   }
}
//==================================================================================
function corre()
{
   let cadena="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
   let x,posi,nombre="";
   let largo=parseInt(Math.random() * (20 - 1) + 1);
   
   for(x=0;x<largo;x++)
   {
      posi=parseInt(Math.random() * ((cadena.length - 1) - 0) + 0);
	  nombre+=cadena[posi];
   }
   document.getElementById("nom").value=nombre;
   genera();
   tiempo=setTimeout("corre()",10);
}
//==================================================================================
function genera()
{
   let x,digito,pass="",p;
   let nom=document.getElementById("nom").value;
   
    
   for(x=0;x<nom.length;x++)
   {
      digito=nom[x].charCodeAt(0);
	  digito=digito * 2;
	  p=ciclo(digito);
	  if(p==0) 
	  {
	     pass="";
	     break;
	  }
      else 
      {
	     pass+=p;
      }	  
   }
   document.getElementById("pass").value=pass;
}
//==================================================================================
function ciclo(digito)
{
   let x,y,p;
   for(x=33;x<=122;x++)
   {
      for(y=33;y<=122;y++)
	  {
	     p=((x*56) * y) % 255;
         if(p==digito)
         {
		    return String.fromCharCode(x) + String.fromCharCode(y);
         }		 
	  }
   }
   alert("Error El Nombre No Tiene Password De Solucion");
   clearTimeout(tiempo);
   return 0;
}
</script>
</body>
</html>


Aqui una foto del keygen


Ahora ingresamos la palabra "polon" y la contraseña y nos muestra esto



Bueno amigo creo que eso es todo espero les haya gustado saludo Flamer

martes, 18 de agosto de 2026

Sonidos Chiptune En HTML y JavaScript Para Los Keygenes

Hola amigos hoy vengo con unos sonidos de chiptune algo simple son 3 códigos diferentes, se los muestro por que los implementaré en mis futuros generadores de claves, ya que me gustan los tonos y si hago un tema solo para esto es para que vean solo el código del sonido y no se confundan con la generación del serial en el futuro, bueno aquí el primero.

<html>
<head>
<title>Tetris Loop</title>
</head>
<body>
<h1>Sonido De Tetris Para Keygen</h1>   
<button class="btn-play" onclick="activarBucle()">PLAY LOOP</button>
<button class="btn-stop" onclick="detenerBucle()">STOP</button>
<script>
let audioCtx;
let bucleActivo = false;
let timerBucle;

function inicializarAudio() 
{
   if (!audioCtx) 
   {
      // Creamos el motor de sonido nativo del navegador
      audioCtx = new (window.AudioContext || window.webkitAudioContext)();
   }
   if (audioCtx.state === 'suspended') 
   {
      audioCtx.resume();
   }
}
function tocarNota(frecuencia, duracion, tiempoInicio) 
{
   if (!bucleActivo) return;

   const oscilador = audioCtx.createOscillator();
   const nodoVolumen = audioCtx.createGain();

   oscilador.type = 'square'; 
   oscilador.frequency.setValueAtTime(frecuencia, tiempoInicio);

   nodoVolumen.gain.setValueAtTime(0.12, tiempoInicio);
   nodoVolumen.gain.exponentialRampToValueAtTime(0.00001, tiempoInicio + duracion - 0.01);

   oscilador.connect(nodoVolumen);
   nodoVolumen.connect(audioCtx.destination);

   oscilador.start(tiempoInicio);
   oscilador.stop(tiempoInicio + duracion);
}
function secuenciarCancion() 
{
   if (!bucleActivo) return;

   const ahora = audioCtx.currentTime;

   // Frecuencias musicales en hercios para las notas de Tetris
   const E5 = 659.25, B4 = 493.88, C5 = 523.25, D5 = 587.33, A4 = 440.00, G4 = 392.00;

   const partitura = [
       [E5, 0.3], [B4, 0.15], [C5, 0.15], [D5, 0.3], [C5, 0.15], [B4, 0.15],
       [A4, 0.3], [A4, 0.15], [C5, 0.15], [E5, 0.3], [D5, 0.15], [C5, 0.15],
       [B4, 0.45], [C5, 0.15], [D5, 0.3], [E5, 0.3], [C5, 0.3], [A4, 0.3], [A4, 0.45]
       ];

   let tiempoAcumulado = 0;

   // CORRECCIÓN AQUÍ: Ahora extraemos correctamente el índice [0] y [1] de cada nota
   partitura.forEach(nota => {
   const frecuencia = nota[0]; // Frecuencia (Hz)
   const duracion = nota[1];   // Duración (Segundos)
                
   tocarNota(frecuencia, duracion, ahora + tiempoAcumulado);
   tiempoAcumulado += duracion + 0.02; 
    });

   const tiempoTotalMs = tiempoAcumulado * 1000;
            
   timerBucle = setTimeout(() => {
   secuenciarCancion();
   }, tiempoTotalMs);
}
function activarBucle()
 {
   if (bucleActivo) return; 
   bucleActivo = true;
   inicializarAudio();
   secuenciarCancion();
}
function detenerBucle()
{
   bucleActivo = false;
   clearTimeout(timerBucle);
}
</script>
</body>
</html>

Nota: no soy compositor, así que las frecuencias las saque de chatgpt....aquí una imagen


otra cosa le puse boton stop para que se detubiera y tambien por que no suena en automatico por seguridad no lo permite el navegador en html...aqui el segundo


<html>
<head>
    <title>Chiptune</title>
</head>

<body>
<button onclick="play()">▶ Play</button>
<button onclick="stop()">■ Stop</button>
<script>
let audio;
let timer;
let notas = [
    261.63, 261.63, 392.00, 523.25,
    392.00, 329.63, 293.66, 261.63
];

let i = 0;

function play()
{
    stop();

    audio = new AudioContext();

    i = 0;

    timer = setInterval(function()
    {
        let osc = audio.createOscillator();
        let gain = audio.createGain();

        osc.type = "square";
        osc.frequency.value = notas[i];

        gain.gain.value = 0.1;

        osc.connect(gain);
        gain.connect(audio.destination);

        osc.start();

        setTimeout(function()
        {
            osc.stop();
        }, 150);

        i++;

        if(i >= notas.length)
            i = 0;

    }, 200);
}


function stop()
{
    clearInterval(timer);

    if(audio)
    {
        audio.close();
        audio = null;
    }
}

</script>
</body>
</html>

Creo que no necesita imagen son solo 2 botones el Play y Stop, seguimos con el último código

<html>
<head>
    <meta charset="UTF-8">
    <title>Chiptune clásico</title>
</head>

<body>
<button onclick="play()">▶ Play</button>
<button onclick="stop()">■ Stop</button>
<script>
let audio;
let timer;
let i = 0;

let notas = [
    261.63, 329.63, 392.00, 523.25,
    392.00, 329.63, 261.63, 196.00,

    293.66, 349.23, 440.00, 587.33,
    440.00, 349.23, 293.66, 220.00,

    329.63, 392.00, 493.88, 659.25,
    493.88, 392.00, 329.63, 261.63,

    392.00, 523.25, 659.25, 783.99,
    659.25, 523.25, 392.00, 329.63
];

function play()
{
    stop();

    audio = new AudioContext();

    i = 0;

    timer = setInterval(function()
    {
        let osc = audio.createOscillator();
        let gain = audio.createGain();

        osc.type = "square";
        osc.frequency.value = notas[i];

        gain.gain.value = 0.08;

        osc.connect(gain);
        gain.connect(audio.destination);

        osc.start();

        setTimeout(function()
        {
            osc.stop();
        }, 100);

        i++;

        if(i >= notas.length)
        {
            i = 0;
        }

    }, 150);
}

function stop()
{
    clearInterval(timer);

    if(audio)
    {
        audio.close();
        audio = null;
    }
}
</script>
</body>
</html>

Bueno espero les guste, silos quieren probar solo copean y pegan en el bloc de notas como música.html y ejecutan... Ami me gustan los sonidos en los keygen por ese motivo los quiero implementar en el futuro y solo hice un tema de esto porque quiero que lo vean solo sin más paja y no se equivoquen en el futuro con la generación del serial u otra cosa.

Saludos Flamer

sábado, 15 de agosto de 2026

Editor Hexadecimal En JavaScript y HTML

Hola amigos hoy no vengo con un crackme sino con un simple programa que se me vino ala mente, ya que los que hacemos ingeniería inversa usamos mucho los editores hexadecimales, así que se me ocurrió hacer uno simple en JavaScript y HTML solo que hay un inconveniente solo acepta ejecutables o archivos que pesen menos de 1 megabyte, ya que si le pongo un valor mayor este programa o mejor dicho el navegador se nos trabaría y si así con 700 kb se quiere trabar en fin aquí una foto del programa ya terminado, otra cosa use chatgpt para hacerlo es una herramienta muy cómoda de programar y sin quebrarte tanto la cabeza y no por eso nos va a sustituir, ya que tenemos que revisar bien el código, bueno aquí la foto


Y si se preguntan que podemos hacer, pues les cuento al cargar el ejecutable nos muestra sus valores en hexadecimal y podemos seleccionar los bytes para modificarlos y si quieren descargar la nueva versión solo dan en clic en el botón guardar, también pueden comparar los archivos si son iguales o diferentes en algunos bytes y si es diferente estos se marcaran a color, también puedes ir a alguna dirección dada y también te muestra el peso del archivo en bytes...bueno sin tanto rollo aquí les dejo el código por si lo quieren probar solo copean y pegan en el bloc de notas como editor.html

<html lang="es">
<head>
<meta charset="UTF-8">
<title>Editor Hexadecimal</title>
<style>
        *
        {
            box-sizing: border-box;
        }
        body
        {
            margin: 0;

            background: #1e1e1e;

            color: #ddd;

            font-family:
                Consolas,
                "Courier New",
                monospace;
        }
        #barra
        {
            background: #252526;

            padding: 10px;

            border-bottom:
                1px solid #444;

            display: flex;

            gap: 6px;

            align-items: center;

            flex-wrap: wrap;
        }
        button
        {
            background: #333;

            color: white;

            border:
                1px solid #555;

            padding:
                7px 10px;

            cursor: pointer;
        }
        button:hover
        {
            background: #444;
        }
        input[type="text"]
        {
            background: #1e1e1e;

            color: white;

            border:
                1px solid #555;

            padding: 7px;
        }
        input[type="file"]
        {
            display: none;
        }
        #info
        {
            margin-left: auto;

            color: #aaa;
        }
        #resultado
        {
            padding:
                8px 12px;

            background: #202020;

            border-bottom:
                1px solid #444;

            color: #aaa;
        }
        #contador
        {
            color: #ffcc00;
        }
        #cabecera
        {
            display: grid;

            grid-template-columns:
                90px
                1fr
                1fr
                170px;

            padding:
                8px 12px;

            background: #333;

            border-bottom:
                1px solid #555;
        }
        #editor
        {
            height:
                calc(100vh - 180px);

            overflow: auto;
        }
        .fila
        {
            display: grid;

            grid-template-columns:
                90px
                1fr
                1fr
                170px;

            min-height: 27px;

            padding:
                2px 12px;
        }
        .fila:hover
        {
            background: #292929;
        }
        .offset
        {
            color: #569cd6;

            padding-top: 4px;
        }
        .hex
        {
            display: flex;

            gap: 4px;
        }
        .byte
        {
            width: 24px;

            height: 23px;

            background: transparent;

            color: #dcdcaa;

            border:
                1px solid transparent;

            text-align: center;

            font-family:
                Consolas,
                monospace;
        }
        .byte:focus
        {
            outline: none;

            border:
                1px solid #569cd6;

            background: #264f78;
        }
        .byte2
        {
            width: 24px;

            height: 23px;

            color: #9cdcfe;

            text-align: center;

            padding-top: 3px;
        }
        .ascii
        {
            white-space: pre;

            color: #ce9178;
        }
        /*
            Byte diferente
        */
        .diferente
        {
            background:
                #672727 !important;

            color:
                #ff9999 !important;

            border-color:
                #ff5555 !important;
        }
        /*
            Diferencia seleccionada
        */
        .actual
        {
            background:
                #b06000 !important;

            color:
                white !important;

            border-color:
                #ffcc00 !important;
        }
        /*
            Coincidencias de búsqueda
        */
        .busqueda
        {
            background:
                #665c00 !important;

            color:
                #ffff99 !important;

            border-color:
                #ffff00 !important;
        }
        /*
            Coincidencia actual
        */

        .busquedaActual
        {
            background:
                #b06000 !important;

            color:
                white !important;

            border-color:
                #ffcc00 !important;
        }
</style>
</head>
<body>
    <!-- ===================================
         BARRA DE HERRAMIENTAS
         =================================== -->
    <div id="barra">
        <button onclick="abrir1()">
            Abrir archivo 1
        </button>
        <button onclick="abrir2()">
            Abrir archivo 2
        </button>
        <button onclick="comparar()">
            Comparar
        </button>
        <button onclick="primeraDiferencia()">
            |&lt;
        </button>
        <button onclick="anteriorDiferencia()">
            &lt;
        </button>
        <button onclick="siguienteDiferencia()">
            &gt;
        </button>
        <button onclick="ultimaDiferencia()">
            &gt;|
        </button>
        <span id="contador">
            Diferencias: 0
        </span>
        <input type="text" id="buscar" placeholder="Buscar HEX/texto">
        <button onclick="buscar()">
            Buscar
        </button>
        <button onclick="anteriorBusqueda()">
            Buscar anterior
        </button>
        <button onclick="siguienteBusqueda()">
            Buscar siguiente
        </button>
        <input type="text" id="offset" placeholder="Offset HEX" style="width: 100px;">
        <button onclick="irAOffset()">
            Ir
        </button>
        <button onclick="guardar()">
            Guardar
        </button>
        <span id="info">
            Sin archivos
        </span>
    </div>
    <!-- ===================================
         RESULTADO
         =================================== -->
    <div id="resultado">
        Abre dos archivos y pulsa Comparar.
    </div>
    <!-- ===================================
         INPUTS DE ARCHIVOS
         =================================== -->
    <input type="file" id="archivo1">
    <input type="file" id="archivo2">
    <!-- ===================================
         CABECERA
    =================================== -->
    <div id="cabecera">
        <div>
            OFFSET
        </div>
        <div>
            ARCHIVO 1
        </div>
        <div>
            ARCHIVO 2
        </div>
        <div>
            ASCII
        </div>
    </div>
    <!-- ===================================
         EDITOR
     =================================== -->


    <div id="editor"></div>
<script>
/*
    ====================================
    VARIABLES
    ====================================
*/
let datos1 = new Uint8Array(0);
let datos2 = new Uint8Array(0);
let nombre1 = "archivo1.bin";
let nombre2 = "archivo2.bin";
const MAX_TAMANO = 1024 * 1024;
/*
    Lista de diferencias
*/
let diferencias = [];
/*
    Índice de diferencia actual
*/
let indiceDiferencia = -1;
/*
    Lista de resultados de búsqueda
*/
let resultadosBusqueda = [];
/*
    Índice de búsqueda actual
*/
let indiceBusqueda = -1;
/*
    Elementos HTML
*/
const archivo1 = document.getElementById("archivo1");
const archivo2 = document.getElementById("archivo2");
const editor = document.getElementById("editor");
/*
    ====================================
    ABRIR ARCHIVO 1
    ====================================
*/
function abrir1()
{
   archivo1.click();
}
archivo1.addEventListener("change", async function()
{
    const archivo = this.files[0];

    if(!archivo)
    {
        return;
    }

    if(archivo.size > MAX_TAMANO)
    {
        alert("El archivo no puede superar 1 MB.");

        this.value = "";

        return;
    }

    nombre1 = archivo.name;

    const buffer = await archivo.arrayBuffer();

    datos1 = new Uint8Array(buffer);

    /*
        Limpiar comparación
    */

    diferencias = [];

    indiceDiferencia = -1;

    mostrar();

    actualizarInfo();
});
/*
    ====================================
    ABRIR ARCHIVO 2
    ====================================
*/
function abrir2()
{
   archivo2.click();
}
archivo2.addEventListener("change", async function()
{
    const archivo = this.files[0];

    if(!archivo)
    {
        return;
    }

    if(archivo.size > MAX_TAMANO)
    {
        alert("El archivo no puede superar 1 MB.");

        this.value = "";

        return;
    }

    nombre2 = archivo.name;

    const buffer = await archivo.arrayBuffer();

    datos2 = new Uint8Array(buffer);

    diferencias = [];

    indiceDiferencia = -1;

    mostrar();

    actualizarInfo();
});
/*
    ====================================
    ACTUALIZAR INFORMACIÓN
    ====================================
*/
function actualizarInfo()
{
   document.getElementById("info").textContent = "Archivo 1: " + datos1.length + " bytes | Archivo 2: " + datos2.length + " bytes";
}
/*
    ====================================
    MOSTRAR ARCHIVOS
    ====================================
*/
function mostrar()
{
   editor.innerHTML = "";
   const max = Math.max(datos1.length, datos2.length);
   const fragment = document.createDocumentFragment();
   /*
       Recorrer archivo
       en grupos de 16 bytes
   */
   for(let i = 0; i < max; i += 16)
   {
      const fila = document.createElement("div");
      fila.className = "fila";
      /*
          ----------------------------
          OFFSET
          ----------------------------
      */
      const offset = document.createElement("div");
      offset.className = "offset";
      offset.textContent = i.toString(16).padStart(8, "0").toUpperCase();
      fila.appendChild(offset);
      /*
          ----------------------------
          HEX ARCHIVO 1
          ----------------------------
      */
      const hex1 = document.createElement("div");
      hex1.className = "hex";
      /*
          ----------------------------
          HEX ARCHIVO 2
          ----------------------------
      */
      const hex2 = document.createElement("div");
      hex2.className = "hex";
      /*
          ----------------------------
          ASCII
          ----------------------------
      */
      const ascii = document.createElement("div");
      ascii.className = "ascii";
      let texto = "";
      /*
          Mostrar 16 bytes
      */
      for(let j = 0; j < 16; j++)
      {
         const pos = i + j;
         /*
             ------------------------
             ARCHIVO 1
             ------------------------
         */
         if(pos < datos1.length)
         {
            const input = document.createElement("input");
            input.className = "byte";
            input.maxLength = 2;
            input.value = datos1[pos].toString(16).padStart(2, "0").toUpperCase();
            input.dataset.pos = pos;
            input.addEventListener("input", editarByte);
            input.addEventListener("keydown", navegar);
            hex1.appendChild(input);
         }
         else
         {
            const espacio = document.createElement("span");
            espacio.style.width = "24px";
            hex1.appendChild(espacio);
         }
         /*
             ------------------------
             ARCHIVO 2
             ------------------------
         */
         if(pos < datos2.length)
         {
            const span = document.createElement("span");
            span.className = "byte2";
            span.textContent = datos2[pos].toString(16).padStart(2, "0").toUpperCase();
            span.dataset.pos = pos;
            hex2.appendChild(span);
         }
         else
         {
            const espacio = document.createElement("span");
            espacio.style.width = "24px";
            hex2.appendChild(espacio);
         }
         /*
             ------------------------
             ASCII
             ------------------------
         */
         let b = null;
         if(pos < datos1.length)
         {
            b = datos1[pos];
         }
         else if(pos < datos2.length)
         {
            b = datos2[pos];
         }
         if(b !== null)
         {
            if(b >= 32 && b <= 126)
            {
               texto += String.fromCharCode(b);
            }
            else
            {
               texto += ".";
            }
         }
         else
         {
            texto += " ";
         }
      }
      ascii.textContent = texto;
      fila.appendChild(hex1);
      fila.appendChild(hex2);
      fila.appendChild(ascii);
      fragment.appendChild(fila);
   }
   editor.appendChild(fragment);
   /*
       Marcar diferencias
   */
   if(diferencias.length > 0)
   {
      marcarDiferencias();
   }
   /*
       Marcar búsquedas
   */
   if(resultadosBusqueda.length > 0)
   {
      marcarBusquedas();
   }
}
/*
    ====================================
    COMPARAR
    ====================================
*/
function comparar()
{
   diferencias = [];
   indiceDiferencia = -1;
   const max = Math.max(datos1.length, datos2.length);
   /*
       Comparar cada byte
   */
   for(let i = 0; i < max; i++)
   {
      const a = i < datos1.length ? datos1[i] : null;
      const b = i < datos2.length ? datos2[i] : null;
      if(a !== b)
      {
         diferencias.push(i);
      }
   }
   document.getElementById("contador").textContent = "Diferencias: " + diferencias.length;
   /*
       No existen diferencias
   */
   if(diferencias.length === 0)
   {
      document.getElementById("resultado").textContent = "Los archivos son idénticos.";
      mostrar();
      return;
   }
   /*
       Existen diferencias
   */
   document.getElementById("resultado").textContent = "Se encontraron " + diferencias.length + " diferencias.";
   mostrar();
   /*
       Ir a la primera
   */
   indiceDiferencia = 0;
   irADiferencia();
}
/*
    ====================================
    MARCAR DIFERENCIAS
    ====================================
*/
function marcarDiferencias()
{
   for(let i = 0; i < diferencias.length; i++)
   {
      const pos = diferencias[i];
      const e1 = document.querySelector('.byte[data-pos="' + pos + '"]');
      const e2 = document.querySelector('.byte2[data-pos="' + pos + '"]');
      if(e1)
      {
         e1.classList.add("diferente");
      }
      if(e2)
      {
         e2.classList.add("diferente");
      }
   }
}
/*
    ====================================
    IR A DIFERENCIA
    ====================================
*/
function irADiferencia()
{
   if(diferencias.length === 0)
   {
      return;
   }
   /*
       Quitar selección anterior
   */
   document.querySelectorAll(".actual").forEach(function(elemento)
   {
      elemento.classList.remove("actual");
   });
   const pos = diferencias[indiceDiferencia];
   const e1 = document.querySelector('.byte[data-pos="' + pos + '"]');
   const e2 = document.querySelector('.byte2[data-pos="' + pos + '"]');
   if(e1)
   {
      e1.classList.add("actual");
      e1.scrollIntoView(
      {
         behavior: "smooth",
         block: "center"
      });
   }
   if(e2)
   {
      e2.classList.add("actual");
   }
   const a = pos < datos1.length ? datos1[pos] : null;
   const b = pos < datos2.length ? datos2[pos] : null;
   const offset = "0x" + pos.toString(16).toUpperCase().padStart(8, "0");
   const valorA = a === null ? "--" : a.toString(16).padStart(2, "0").toUpperCase();
   const valorB = b === null ? "--" : b.toString(16).padStart(2, "0").toUpperCase();
   document.getElementById("resultado").textContent = "Diferencia " + (indiceDiferencia + 1) + " de " + diferencias.length + " | Offset " + offset + " | " + valorA + " → " + valorB;
}
/*
    ====================================
    PRIMERA DIFERENCIA
    ====================================
*/
function primeraDiferencia()
{
   if(diferencias.length === 0)
   {
      return;
   }
   indiceDiferencia = 0;
   irADiferencia();
}
/*
    ====================================
    DIFERENCIA ANTERIOR
    ====================================
*/
function anteriorDiferencia()
{
   if(diferencias.length === 0)
   {
      return;
   }
   indiceDiferencia--;
   if(indiceDiferencia < 0)
   {
      indiceDiferencia = diferencias.length - 1;
   }
   irADiferencia();
}
/*
    ====================================
    SIGUIENTE DIFERENCIA
    ====================================
*/
function siguienteDiferencia()
{
   if(diferencias.length === 0)
   {
      return;
   }
   indiceDiferencia++;
   if(indiceDiferencia >= diferencias.length)
   {
      indiceDiferencia = 0;
   }
   irADiferencia();
}
/*
    ====================================
    ÚLTIMA DIFERENCIA
    ====================================
*/
function ultimaDiferencia()
{
   if(diferencias.length === 0)
   {
      return;
   }
   indiceDiferencia = diferencias.length - 1;
   irADiferencia();
}
/*
    ====================================
    EDITAR BYTE
    ====================================
*/
function editarByte(e)
{
   let valor = e.target.value.replace(/[^0-9a-fA-F]/g, "");
   e.target.value = valor.toUpperCase();
   if(valor.length === 2)
   {
      const pos = parseInt(e.target.dataset.pos);
      const numero = parseInt(valor, 16);
      if(!isNaN(numero))
      {
         datos1[pos] = numero;
      }
   }
}
/*
    ====================================
    NAVEGAR ENTRE BYTES
    ====================================
*/
function navegar(e)
{
   const pos = parseInt(e.target.dataset.pos);
   let nueva = null;
   if(e.key === "ArrowRight")
   {
      nueva = document.querySelector('.byte[data-pos="' + (pos + 1) + '"]');
   }
   if(e.key === "ArrowLeft")
   {
      nueva = document.querySelector('.byte[data-pos="' + (pos - 1) + '"]');
   }
   if(e.key === "ArrowDown")
   {
      nueva = document.querySelector('.byte[data-pos="' + (pos + 16) + '"]');
   }
   if(e.key === "ArrowUp")
   {
      nueva = document.querySelector('.byte[data-pos="' + (pos - 16) + '"]');
   }
   if(nueva)
   {
      e.preventDefault();
      nueva.focus();
      nueva.select();
   }
}
/*
    ====================================
    BUSCAR
    ====================================
*/
function buscar()
{
   const texto = document.getElementById("buscar").value.trim();
   if(!texto)
   {
      return;
   }
   const limpio = texto.replace(/\s+/g, "");
   let patron = [];
   /*
       -------------------------------
       BUSCAR HEX
       -------------------------------
   */
   if(/^[0-9a-fA-F]+$/.test(limpio) && limpio.length % 2 === 0)
   {
      for(let i = 0; i < limpio.length; i += 2)
      {
         patron.push(parseInt(limpio.substr(i, 2), 16));
      }
   }
   /*
       -------------------------------
       BUSCAR TEXTO
       -------------------------------
   */
   else
   {
      for(let i = 0; i < texto.length; i++)
      {
         patron.push(texto.charCodeAt(i));
      }
   }
   /*
       Limpiar resultados
   */
   resultadosBusqueda = [];
   indiceBusqueda = -1;
   /*
       Buscar TODAS las coincidencias
   */
   for(let i = 0; i <= datos1.length - patron.length; i++)
   {
      let encontrado = true;
      for(let j = 0; j < patron.length; j++)
      {
         if(datos1[i + j] !== patron[j])
         {
            encontrado = false;
            break;
         }
      }
      if(encontrado)
      {
         resultadosBusqueda.push(i);
      }
   }
   /*
       No encontrado
   */
   if(resultadosBusqueda.length === 0)
   {
      document.getElementById("resultado").textContent = "No encontrado.";
      mostrar();
      return;
   }
   /*
       Primera coincidencia
   */
   indiceBusqueda = 0;
   mostrar();
   irABusqueda();
}
/*
    ====================================
    MARCAR RESULTADOS DE BÚSQUEDA
    ====================================
*/
function marcarBusquedas()
{
   /*
       Primero marcar todas
   */
   for(let i = 0; i < resultadosBusqueda.length; i++)
   {
      const pos = resultadosBusqueda[i];
      const elemento = document.querySelector('.byte[data-pos="' + pos + '"]');
      if(elemento)
      {
         elemento.classList.add("busqueda");
      }
   }
   /*
       Marcar la actual
   */
   if(indiceBusqueda >= 0)
   {
      const pos = resultadosBusqueda[indiceBusqueda];
      const elemento = document.querySelector('.byte[data-pos="' + pos + '"]');
      if(elemento)
      {
         elemento.classList.remove("busqueda");
         elemento.classList.add("busquedaActual");
      }
   }
}
/*
    ====================================
    IR A BÚSQUEDA
    ====================================
*/
function irABusqueda()
{
   if(resultadosBusqueda.length === 0)
   {
      return;
   }
   /*
       Quitar selección actual
   */
   document.querySelectorAll(".busquedaActual").forEach(function(elemento)
   {
      elemento.classList.remove("busquedaActual");
      elemento.classList.add("busqueda");
   });
   const pos = resultadosBusqueda[indiceBusqueda];
   const elemento = document.querySelector('.byte[data-pos="' + pos + '"]');
   if(elemento)
   {
      elemento.classList.remove("busqueda");
      elemento.classList.add("busquedaActual");
      elemento.scrollIntoView(
      {
         behavior: "smooth",
         block: "center"
      });
      elemento.focus();
      elemento.select();
   }
   const offset = "0x" + pos.toString(16).toUpperCase().padStart(8, "0");
   document.getElementById("resultado").textContent = "Coincidencia " + (indiceBusqueda + 1) + " de " + resultadosBusqueda.length + " | Offset " + offset;
}
/*
    ====================================
    SIGUIENTE BÚSQUEDA
    ====================================
*/
function siguienteBusqueda()
{
   if(resultadosBusqueda.length === 0)
   {
      return;
   }
   indiceBusqueda++;
   if(indiceBusqueda >= resultadosBusqueda.length)
   {
      indiceBusqueda = 0;
   }
   irABusqueda();
}
/*
    ====================================
    BÚSQUEDA ANTERIOR
    ====================================
*/
function anteriorBusqueda()
{
   if(resultadosBusqueda.length === 0)
   {
      return;
   }
   indiceBusqueda--;
   if(indiceBusqueda < 0)
   {
      indiceBusqueda = resultadosBusqueda.length - 1;
   }
   irABusqueda();
}
/*
    ====================================
    IR A OFFSET
    ====================================
*/
function irAOffset()
{
   const valor = document.getElementById("offset").value.trim();
   const pos = parseInt(valor, 16);
   if(isNaN(pos) || pos < 0 || pos >= datos1.length)
   {
      alert("Offset inválido.");
      return;
   }
   irAPosicion(pos);
}
/*
    ====================================
    IR A POSICIÓN
    ====================================
*/
function irAPosicion(pos)
{
   const elemento = document.querySelector('.byte[data-pos="' + pos + '"]');
   if(!elemento)
   {
      return;
   }
   elemento.scrollIntoView(
   {
      behavior: "smooth",
      block: "center"
   });
   elemento.focus();
   elemento.select();
}
/*
    ====================================
    GUARDAR ARCHIVO 1
    ====================================
*/
function guardar()
{
   if(datos1.length === 0)
   {
      alert("No hay archivo abierto.");
      return;
   }
   const blob = new Blob(
      [datos1],
      {
         type: "application/octet-stream"
      });
   const enlace = document.createElement("a");
   enlace.href = URL.createObjectURL(blob);
   enlace.download = nombre1;
   enlace.click();
   URL.revokeObjectURL(enlace.href);
}
/*
    ====================================
    ATAJOS DE TECLADO
    ====================================
*/
document.addEventListener("keydown", function(e)
{
   /*
       Ctrl + S
   */
   if(e.ctrlKey && e.key.toLowerCase() === "s")
   {
      e.preventDefault();
      guardar();
   }
   /*
       Ctrl + F
   */
   if(e.ctrlKey && e.key.toLowerCase() === "f")
   {
      e.preventDefault();
      document.getElementById("buscar").focus();
   }
   /*
       F3
       Siguiente búsqueda
   */
   if(e.key === "F3" && !e.shiftKey)
   {
      e.preventDefault();
      if(resultadosBusqueda.length > 0)
      {
         siguienteBusqueda();
      }
      else
      {
         siguienteDiferencia();
      }
   }
   /*
       Shift + F3
       Anterior búsqueda
   */
   if(e.key === "F3" && e.shiftKey)
   {
      e.preventDefault();
      if(resultadosBusqueda.length > 0)
      {
         anteriorBusqueda();
      }
      else
      {
         anteriorDiferencia();
      }
   }
});
</script>
</body>
</html>


Bueno creo que eso es todo aquí les dejo una foto donde compare un ejecutable el original y el modificado



Espero les guste saludos Flamer y si le falta algo me dicen ya que es algo muy simple