[Sell server files]
with systems - ServerFiles + Client + ServerSource + Client Source
special offer 80 euro everything
The client is fully translated into all languages
missions: English, German
locale_string: English
If you have any questions or interests:
Skype: metser.norbi
Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Hola amigos de Metin2Zone
El día de hoy les traigo unos files que aunque no he probado, se ve que son bastante buenos, les dejo todo, como siempre.....
Nota hecha por el creador de los files: Funciona siempre y cuando se omitan algunos errores del src de python
Caracteristicas:
Nivel 1 Inicio Nivel 120 Fin. (Cambiable)
Sistema de cinturón oficial
Sistema oficial de mascotas (con nivel)
Sistema de cinturón oficial
Evento Okey oficial
Sistema de tienda sin conexión
2 CH Dragon Room (escritura electiva)
Sistema de bendición de grupo de chamanes
Capa de coraje ilimitado
Sistema de equipo rápido
Sistema de registro de cuenta rápida
Sistema de categoría de tareas
Ventana de amigos avanzada
Ventana avanzada de PM
Sistema de buzones
Templo oficial del zodiaco
Batalla oficial de Hydra Ship
Sistema de expansión de inventario
Sistema de dados grupales
Pasajero Sistema de pasajeros
Sistema de aumento de HP calificado
Sistema de interrupción de hechizos de piedra
Sistema de invisibilidad del mapa de bueyes
Sistema de bloqueo de caracteres
Sistema de agente de guerra de gremios
Comercio e historia del mercado
Monitoreo de la sala del dragón y sistema de control vacío
Cambio rápido de canal sin error
Sistema de evolución de armas
4 Sistema de piedra activo!
Sistema de información del jefe
Sistema de seguimiento de mazmorras!
Nuevos trajes activos!
Sistema de paquete de cachemir
Sistema de configuración del teclado
Sistema de inventario K
Renderizar sistema de destino
Sistema Rün Power Stone
Sistema de espejo de pecho
Sistema de alquimia Mitsi
Sistema Youtuber
Sistema NPC remoto
Sistema de combinación de artículos
7-8 Sistema Skiller
Sistema auxiliar de Afrodita de Chamán
Sala oficial Nemere-Razador
Sistema de vestuario de armas
Generación de aniversario, etc. Activo!
Nuevos mapas activos!
Sistema de prisión activo!
Sistema de 4 piedras
Sistema de mercado Gaya
King Player - King Guild Active!
¡Armas de jóvenes héroes!
Sistema de escala de la mafia
Sistema oficial de emociones
Sistema de caza automático
Cristal comercial oficial
Sistema de zona de guerra
Sistema de menú rápido
Sistema de caza de jefes
Sistema de espejo oficial
Sistema de control de bot
Sistema de puntos de éxito
Sistema de llamarada de vestuario
Sistema de bolsa de flecha
Talismán y sistema de elementos
Capturas
Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Descarga:
Mysql -> Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Source Cliente -> Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Source Game-> Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Cliente-> Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Fuente:
Turkmmo
Bueno chicos os traigo este compilador / descompilador, tiene una sensilla interfaz y ala vez no hace falta hacer xml ( ya que el programa mismo no los hace) basta con poner vuestros archivos en las carpetas de los eix/epk.
Descarga por MEGA(Link actualizado por @Dilong): Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Recomiendo actualizar las librerias c++ por si os da el error de mscore100.dll.
Debes iniciar sesión para ver el contenido del enlace en esta publicación.
Creditos:
Luscha, Inforge.
Hola.
Como sabéis, ahora que el source es publico, ya nadie, o casi nadie, hará, ni posteará, más diffs para editar vuestros cores.
Este es uno de los motivos por los cuales hago escribo esta guia, el otro es para dar a la comunidad hispana un poco más de conocimiento, aunque no sea mucho.
Que se necesita para hacer diffs?
Hay quién diga que necesitas saber ASM (assembly), C, y esas cosas. Aunque, yo no sé ninguno de los 2, y creaba diffs.
Lo que más necesitamos es un brain.exe, como se suele decir, paciencia, y el Debes iniciar sesión para ver el contenido del enlace en esta publicación. y un Debes iniciar sesión para ver el contenido del enlace en esta publicación..
Antes de ponernos a toquetear en el IDA, debemos, antes de nada, saber una cosa.
Qué es un diff?
Un diff (difference file) es un archivo que contiene, de una manera simplificada, una (o varias) linea(s) que altera(n) un (o más) bytes de un archivo.
La sintaxis es: offset: byte antiguo byte nuevo.
La creación de un diff no es propriamente un problema, ya que el IDA, dependiendo de lo que hayamos modificado, lo crea solo.
Y a través de un diff no puedes saber lo que cambia.
Después de saber que és un diff, y para que sirve, tenemos que saber qué es lo que queremos cambiar, y donde se localiza, yo, para eso, usaba el Pseudocode de un game core o db core para buscar lo que queria cambiar, obviamente para esto necesitamos el brain.exe, porque tenemos que entender la sintaxis del codigo que hay por ahí. Os dejaré en adjuntos, todos los pseudocodes de todos los game core y db core que tengo
Vale, ahora qué hago?
Yo, para empezar, cogeré el pseudocode del game r40250 y cambiaré... por ejemplo, el nível de diferencia que se necesita para invitar a alguién en un grupo.
Como empezamos?
Hay que saber un poquito de inglés, porque las variables no están escritas en español. Lo que sabemos es que grupo se puede decir party en inglés. Una vez sepamos eso, empezaremos buscando party en nuestro editor de texto (yo uso Notepad++ para esto, vosotros podéis usar algun otro), lo segundo es saber, cuando sucede la acción, o sea, cuando sale el mensajito ese en el chat diciendo que la diferencia de nível es X. Sabemos también que eso pasa cuando invitamos a alguién, invitar en inglés es invite. Entonces ya sabemos que tenemos que buscar algo como PartyInvite.
Cuando encontremos algo de este tipo:
extern char CHARACTER__PartyInvite_CHARACTER______FUNCTION__[12]; // weak
Entonces lo que hacemos es buscar esa función. Ojo, apenas buscamos por CHARACTER__PartyInvite.
Y por fin, encontraremos la función CHARACTER__PartyInvite:
int __fastcall CHARACTER__PartyInvite(int a1, int a2, int a3, int a4){ int v4; // eax@4 int v5; // edx@4 int v6; // ecx@4 int v7; // ebx@6 int v8; // eax@6 int v9; // eax@7 int result; // eax@8 int v11; // eax@10 int v12; // eax@15 int v13; // eax@22 int v14; // eax@23 int v15; // edx@23 int v16; // ecx@23 int v17; // edi@23 int v18; // eax@23 int v19; // edx@25 int v20; // ecx@25 int v21; // [sp+0h] [bp-48h]@3 int v22; // [sp+0h] [bp-48h]@6 int v23; // [sp+20h] [bp-28h]@23 int v24; // [sp+24h] [bp-24h]@23 _BYTE v25[5]; // [sp+2Bh] [bp-1Dh]@29 int v26; // [sp+30h] [bp-18h]@23 int v27; // [sp+34h] [bp-14h]@22 int v28; // [sp+38h] [bp-10h]@1 v28 = *(_DWORD *)_stack_chk_guard__FBSD_1_0; if ( *(_DWORD *)(a3 + 9328) && CParty__GetLeaderPID(a1, a2, *(_DWORD *)(a3 + 9328)) != *(_DWORD *)(a3 + 256) ) { v21 = (int)&unk_848D8B8;LABEL_4: v4 = locale_find(v21); CHARACTER__ChatPacket(a3, 1, (const char *)v4); } else { if ( *(_BYTE *)(a4 + 9104) & 2 ) { v8 = CHARACTER__GetName(a4); v22 = (int)&unk_848D8E8; v7 = v8;LABEL_7: v9 = locale_find(v22); CHARACTER__ChatPacket(a3, 1, (const char *)v9, v7); } else { v11 = CHARACTER__IsPartyJoinableCondition(a3, a4); if ( (unsigned int)v11 <= 0xA ) { switch ( v11 ) { default: goto LABEL_11; case 10: v21 = (int)&unk_848D868; goto LABEL_4; case 8: v21 = (int)&unk_848D4C0; goto LABEL_4; case 7: v12 = CHARACTER__GetName(a4); v22 = (int)"<ÆÄƼ> ÀÌ¹Ì %s´ÔÀº ÆÄƼ¿¡ ¼ÓÇØ ÀÖ½À´Ï´Ù."; v7 = v12; goto LABEL_7; case 6: v21 = (int)&unk_848D480; goto LABEL_4; case 5: v21 = (int)&unk_848D440; goto LABEL_4; case 4: v21 = (int)&unk_848D404; goto LABEL_4; case 3: v21 = (int)&unk_848D3D0; goto LABEL_4; case 2: v21 = (int)&unk_848D39C; goto LABEL_4; case 1: v21 = (int)&unk_848D368; goto LABEL_4; case 0: v27 = *(_DWORD *)(a4 + 256); v13 = std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event______find( a3 + 9340, (int)&v27); v5 = a3 + 9344; if ( a3 + 9344 == v13 ) { v14 = AllocEventInfo_TPartyJoinEventInfo_(); *(_DWORD *)(v14 + 4) = *(_DWORD *)(a4 + 256); *(_DWORD *)(v14 + 8) = *(_DWORD *)(a3 + 256); event_create_ex(&v26, (int)party_invite_event, v14, 10 * passes_per_sec); v17 = v26; v18 = *(_DWORD *)(a4 + 256); v24 = v26; v23 = v18; if ( v26 ) intrusive_ptr_add_ref(v16, v15, v26); std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event_______M_insert_unique( a3 + 9340, (int)&v23); if ( v24 ) intrusive_ptr_release(v20, v19, v24); if ( v17 ) intrusive_ptr_release(v20, v19, v17); v25[0] = 77; *(_DWORD *)&v25[1] = *(_DWORD *)(a3 + 260); DESC__Packet(*(_DWORD *)(a4 + 44), (int)v25, 5); } break; } } else {LABEL_11: sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11); } } } result = *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ v28; if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != v28 ) __stack_chk_fail(v6, v5); return result;}
Ahora a partir de aquí, hay que saber leer. Vayamos por partes:
LABEL_4: v4 = locale_find(v21); CHARACTER__ChatPacket(a3, 1, (const char *)v4); LABEL_7: v9 = locale_find(v22); CHARACTER__ChatPacket(a3, 1, (const char *)v9, v7);
LABEL_4 y LABEL_7 tienen un locale_find y un ChatPacket, lo que significa que buscará en el locale_string.txt un texto que estará dentro del locale_find y luego lo mostrará en el Chat.
Pasemos directamente al switch:
v11 = CHARACTER__IsPartyJoinableCondition(a3, a4); if ( (unsigned int)v11 <= 0xA ) { switch ( v11 ) { default: goto LABEL_11; case 10: v21 = (int)&unk_848D868; goto LABEL_4; case 8: v21 = (int)&unk_848D4C0; goto LABEL_4; case 7: v12 = CHARACTER__GetName(a4); v22 = (int)"<ÆÄƼ> ÀÌ¹Ì %s´ÔÀº ÆÄƼ¿¡ ¼ÓÇØ ÀÖ½À´Ï´Ù."; v7 = v12; goto LABEL_7; case 6: v21 = (int)&unk_848D480; goto LABEL_4; case 5: v21 = (int)&unk_848D440; goto LABEL_4; case 4: v21 = (int)&unk_848D404; goto LABEL_4; case 3: v21 = (int)&unk_848D3D0; goto LABEL_4; case 2: v21 = (int)&unk_848D39C; goto LABEL_4; case 1: v21 = (int)&unk_848D368; goto LABEL_4; case 0: v27 = *(_DWORD *)(a4 + 256); v13 = std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event______find( a3 + 9340, (int)&v27); v5 = a3 + 9344; if ( a3 + 9344 == v13 ) { v14 = AllocEventInfo_TPartyJoinEventInfo_(); *(_DWORD *)(v14 + 4) = *(_DWORD *)(a4 + 256); *(_DWORD *)(v14 + 8) = *(_DWORD *)(a3 + 256); event_create_ex(&v26, (int)party_invite_event, v14, 10 * passes_per_sec); v17 = v26; v18 = *(_DWORD *)(a4 + 256); v24 = v26; v23 = v18; if ( v26 ) intrusive_ptr_add_ref(v16, v15, v26); std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event_______M_insert_unique( a3 + 9340, (int)&v23); if ( v24 ) intrusive_ptr_release(v20, v19, v24); if ( v17 ) intrusive_ptr_release(v20, v19, v17); v25[0] = 77; *(_DWORD *)&v25[1] = *(_DWORD *)(a3 + 260); DESC__Packet(*(_DWORD *)(a4 + 44), (int)v25, 5); } break; } } else {LABEL_11: sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11); }
Como veremos, la variable v11 está obteniendo el valor de una otra función, llamada CHARACTER__IsPartyJoinableCondition.
Entonces, lo que el servidor hará es testear ese valor desde la función switch.
switch ( v11 ) { default: goto LABEL_11;
Si esa variable es false dependiendo de los valores encontrados en los case, entonces irá hasta el LABEL_11, que es un error en syserr:
LABEL_11: sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11);
Si esa condición es verdadera, hará una serie de cosas.
Entonces ya sabemos que, lo que sale en el chat dependerá:
- Del valor de la variable v11, o sea, el valor que la función CHARACTER__IsPartyJoinableCondition obtiene. Ahora que sabemos esto, vayamos directos a esa función.
int __cdecl CHARACTER__IsPartyJoinableCondition(int a1, int a2){ int v2; // edx@1 int result; // eax@2 v2 = a2; if ( *(_BYTE *)(a1 + 9797) == *(_BYTE *)(a2 + 9797) ) { if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 == *(_DWORD *)_stack_chk_guard__FBSD_1_0 ) return CHARACTER__IsPartyJoinableMutableCondition(a1, a2, a1, a2);LABEL_6: __stack_chk_fail(a1, v2); } v2 = *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ *(_DWORD *)_stack_chk_guard__FBSD_1_0; result = 10; if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != *(_DWORD *)_stack_chk_guard__FBSD_1_0 ) goto LABEL_6; return result;}
De aqui no podemos sacar grandes conclusiones, pero, sabemos una cosa:
if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 == *(_DWORD *)_stack_chk_guard__FBSD_1_0 ) return CHARACTER__IsPartyJoinableMutableCondition(a1, a2, a1, a2);
Esta funcion hará return al valor de una otra función. Debemos entonces, movermos hasta esa función, CHARACTER__IsPartyJoinableMutableCondition.
int __fastcall CHARACTER__IsPartyJoinableMutableCondition(int a1, int a2, int a3, int a4){ int v4; // edx@1 char v5; // al@4 __int64 v6; // qax@5 int result; // eax@7 int v8; // eax@10 int v9; // [sp+1Ch] [bp-Ch]@1 v4 = 1; v9 = *(_DWORD *)_stack_chk_guard__FBSD_1_0; if ( *(_BYTE *)(singleton_CPartyManager___ms_singleton + 76) ) { LOBYTE(v4) = 2; if ( !*(_DWORD *)(a3 + 9364) ) { LOBYTE(v4) = 3; if ( !*(_BYTE *)(a4 + 4) ) { v5 = LC_IsCanada(a1); a1 = 15; if ( !v5 ) a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10; v6 = *(_BYTE *)(a3 + 1298) - *(_BYTE *)(a4 + 1298); LODWORD(v6) = (HIDWORD(v6) ^ v6) - HIDWORD(v6); v4 = 4; if ( a1 >= (_DWORD)v6 ) { LOBYTE(v4) = 7; if ( !*(_DWORD *)(a4 + 9328) ) { if ( !*(_DWORD *)(a3 + 9328) || (v8 = CParty__GetMemberCount(a1, v4, *(_DWORD *)(a3 + 9328)), v4 = 8, v8 != 8) ) v4 = 0; } } } } } result = v4; if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != v9 ) __stack_chk_fail(a1, *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ v9); return result;}
La primera cosa en lo que nos fijaremos es en esto:
v5 = LC_IsCanada(a1); a1 = 15; if ( !v5 ) a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10;
La variable v5 será igual a un boolean (true o false), a1 es un integer (un valor entre 0 a 2 millones). Lo que la función hace, es verificar si la variable v5 es false, si así es, el valor de la variable a1 cambia, dependiendo del locale, ya que si este es un locale/brazil el a1 será 10.
a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10;
Esto es lo que se llama, un short if-statement:
a1 = boolean ? valor si es true : valor si es false;
Como el nivel de diferencia en los servidores de europa es 15, podemos concluir que la variable a1 define el nivel de diferencia y es el valor que queremos cambiar.
Toqueteando en el IDA
Después de saber que valor tenemos que cambiar, y donde está, abrimos el IDA:
Y le damos al primer botón (New - Disassemble a new file), seleccionamos nuestro archivo, en mi caso el game r40250, y nos aparecerá algo de este tipo:
Nosotros, sin tocar en nada, le damos al OK. Y esperamos hasta que cargue las funciones.
Cuando nos salga algo así:
Significa que las funciones ya están cargadas.
Ahora le hacemos click en la ventana Function name y escribimos: CHARACTER::IsPartyJoinableMutableCondition y le damos un doble click.
Nosotros simplemente bajamos hasta aqui:
Si le damos al botón de tabulación, nos llevará al pseudocode de esa función y, además, nos dejará en la localización actual, por ejemplo:
call _Z11LC_IsCanadav ; LC_IsCanada(void)mov ecx, 0Fhtest al, aljz short loc_806E8B0
Si hacemos click en el mov y hacemos un jump to pseudocode nos llevará hasta:
a1 = 15;
Yo, como no sé cambiar los valores de los short if-statements, haré NOP (No Operation, que simplemente hace que en esa parte no haga nada).
Entonces, nos moveremos al Hex View y podremos ver que la parte que está seleccionada, es la parte que hemos seleccionado en el IDA View.
Nos vamos a la ventana donde está el LC_IsCanada:
.text:0806E83A jnz short loc_806E878.text:0806E83C call _Z11LC_IsCanadav ; LC_IsCanada(void).text:0806E841 mov ecx, 0Fh.text:0806E846 test al, al.text:0806E848 jz short loc_806E8B0
El short jump if not zero (jnz) si le damos click y vamos al pseudo, veremos que está demasiado arriba del if-statement.
El call al LC sabemos que es una variable
El mov es la variable que queremos cambiar.
El test es el if-statement.
El jump if zero (jz) basicamente es lo que va después de la condición.
Entonces lo que tenemos que hacer, es NOP al jz y al test.
Como?
Facil, seleccionamos lo que queremos cambiar:
Nos vamos al Hex View le damos al F2, y cambiamos los 2 valores que salen seleccionados por 90. Ya que el No Operation (NOP) equivale a 90. Volvemos a darle al F2 para guardar los cambios.
Y luego, hacemos lo mismo con el jz.
Que hemos echo entonces?
Basicamente, lo que hicimos hasta ahora, es dejar el nivel de diferencia entre jugadores para que se inviten sea de 15, ya que el if define todo lo demás, dependiendo del locale.
Si queremos cambiar el 15 por otro, facil. Vamos hasta:
mov ecx, 0Fh
Luego al Hex View, entonces abrimos el Debes iniciar sesión para ver el contenido del enlace en esta publicación., ponemos 15 donde el 1, y le damos click a to hexadecimal, que nos saldra un f, o sea 15 en hexadecimal equivale a 0F.
Buscaremos eso en el Hex View, le damos al F2. Volvemos al conversor, y convertimos el valor que queremos poner a cambio de 15. Yo por ejemplo, pondré 5 que es 05. Le daré al F2 otra vez para guardar los cambios.
Entonces si vuelvo al pseudo me saldrá:
v5 = LC_IsCanada(a1, v4); a1 = 5;
En vez de:
v5 = LC_IsCanada(a1, v4); a1 = 15;
Eso es porque hemos cambiado el 15 por 5 en el Hex View.
Por fin, como creamos la diff después de cambiar lo que queramos?
Y mi diff me saldrá así:
This difference file has been created by IDA Progame_r4025000026842: 0F 05 // Esto es el cambio de la variable a1, de 15 a 5// Estos NOP es de la condición que hemos "eliminado"00026846: 84 9000026847: C0 9000026848: 74 9000026849: 66 90
Y por último os dejo aqui los pseudocode que tengo: Debes iniciar sesión para ver el contenido del enlace en esta publicación.