1)No he depurado el programa, pero por un vistazo rapido del tutorial creo que:
Como en este caso son "stolen kilobytes", es decir, una buena parte del codigo ha sido movida, para el caso, la rutina de inicio.
Entonces, en vez de redirigir el programa a la verdadera rutina de inicio (cambiando EP, por el OEP) que es lo que normalmente se hace, y se colocan los stolen bytes, en este caso, como los stolenbytes no estan "escondidos" sino simplemente movidos a otro lado sin saltos inecesarios, el autor del articulo decidio mover esos stolen bytes al EP del programa.
Es decir, en vez de buscar el OEP y remplazar alli los stolen bytes, mueve la rutina inicial (stolen kilobytes) al EP de la ejecutable, es decir, EntryPoint ejecutable empaquetada que ahora fue desempaquetada.
Creo que lo que permitio hacer esto fue que el programador del unpackme, remplazo la rutina inicial de la oep por otra rutina. Y escondió toda la rutina inicial.
Entonces, marciano colocó la rutina completa en el EP del programa y de seguro que esta rutina inicializa la ejecutable, y luego hacen un salto far o un call far a una direccion de memoria absoluta, por eso el codigo se pudo seguir ejecutando.
2)hablando de saltos absolutos, cambiamos a CALL NEAR. Son saltos a rutinas que se encuentran dentro del mismo segmento del codigo, por ende, su direccion es relativa a la posicion actual. Una call near repetido dos veces nunca tiene el mismo opcode.
ej:
Son todos llamados contiguos.
Cada llamado ocupa 5 bytes.
Casualidad que cada vez que se genera el opcode E8 VVXXYYZZ, VV disminuye en 5 (cada vez se acerca en 5 bytes a donde se hace el salto)
Al hacer copy past de los stolen bytes, en el lugar donde NO corresponden, las direcciones relativas de los OPCODES en los CALL NEAR no sirven, son distintas.
Es decir, CALL miprograma._mifuncionX sigue siendo la misma intruccion (texto) pero los opcode son diferentes (binary past no sirve)
0)Del primer punto no estoy seguro, no me he puesto a desempaquetar programas, no tengo experiencia en el area, pero por lo que pude ver, tendria que ser eso. Es la única
saludos.
Como en este caso son "stolen kilobytes", es decir, una buena parte del codigo ha sido movida, para el caso, la rutina de inicio.
Entonces, en vez de redirigir el programa a la verdadera rutina de inicio (cambiando EP, por el OEP) que es lo que normalmente se hace, y se colocan los stolen bytes, en este caso, como los stolenbytes no estan "escondidos" sino simplemente movidos a otro lado sin saltos inecesarios, el autor del articulo decidio mover esos stolen bytes al EP del programa.
Es decir, en vez de buscar el OEP y remplazar alli los stolen bytes, mueve la rutina inicial (stolen kilobytes) al EP de la ejecutable, es decir, EntryPoint ejecutable empaquetada que ahora fue desempaquetada.
Creo que lo que permitio hacer esto fue que el programador del unpackme, remplazo la rutina inicial de la oep por otra rutina. Y escondió toda la rutina inicial.
Entonces, marciano colocó la rutina completa en el EP del programa y de seguro que esta rutina inicializa la ejecutable, y luego hacen un salto far o un call far a una direccion de memoria absoluta, por eso el codigo se pudo seguir ejecutando.
2)hablando de saltos absolutos, cambiamos a CALL NEAR. Son saltos a rutinas que se encuentran dentro del mismo segmento del codigo, por ende, su direccion es relativa a la posicion actual. Una call near repetido dos veces nunca tiene el mismo opcode.
ej:
Citar
0040102A E8 1E000000 call KeyMeNoD.0040104D
0040102F E8 19000000 call KeyMeNoD.0040104D
00401034 E8 14000000 call KeyMeNoD.0040104D
00401039 E8 0F000000 call KeyMeNoD.0040104D
0040103E E8 0A000000 call KeyMeNoD.0040104D
00401043 E8 05000000 call KeyMeNoD.0040104D
00401048 E8 00000000 call KeyMeNoD.0040104D ;call inutil, llama instruccion siguiente
0040104D E8 FBFFFFFF call KeyMeNoD.0040104D ;call imposible, se llama a si mismo generando stackoverflow
00401052 E8 F6FFFFFF call KeyMeNoD.0040104D
00401057 E8 F1FFFFFF call KeyMeNoD.0040104D
0040105C E8 ECFFFFFF call KeyMeNoD.0040104D
00401061 E8 E7FFFFFF call KeyMeNoD.0040104D
00401066 E8 E2FFFFFF call KeyMeNoD.0040104D
0040106B E8 DDFFFFFF call KeyMeNoD.0040104D
00401070 E8 D8FFFFFF call KeyMeNoD.0040104D
00401075 E8 D3FFFFFF call KeyMeNoD.0040104D
0040107A E8 CEFFFFFF call KeyMeNoD.0040104D
Son todos llamados contiguos.
Cada llamado ocupa 5 bytes.
Casualidad que cada vez que se genera el opcode E8 VVXXYYZZ, VV disminuye en 5 (cada vez se acerca en 5 bytes a donde se hace el salto)
Al hacer copy past de los stolen bytes, en el lugar donde NO corresponden, las direcciones relativas de los OPCODES en los CALL NEAR no sirven, son distintas.
Es decir, CALL miprograma._mifuncionX sigue siendo la misma intruccion (texto) pero los opcode son diferentes (binary past no sirve)
0)Del primer punto no estoy seguro, no me he puesto a desempaquetar programas, no tengo experiencia en el area, pero por lo que pude ver, tendria que ser eso. Es la única
saludos.