Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: theghost_te en 12 Noviembre 2010, 16:26 PM

Título: Una duda sobre ASM y las APIS
Publicado por: theghost_te en 12 Noviembre 2010, 16:26 PM
Hola amigos estoy practicando ASM desde hace un tiempito con unos tutos y cursos que encontrè aqui, y veo que para ejecutar instrucciones como por ejemplo: para mostrar un mensaje en C++ o VB usabamos el API MessageBox y en ASM para hacer esto varia un poco pero en esencia es lo mismo porque llama a la API, mi pregunta: Habrà alguna manera de ejecutar en ASM esas instrucciones que usamos normalmente en lenguaje como C++, ejem: borrar archivos, messagebox,crear carpeta.. etc pero sin tener que recurrir a las APIS, es decir : habrà alguna manera kizas de trabajar mas directo con la computadora a mas bajo nivel, sin tener que pasar por sus .DLLs (APIs), porque de esa manera creo tendria màs defensa y poder nuestra aplicacioòn contra los HOOKS.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 12 Noviembre 2010, 17:09 PM
tienes que pasar por la api.

Citarporque de esa manera creo tendria màs defensa y poder nuestra aplicacioòn contra los HOOKS.

yo creo que es al contrario, si te dan mas acceso  los virus tienen el mismo privilegio que tu, da un ojo a los virus antiguos y comparalos con los de hoy en dia y veras que diferencia en cuanto a "poder".
Título: Re: Una duda sobre ASM y las APIS
Publicado por: theghost_te en 12 Noviembre 2010, 17:31 PM
Ah ok, pero nu has respondido la pregunta ¿se puede o no ejecutar esas instrucciones sin llamar a la API?, quiero borrar un archivo y tengo un hook esperando a interceptar el API de borrar ¿còmo podrias evadir el hook?
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 12 Noviembre 2010, 20:37 PM
Es un tema muy amplio y DEPENDE totalmente de el punto en que se intercepte, si es un hook en modo Usuario por ejemplo podrias copiar las instrucciones de la funcion de la API originales (leyendo del disco si hace falta) y ejecutarlas desde otra direccion o incluso restaurar el codigo original (esto lo podes hacer en C/C++ facilmente). Si hay un hook o un callback en modo Kernel con un simple programa no vas a poder hacer nada ...
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 12 Noviembre 2010, 23:05 PM
si es un hook simple (jmp) vas a la direccion donde apunta y tendras por ahi cerca las instrucciones reales, pero para un software en especifico hay que estudiar el caso primero.

Los hooks en modo kernel suelen tener bastantes fallos, en la zona de malware puse un ejemplo que se salta openprocess desde modo usuario. logicamente que esto no se da en el 100% pero haciendo pruebas es sorprendente la cantidad de software afectado.

PD: si te conteste, te dije que tienes que pasar por la api.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: theghost_te en 13 Noviembre 2010, 00:55 AM
OK todo me quedo claro , gracias.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 13 Noviembre 2010, 01:30 AM
Cita de: bizco en 12 Noviembre 2010, 23:05 PM
si es un hook simple (jmp) vas a la direccion donde apunta y tendras por ahi cerca las instrucciones reales, pero para un software en especifico hay que estudiar el caso primero.

Normalmente NO es el caso, lo que tenes es una funcion que eventualmente llamara a o no a la original.

Cita de: bizco en 12 Noviembre 2010, 23:05 PMLos hooks en modo kernel suelen tener bastantes fallos, en la zona de malware puse un ejemplo que se salta openprocess desde modo usuario. logicamente que esto no se da en el 100% pero haciendo pruebas es sorprendente la cantidad de software afectado.

Mas que saltar es engañar a software mal hecho, desde el vamos usar hooks es un error igual, el 99% de los casos estan cubiertos por callbacks/filtros.
Si vemos el ejemplo de borrar un archivo es practicamente seguro que se usa un filtro y no un hook.

Cita de: bizco en 12 Noviembre 2010, 23:05 PMPD: si te conteste, te dije que tienes que pasar por la api.

¿Por cual API? Como poder se puede hacer la transicion a modo Kernel manualmente tal como la hace NTDLL.dll ... conozco al menos un malware que hacia lo que mencione antes de ejecutar las intrucciones por si mismo desde otra direccion, no pasaba por la API.


PD. Estuve leyendo el articulo, que mala memoria tengo jaja, en Mayo hizo ruido y desde arriba nos preguntaron asustados si eramos vulnerables. Por cierto, un grande Andrey, trabaje un par de años con el.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 13 Noviembre 2010, 05:01 AM
CitarNormalmente NO es el caso, lo que tenes es una funcion que eventualmente llamara a o no a la original.

yo en los casos que he visto, es mas el porcentaje que guarda los bytes reales para hacer la llamada o no.

CitarMas que saltar es engañar a software mal hecho, desde el vamos usar hooks es un error igual, el 99% de los casos estan cubiertos por callbacks/filtros.

es lo mismo, evadir una restriccion sea de el modo que sea es saltarsela , engañar, burlar llamemosle como sea.

¿Por cual API? Como poder se puede hacer la transicion a modo Kernel manualmente tal como la hace NTDLL.dll

si ¿y la ntdll no va a morir a la api del sistema?, igual estoy confundido pero me gustaria ver un MessageBox por ejemplo sin tocar en ningun caso una una dll del sistema, o borrar archivos sin hacer uso alguno de ninguna funcion modo usuario/kernel y que sea estable y funcional en todos los sistemas windows  logicamente.

PD: con api me refiero tanto en modo usuario como en modo kernel, hacer una aplicacion sin tocar en ningun caso ni una sola funcion.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 13 Noviembre 2010, 12:18 PM
Cita de: bizco en 13 Noviembre 2010, 05:01 AMyo en los casos que he visto, es mas el porcentaje que guarda los bytes reales para hacer la llamada o no.

Seguro pero el salto al comienzo de la funcion hookeada no va ahi, me atreveria a decir que siempre va a otra funcion que hace algo al menos (sino no tiene sentido hookear) y el codigo original puede estar en cualquier lado mas o menos cerca pero nunca ahi mismo.

Cita de: bizco en 13 Noviembre 2010, 05:01 AMes lo mismo, evadir una restriccion sea de el modo que sea es saltarsela , engañar, burlar llamemosle como sea.

Puede ser pero el codigo del hook sigue siendo ejecutado siempre, no es como el caso al que me refiero justo despues.

Cita de: bizco en 13 Noviembre 2010, 05:01 AMsi ¿y la ntdll no va a morir a la api del sistema?, igual estoy confundido pero me gustaria ver un MessageBox por ejemplo sin tocar en ningun caso una una dll del sistema, o borrar archivos sin hacer uso alguno de ninguna funcion modo usuario/kernel y que sea estable y funcional en todos los sistemas windows  logicamente.

Partimos de diferente nomenclatura pero el se refirio a DLLs y APIs y se entiende como API de Windows el subsistema de ventanas (ni el Kernel ni la parte del subsistema de ventanas en modo Kernel en XP, al cual la API termina llamando, son .DLLs) y son una serie de DLLs de modo Usuario (Kernel32, User32, Advapi32, etc.) que si son hookeadas pueden ser saltados los hooks por estar el llamado y el llamador en el mismo CPL.
Lo mismo ocurre con los servicios del sistema que son llamados desde la NTDLL, User32 o Gdi32 (tal y como en MS-DOS son los de la 21h, en Windows son los de la 2Eh aunque ahora se usen instrucciones mas modernas).

Supongamos un hook simple en modo Usuario, lo siguiente es lo que hacia el malware que mencione antes:

;antes del hook
kernel32!OpenProcess:
7c8309e9 8bff            mov     edi,edi
7c8309eb 55              push    ebp
7c8309ec 8bec            mov     ebp,esp
7c8309ee 83ec20          sub     esp,20h
7c8309f1 8b4510          mov     eax,dword ptr [ebp+10h]
7c8309f4 8945f8          mov     dword ptr [ebp-8],eax
7c8309f7 8b450c          mov     eax,dword ptr [ebp+0Ch]
7c8309fa 56              push    esi

;supuesto hook
kernel32!OpenProcess:
7c8309e9 e922269dd3      jmp     50203010
7c8309ee 83ec20          sub     esp,20h
7c8309f1 8b4510          mov     eax,dword ptr [ebp+10h]
7c8309f4 8945f8          mov     dword ptr [ebp-8],eax
7c8309f7 8b450c          mov     eax,dword ptr [ebp+0Ch]
7c8309fa 56              push    esi
7c8309fb 33f6            xor     esi,esi
7c8309fd f7d8            neg     eax

Lo unico que tiene que hacer el que quiera saltar el hook es esto:
mov     edi,edi
push    ebp
mov     ebp,esp
jmp 7c8309ee

Es decir ejecutar por su cuenta los primeros bytes que han sido reemplazados por el hook (estos bytes se pueden leer del disco facilmente) y saltar a la funcion originales despues del hook. Despues existen mas complicaciones como rebasear el codigo y desensamblar para encontrar la ultima instruccion completa que quedo tras el salto pero alguien ya lo hizo, simplemente sobreescribir el codigo del hook por el original es muchisimo mas simple.

En cuanto al tema API y demas, de Windows Internals:

Windows API functions Documented, callable subroutines in the Windows API. Examples include CreateProcess, CreateFile, and GetMessage.

Native system services (or executive system services) The undocumented, underlying services in the operating system that are callable from user mode. For example, NtCreateProcess is the internal system service the Windows CreateProcess function calls to create a new process. (For a definition of native functions, see the section "System Service Dispatching" in Chapter 3.)

Kernel support functions (or routines) Subroutines inside the Windows operating system that can be called only from kernel mode (defined later in this chapter). For example, ExAllocatePool is the routine that device drivers call to allocate memory from the Windows system heaps.

Cita de: bizco en 13 Noviembre 2010, 05:01 AMPD: con api me refiero tanto en modo usuario como en modo kernel, hacer una aplicacion sin tocar en ningun caso ni una sola funcion.

La API como tal es de modo Usuario, esto solo se puede hacer desde modo Kernel directamente O lo podes hacer habilitando los puertos de I/O que quieras desde Kernel y accediendo desde Usuario (estan bloqueados por defecto). Obviamente seria un tremendisima hack pero que yo sepa ya existen porquerias que acceden al disco directamente.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 13 Noviembre 2010, 13:01 PM
CitarSeguro pero el salto al comienzo de la funcion hookeada no va ahi, me atreveria a decir que siempre va a otra funcion que hace algo al menos (sino no tiene sentido hookear) y el codigo original puede estar en cualquier lado mas o menos cerca pero nunca ahi mismo.

logico, creo que no me entendiste logicamente sabiendo que funcion tenemos es sencillo buscar si dentro de la redireccion se encuentra el codigo original. pero el quiere sin usar ninguna ninguna funcion de windows.

Citar
Partimos de diferente nomenclatura pero el se refirio a DLLs y APIs y se entiende como API de Windows el subsistema de ventanas (ni el Kernel ni la parte del subsistema de ventanas en modo Kernel en XP, al cual la API termina llamando, son .DLLs)

Cito tal cual escribio en su primer mensaje:

Citar
habrà alguna manera kizas de trabajar mas directo con la computadora a mas bajo nivel, sin tener que pasar por sus .DLLs (APIs)

tal como lo pide, aun ejecutando tu los bytes que quito el jmp o los saques del fichero en disco, vas a morir a una dll del sistema. el no aclaro si modo usuario o modo kernel, y API son las 2 asi que de una forma o de otra va a tener que terminar trabajando con la api del sistema.

claro esta que podemos complicarlo mas, incluso puede programar su propio SO para poder ejecutar codigo como quiera. se puede complicar lo que uno quiera, pero a la pregunta tal cual es que SI termina pasando por la api del sistema.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 13 Noviembre 2010, 13:27 PM
Cita de: bizco en 13 Noviembre 2010, 13:01 PMlogico, creo que no me entendiste logicamente sabiendo que funcion tenemos es sencillo buscar si dentro de la redireccion se encuentra el codigo original. pero el quiere sin usar ninguna ninguna funcion de windows.

Y no, la verdad es que dijiste esto:

"si es un hook simple (jmp) vas a la direccion donde apunta y tendras por ahi cerca las instrucciones reales, pero para un software en especifico hay que estudiar el caso primero."

Y no es asi, donde apunta el jump hay una funcion y no el codigo original. ¿Se entiende la diferencia? No tiene ninguna necesidad de estar ahi cerca, si el hook esta en una FUNCION de una DLL entonces el codigo original no estara ahi en la sección .code de la DLL por logica pura.

Cita de: bizco en 13 Noviembre 2010, 13:01 PMtal como lo pide, aun ejecutando tu los bytes que quito el jmp o los saques del fichero en disco, vas a morir a una dll del sistema. el no aclaro si modo usuario o modo kernel, y API son las 2 asi que de una forma o de otra va a tener que terminar trabajando con la api del sistema.

"sin tener que pasar por sus .DLLs"

Tal y como lo pide ya di una forma de hacerlo sin pasar por ninguna DLL, despues si vos queres llamar API a cualquier funcion de Windows (hay muchos servicios NO EXPORTADOS, sinceramente es complicado llamar API a eso) podes decir eso, si llamas API a lo que es la API no necesariamente se cumple, como ya explique antes la transicion al Kernel la podes hacer vos directamente, si haces int 2Eh/syscall/systenter no pasas por ninguna DLL jamas.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 13 Noviembre 2010, 14:31 PM
CitarY no es asi, donde apunta el jump hay una funcion y no el codigo original. ¿Se entiende la diferencia? No tiene ninguna necesidad de estar ahi cerca, si el hook esta en una FUNCION de una DLL entonces el codigo original no estara ahi en la sección .code de la DLL por logica pura.

dije "por ahi estara", queriendo decir que puede estar el codigo dentro de la funcion (no es la primera vez que lo he visto) o un puntero a los bytes reales, como dije depende del soft hay que estudiarlo y es practicamente sencillo obtener la direccion para no tener que pasar por el hook. pero vamos eso es otro tema.


Citar"sin tener que pasar por sus .DLLs"

Logicamente y pasar por un sitio no es entrar por la puerta, puedes pasar por delante de mi casa sin entrar o puedes entrar por la ventana, de todos modos has pasado por ahi. o lo que es lo mismo, puedo comer huevo frito, en tortilla, con patatas o como a cada uno mas le guste, pero termina comiendo huevo.

Citar
Tal y como lo pide ya di una forma de hacerlo sin pasar por ninguna DLL, despues si vos queres llamar API a cualquier funcion de Windows (hay muchos servicios NO EXPORTADOS, sinceramente es complicado llamar API a eso) podes decir eso, si llamas API a lo que es la API no necesariamente se cumple, como ya explique antes la transicion al Kernel la podes hacer vos directamente, si haces int 2Eh/syscall/systenter no pasas por ninguna DLL jamas.

Vale entonces un pequeño programa NO LINKADO a una sola dll, tampoco vale obtener con getprocaddress. que cree un fichero, escriba algo muestre un MessageBox y salga. cuando vea eso sin usar una sola dll entonces admitire que si puede usarla de forma opcional o con mas trabajo pasar olimpicamente del sistema.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 13 Noviembre 2010, 15:55 PM
Cita de: bizco en 13 Noviembre 2010, 14:31 PMdije "por ahi estara", queriendo decir que puede estar el codigo dentro de la funcion (no es la primera vez que lo he visto) o un puntero a los bytes reales, como dije depende del soft hay que estudiarlo y es practicamente sencillo obtener la direccion para no tener que pasar por el hook. pero vamos eso es otro tema.

Alguna porqueria puede ponerlo hardcodeado en la funcion, es cierto, el malware es asi, no necesita estar bien hecho mientras que un software en serio tiene que guardar las instrucciones validas.


Cita de: bizco en 13 Noviembre 2010, 14:31 PMLogicamente y pasar por un sitio no es entrar por la puerta, puedes pasar por delante de mi casa sin entrar o puedes entrar por la ventana, de todos modos has pasado por ahi. o lo que es lo mismo, puedo comer huevo frito, en tortilla, con patatas o como a cada uno mas le guste, pero termina comiendo huevo.

No veo que la analogia sea valida, mas bien seria que no necesito pasar por dentro de tu  casa para ir al jardin de atras. Eso es mucho mas cercano al caso este:


Aplicacion
DLLs
------------
Kernel

Y no este otro:
Aplicacion
DLLs [Kernel]

Cita de: bizco en 13 Noviembre 2010, 14:31 PMVale entonces un pequeño programa NO LINKADO a una sola dll, tampoco vale obtener con getprocaddress. que cree un fichero, escriba algo muestre un MessageBox y salga. cuando vea eso sin usar una sola dll entonces admitire que si puede usarla de forma opcional o con mas trabajo pasar olimpicamente del sistema.

Entiendo que no comprendiste entonces la teoria, hay que comprender la arquitectura de Windows para poder ver la logica detras de esto.

Lo del enlace es irrelevante (si tengo 10 llamadas normales que no me importa sean interceptadas y una que efectivamente salta la proteccion da igual el resto del codigo) aunque ya existe codigo para encontrar las funciones de la API usando el PEB, con el mismo podes encontrar las funcionens de la NTDLL que quieras, leer los indices y ejecutar tu codigo.



Igual aca tenes un ejemplo 100% hardcodeado (la mayoria de las constantes las tome de la primera llamada a NtOpenFile que hizo el notepad por casualidad al cargar una DLL) que demuestra como hacerlo (y no, el ejecutable no tiene ninguna libreria enlazada):

Código (asm) [Seleccionar]

.386
.model flat, stdcall
option casemap: none

OBJECT_ATTRIBUTES STRUCT
Len DWORD ?
RootDirectory DWORD ?
ObjectName DWORD ?
Attributes DWORD ?
SecurityDescriptor DWORD ?
SecurityQualityOfService DWORD ?
OBJECT_ATTRIBUTES ENDS

UNICODE_STRING STRUCT
Len WORD ?
MaxLen WORD ?
Buffer DWORD ?
UNICODE_STRING ENDS

IO_STATUS_BLOCK STRUCT
Status DWORD ?
Information DWORD ?
IO_STATUS_BLOCK ENDS
 
.data
hFile dd 0
ob OBJECT_ATTRIBUTES <>
;\??\i:\f.txt
;12*2=24
fileBuff db '\',0,'?',0,'?',0,'\',0,'i',0,':',0,'\',0,'f',0,'.',0,'t',0,'x',0,'t',0,0,0
fName UNICODE_STRING <>
isb IO_STATUS_BLOCK <>

.code
main:
mov fName.Len, 24
mov fName.MaxLen, 24
mov fName.Buffer, offset fileBuff

mov ob.Len, 018h
mov ob.RootDirectory, 0
mov ob.ObjectName, offset fName
mov ob.Attributes, 00000040h
mov ob.SecurityDescriptor, 0
mov ob.SecurityQualityOfService, 0

push 00000060h
push 00000005h
push offset isb
push offset ob
push 00100020h
push offset hFile
call myZwOpenFile
;en hFile tenes el HANDLE al archivo
int 3
mov eax, hFile
;aca sin cerrar podes ver el archivo con el Process Explorer abierto
ret

myZwOpenFile:
mov     eax,74h ;hardcodeado pero se puede leer del archivo al ser una funcion exportada
call    SystemCallStub
ret     2Ch

SystemCallStub:
mov     edx,esp
;sysenter
dw 340fh
ret

end main


Obviamente lo anterior es un HACK pero como poder se puede hacer. ¿Ademas por simple logica la API de Windows lo hace, verdad? Entonces uno puede hacerlo tambien a mano ...
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 13 Noviembre 2010, 19:11 PM
logicamente que la api de windows lo hace, pero no es el caso y terminas en el kernel pasandole el servicio X y el kernel es API del mismo sistema, por lo tanto lo que quiero decir es que terminara usandola de algun modo. ese ejemplo es "valido" pq lo hace el propio sistema asi y no es dependiente de ninguna otra funcion, falta la escritura al fichero y el MessageBox sin tocar una sola dll del sistema.

es lo mismo que isdebuggerpresent que existe la funcion, pero simplemente retorna un campo del peb y listo, cosa que puedes hacer perfectamente desde tu propia aplicacion sin llamar a dll alguna. vale entonces cedo pero un poquito, se puede hacer con alguna funcion en concreto, pero no puedes hacer una aplicacion sin pasar por la api del sistema.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 13 Noviembre 2010, 20:11 PM
Cita de: bizco en 13 Noviembre 2010, 19:11 PMlogicamente que la api de windows lo hace, pero no es el caso y terminas en el kernel pasandole el servicio X y el kernel es API del mismo sistema, por lo tanto lo que quiero decir es que terminara usandola de algun modo. ese ejemplo es "valido" pq lo hace el propio sistema asi y no es dependiente de ninguna otra funcion, falta la escritura al fichero y el MessageBox sin tocar una sola dll del sistema.

Si logicamente lo hace decir que no se puede hacer es pura necedad. Para empezar el Kernel no es una DLL (condicion que citaste hace poco) y lo de que sea API es discutible, para empezar esos servicios en su AMPLISIMA mayoria no son accesibles por los modulos de modo Kernel al no estar exportados, genial API que no se puede usar.

El ejemplo es valido por demostrar explicitamente como se puede llamar a un servicio del sistema sin pasar por ninguna DLL. Lo que varias veces ya dijiste que era imposible, bueno no lo es, es posible y esta hecho.

En realidad no falta nada, si vos tenes ganas de perder el tiempo agregandole mas funcionalidad adelante, el punto esta demostrado AMPLIAMENTE y se puede hacer.

Cita de: bizco en 13 Noviembre 2010, 19:11 PMes lo mismo que isdebuggerpresent que existe la funcion, pero simplemente retorna un campo del peb y listo, cosa que puedes hacer perfectamente desde tu propia aplicacion sin llamar a dll alguna. vale entonces cedo pero un poquito, se puede hacer con alguna funcion en concreto, pero no puedes hacer una aplicacion sin pasar por la api del sistema.

No es lo mismo y parece que continuas sin comprender nada de lo que explique y demostre. ¿Que tiene que ver acceder a una estructura en el espacio de memoria del propio proceso con hacer la transicion a modo Kernel?

Ahi arriba esta demostrado que SI se puede hacer, ademas no tiene mucho sentido hacer una aplicacion entera asi, pero la misma logica puede usarse para saltar los hooks que quieras (entre los cuales dudo mucho exista uno en MessageBox*).
Título: Re: Una duda sobre ASM y las APIS
Publicado por: bizco en 13 Noviembre 2010, 22:42 PM
yo crro que no entiendes tu, pero bueno. el cito explicitamente MessagesBox, crear ficheros,carpetas haciendo alusion a un posible metodo de programar paralelamente a lo que el sistema permite. igual que lo de la dll no es igual pero es un ejemplo valido, ya que es algo que se permite hacer por la forma en que esta diseñado, pero te digo falta el messagebox por ejemplo o una simple ventana. hasta el momento solo he visto como es posible usar una funcion, solo pedi 3 cosas y faltan 2.

Que es como digo en la informatica se puede rizar el rizo tanto como quieras, del mismo modo que puedo hacerlo yo para no admitir que sea posible programar en un sistema sin usar las funciones que este nos ofrece como norma general. no se, que puedas ejecutar una funcion y (por como esta esta construida) afirmar a una pregunta general que si, como te digo cuando vea el programa completo con las 3 funciones que pedi, entonces perfecto se puede programar.

Citar
Habrà alguna manera de ejecutar en ASM esas instrucciones que usamos normalmente en lenguaje como C++, ejem: borrar archivos, messagebox,crear carpeta.. etc pero sin tener que recurrir a las APIS

a la pregunta tal cual esta, la respuesta es NO. y repito mi invitacion a terminar el programa con la escritura y el messagebox para englobar asi un poco las funciones especificas que se nombran en la pregunta, dejando a un lado el etc.

CitarPara empezar el Kernel no es una DLL (condicion que citaste hace poco)

Nunca he dicho que le kernel es una dll, creo que te confundes, hasta eso llego.

Citarpara empezar esos servicios en su AMPLISIMA mayoria no son accesibles por los modulos de modo Kernel al no estar exportados, genial API que no se puede usar.

¿cuales servicios?, perdona pero estas confundiendo cosas. aun sin saber de cuales son los servicios que estas nombrando, ¿que api no se puede usar?.

Citarel punto esta demostrado AMPLIAMENTE y se puede hacer.

Lo que esta AMPLIAMENTE demostrado es que te has ceñido al unico punto que te interesa ignorando el resto de la pregunta para demostrar que si se puede. por ejemplo el como se pasa de modo usuario al kernel estan ahi las funciones, solo que como se puede hacer con codigo ensamblador tal cual (por como esta construida) escribes las mismas instrucciones y logicamente que hace lo mismo, seria estupido negar lo contrario.


aparte de todo eso, cito tal cual mi ofrecimiento:

Citar
si ¿y la ntdll no va a morir a la api del sistema?, igual estoy confundido pero me gustaria ver un MessageBox por ejemplo sin tocar en ningun caso una una dll del sistema, o borrar archivos sin hacer uso alguno de ninguna funcion modo usuario/kernel y que sea estable y funcional en todos los sistemas windows  logicamente.

ahora bien, el numero de servicio para  no estar hardcodeado se podria leer en el propio archivo, pero entonces pregunto ¿que fue primer el huevo o l la gallina? pq la condicion es no usar una sola dll, de momento no veo que se cumpla ninguna condicion de la peticion, simplemente una parte de esta (siendo flexibe por no alargar mas el tema), pero seria mas interesante ver la implementacion sin hardcodear el numero de servicio.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 14 Noviembre 2010, 00:17 AM
Exacto, yo no entiendo, el unico problema es que estoy discutiendo con alguien que NO comprende la arquitectura de Windows y entonces se va por las ramas sin terminar de comprender que es una API, que es un servicio, que es un modulo de modo Kernel o uno de modo Usuario, mejor te lees los primeros capitulos de Windows Internals y despues intentas comprender de lo que se esta hablando en este hilo.

Ahora bien podes citar lo que se te de la regalada gana, la pregunta era esta:
"Habrà alguna manera de ejecutar en ASM esas instrucciones que usamos normalmente en lenguaje como C++"

Y la respuesta es SI, vos no sabias como hacerlo por lo visto, yo ya explique una forma de hacerlo sin pasar por las DLLs o la API de Windows (tambien podes leer por Internet para saber a que se refiere exactamente la gente cuando la mencionan, aunque ya te haya pegado la definicion antes).
Ahi tiene hasta un codigo de ejemplo el usuario que pregunto, si le interesa el podra completarlo con tus deseos de mas funciones o con los suyos, con eso doy por terminada la discusion.

Cita de: bizco en 13 Noviembre 2010, 22:42 PMLo que esta AMPLIAMENTE demostrado es que te has ceñido al unico punto que te interesa ignorando el resto de la pregunta para demostrar que si se puede. por ejemplo el como se pasa de modo usuario al kernel estan ahi las funciones, solo que como se puede hacer con codigo ensamblador tal cual (por como esta construida) escribes las mismas instrucciones y logicamente que hace lo mismo, seria estupido negar lo contrario.

Sinceramente estoy de acuerdo, es mas, incluso acordaria que es muy estupido negarlo.
Título: Re: Una duda sobre ASM y las APIS
Publicado por: Eternal Idol en 15 Noviembre 2010, 13:30 PM
Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap :none   ; case sensitive
     
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc

CLSMENUNAME STRUCT
   ANSIPtr DWORD ?
   WIDEPtr DWORD ?
   UStrPtr DWORD ?
CLSMENUNAME ENDS

OBJECT_ATTRIBUTES STRUCT
Len DWORD ?
RootDirectory DWORD ?
ObjectName DWORD ?
Attributes DWORD ?
SecurityDescriptor DWORD ?
SecurityQualityOfService DWORD ?
OBJECT_ATTRIBUTES ENDS

UNICODE_STRING STRUCT
Len WORD ?
MaxLen WORD ?
Buffer DWORD ?
UNICODE_STRING ENDS

LARGE_UNICODE_STRING STRUCT
   Len DWORD ?
   MaxLenBAnsi DWORD ? ;  ULONG MaximumLength:31  ULONG bAnsi:1
   Buffer DWORD ?
LARGE_UNICODE_STRING ENDS


IO_STATUS_BLOCK STRUCT
Status DWORD ?
Information DWORD ?
IO_STATUS_BLOCK ENDS

NTUSERGETMESSAGEINFO STRUCT
 Msg MSG  <>
 LParamSize DWORD ?
NTUSERGETMESSAGEINFO ENDS

.data
hFile dd 0
ob OBJECT_ATTRIBUTES <>
;\??\i:\f.txt
;13*2=26
fileBuff db '\',0,'?',0,'?',0,'\',0,'i',0,':',0,'\',0,'f',0,'.',0,'t',0,'x',0,'t',0,0,0
fName UNICODE_STRING <>
cNameWU UNICODE_STRING <>
mNameWU UNICODE_STRING <>

classLUS LARGE_UNICODE_STRING <>
titleLUS LARGE_UNICODE_STRING <>

isb IO_STATUS_BLOCK <>

buffer db "¿Ves como escribe? No es tan dificil de aceptar", 0

wcx WNDCLASSEX <>

mName db "MainMenu", 0
cName db "MainWClass", 0

tName db 'S',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,0
hWnd dd 0

msg MSG <>
ntMsg NTUSERGETMESSAGEINFO <>

mNameW db 'M',0,'a',0,'i',0,'n',0,'M',0,'e',0,'n',0,'u',0,0,0
cNameW db 'M',0,'a',0,'i',0,'n',0,'W',0,'C',0,'l',0,'a',0,'s',0,'s',0,0,0

cStruct CLSMENUNAME <>

ps PAINTSTRUCT <>

pedantic db 0

.code
main:

mov wcx.cbSize, SIZEOF(WNDCLASSEX)
mov wcx.style, CS_HREDRAW or CS_VREDRAW
mov wcx.lpfnWndProc, MainWndProc
mov wcx.cbClsExtra, 0
mov wcx.cbWndExtra, 0
mov wcx.hInstance, 00400000h

mov wcx.hIcon, 0
mov wcx.hCursor, 0
mov wcx.hIconSm, 0

push GRAY_BRUSH
call myZwGdiGetStockObject

mov wcx.hbrBackground, eax
mov wcx.lpszMenuName, offset mNameW
mov wcx.lpszClassName, offset cNameW


mov cNameWU.Len, 014h
mov cNameWU.MaxLen, 016h
mov cNameWU.Buffer, offset cNameW

mov mNameWU.Len, 010h
mov mNameWU.MaxLen, 012h
mov mNameWU.Buffer, offset mNameW

mov cStruct.ANSIPtr, offset mName
mov cStruct.WIDEPtr, offset mNameW
mov cStruct.UStrPtr, offset mNameWU

mov classLUS.Len, 014h
mov classLUS.MaxLenBAnsi, 016h
mov classLUS.Buffer, offset cNameW

mov titleLUS.Len, 4
mov titleLUS.MaxLenBAnsi, 6
mov titleLUS.Buffer, offset tName

push 0
push 0180h
push 0
push offset cStruct
push offset cNameWU
push offset cNameWU
push offset wcx
call myZwUserRegisterClassExWOW

push 0
push 040000400h
push 0
push 00400000h
push 0
push 0
push 200; CW_USEDEFAULT
push 200; CW_USEDEFAULT
push 150
push 150
push WS_OVERLAPPEDWINDOW
push offset titleLUS
push offset classLUS
push offset classLUS
push 0
call myZwUserCreateWindowEx
mov hWnd, eax

push SW_SHOW
push hWnd
call myZwUserShowWindow

;1ra funcion: GUI visible!

bucle:
push 0
push 0
push 0
push offset ntMsg
call myZwUserGetMessage
.if eax != 0 && eax != -1

.if !pedantic
   push offset ntMsg.Msg
   call DispatchMessageW
.else
 .if  ntMsg.Msg.message == WM_SYSCOMMAND
  push  33h
  push 0
  call myZwUserCallOneParam
   jmp basta
 .endif
.endif

jmp bucle
.endif

basta:
;Boton derecho en el taskbar, cerrar, y llega aca

mov fName.Len, 24
mov fName.MaxLen, 24
mov fName.Buffer, offset fileBuff

mov ob.Len, 018h
mov ob.RootDirectory, 0
mov ob.ObjectName, offset fName
mov ob.Attributes, 00000040h
mov ob.SecurityDescriptor, 0
mov ob.SecurityQualityOfService, 0

push 00000060h  
push 0
push offset isb
push offset ob
push 010100080h
push offset hFile
call myZwOpenFile
;2da funcion apertura de archivo en hFile tenes el HANDLE al archivo

push 0
push 0
push 47
push offset buffer
push offset isb
push 0
push 0
push 0
mov eax, hFile
push eax
call myZwWriteFile
;3ra funcion, escritura en archivo


ret

myZwOpenFile:
mov     eax,74h
call    SystemCallStub
ret     18h

myZwWriteFile:
mov     eax,112h
call    SystemCallStub
ret     24h

myZwUserCreateWindowEx:
mov     eax,1157h
call    SystemCallStub
ret     3Ch

myZwUserRegisterClassExWOW:
mov     eax,11E8h
call    SystemCallStub
ret     1Ch

myZwGdiGetStockObject:
mov     eax,10C8h
call    SystemCallStub
ret     4

myZwUserShowWindow:
mov     eax,122Bh
call    SystemCallStub
ret     8

myZwUserGetMessage:
mov     eax,11A5h
call    SystemCallStub
ret     10h

myZwUserCallOneParam:
mov     eax,1143h
call    SystemCallStub
ret     8

myZwUserMessageCall:
mov     eax,11CCh
call    SystemCallStub
ret     1Ch


myZwUserBeginPaint:
mov     eax,1134h
call    SystemCallStub
ret     8

myZwUserEndPaint:
mov     eax,1172h
call    SystemCallStub
ret     8

SystemCallStub:
mov     edx,esp
;sysenter
dw 340fh
ret

MainWndProc:

.if dword ptr [esp+8] == WM_NCCREATE
   push 0
   push 029Eh
   push 0
   push [esp+16+12]
   push [esp+12+16]
   push [esp+8+20]
   push [esp+4+24]
   call myZwUserMessageCall
   xor eax, eax
   inc eax
   ret 10h
.endif

.if dword ptr [esp+8] == WM_NCPAINT
   push 0
   push 029Eh
   push 0
   push [esp+16+12]
   push [esp+12+16]
   push [esp+8+20]
   push [esp+4+24]
   call myZwUserMessageCall
   xor eax, eax
   ret 10h
.endif

.if dword ptr [esp+8] == WM_DESTROY
  push  33h
  push 0
  call myZwUserCallOneParam
  ;   call PostQuitMessage
  xor eax, eax
  ret 010h
.endif

.if dword ptr [esp+8] == WM_PAINT
   push offset ps
   push dword ptr [esp+8]
   call myZwUserBeginPaint
   .if !pedantic
       invoke SetBkMode, ps.hdc, TRANSPARENT
       invoke SetTextColor, ps.hdc, 0
       invoke TextOutA, ps.hdc, 5,25, offset buffer, 19
   .endif
   push offset ps
   push dword ptr [esp+8]
   call myZwUserEndPaint
   xor eax, eax
   ret 010h
.endif

.if !pedantic
   jmp DefWindowProcW
.endif

push 0
push 029Eh
push 0
push [esp+16+12]
push [esp+12+16]
push [esp+8+20]
push [esp+4+24]
call myZwUserMessageCall
xor eax, eax
ret 10h

end main


pedantic=0:
(http://img707.imageshack.us/img707/3531/shhsa.png)

pedantic=1:
(http://img109.imageshack.us/img109/8573/pedante.png)


theghost_te: como habras visto en algun caso como el GUI puede ser mas complejo que trabajar con archivos (obviar la NTDLL.dll es MUY simple) pero siempre que haya transicion al Kernel con paciencia y tiempo podes saltarte las DLLs desde tu programa.