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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Una duda sobre ASM y las APIS
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Una duda sobre ASM y las APIS  (Leído 11,597 veces)
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Una duda sobre ASM y las APIS
« Respuesta #10 en: 13 Noviembre 2010, 13:27 pm »

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.

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.

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.

"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.


« Última modificación: 13 Noviembre 2010, 13:36 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Una duda sobre ASM y las APIS
« Respuesta #11 en: 13 Noviembre 2010, 14:31 pm »

Citar
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.

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.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Una duda sobre ASM y las APIS
« Respuesta #12 en: 13 Noviembre 2010, 15:55 pm »

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.

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.


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.

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]

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.

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
  1. .386
  2. .model flat, stdcall
  3. option casemap: none
  4.  
  5. OBJECT_ATTRIBUTES STRUCT
  6. Len DWORD ?
  7. RootDirectory DWORD ?
  8. ObjectName DWORD ?
  9. Attributes DWORD ?
  10. SecurityDescriptor DWORD ?
  11. SecurityQualityOfService DWORD ?
  12. OBJECT_ATTRIBUTES ENDS
  13.  
  14. UNICODE_STRING STRUCT
  15. Len WORD ?
  16. MaxLen WORD ?
  17. Buffer DWORD ?
  18. UNICODE_STRING ENDS
  19.  
  20. IO_STATUS_BLOCK STRUCT
  21. Status DWORD ?
  22. Information DWORD ?
  23. IO_STATUS_BLOCK ENDS
  24.  
  25. .data
  26. hFile dd 0
  27. ob OBJECT_ATTRIBUTES <>
  28. ;\??\i:\f.txt
  29. ;12*2=24
  30. fileBuff db '\',0,'?',0,'?',0,'\',0,'i',0,':',0,'\',0,'f',0,'.',0,'t',0,'x',0,'t',0,0,0
  31. fName UNICODE_STRING <>
  32. isb IO_STATUS_BLOCK <>
  33.  
  34. .code
  35. main:
  36. mov fName.Len, 24
  37. mov fName.MaxLen, 24
  38. mov fName.Buffer, offset fileBuff
  39.  
  40. mov ob.Len, 018h
  41. mov ob.RootDirectory, 0
  42. mov ob.ObjectName, offset fName
  43. mov ob.Attributes, 00000040h
  44. mov ob.SecurityDescriptor, 0
  45. mov ob.SecurityQualityOfService, 0
  46.  
  47. push 00000060h
  48. push 00000005h
  49. push offset isb
  50. push offset ob
  51. push 00100020h
  52. push offset hFile
  53. call myZwOpenFile
  54. ;en hFile tenes el HANDLE al archivo
  55. int 3
  56. mov eax, hFile
  57. ;aca sin cerrar podes ver el archivo con el Process Explorer abierto
  58. ret
  59.  
  60. myZwOpenFile:
  61. mov     eax,74h ;hardcodeado pero se puede leer del archivo al ser una funcion exportada
  62. call    SystemCallStub
  63. ret     2Ch
  64.  
  65. SystemCallStub:
  66. mov     edx,esp
  67. ;sysenter
  68. dw 340fh
  69. ret
  70.  
  71. 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 ...
« Última modificación: 13 Noviembre 2010, 16:01 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Una duda sobre ASM y las APIS
« Respuesta #13 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.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Una duda sobre ASM y las APIS
« Respuesta #14 en: 13 Noviembre 2010, 20: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.

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.

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.

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*).
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Una duda sobre ASM y las APIS
« Respuesta #15 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.

Citar
Para 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.

Citar
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.

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

Citar
el 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.
« Última modificación: 13 Noviembre 2010, 23:45 pm por bizco » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Una duda sobre ASM y las APIS
« Respuesta #16 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.

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.

Sinceramente estoy de acuerdo, es mas, incluso acordaria que es muy estupido negarlo.
« Última modificación: 14 Noviembre 2010, 00:20 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Una duda sobre ASM y las APIS
« Respuesta #17 en: 15 Noviembre 2010, 13:30 pm »

Código
  1. .386
  2. .model flat, stdcall
  3. option casemap :none   ; case sensitive
  4.  
  5. include \masm32\include\windows.inc
  6. include \masm32\include\user32.inc
  7. include \masm32\include\kernel32.inc
  8. include \masm32\include\gdi32.inc
  9.  
  10. CLSMENUNAME STRUCT
  11.    ANSIPtr DWORD ?
  12.    WIDEPtr DWORD ?
  13.    UStrPtr DWORD ?
  14. CLSMENUNAME ENDS
  15.  
  16. OBJECT_ATTRIBUTES STRUCT
  17. Len DWORD ?
  18. RootDirectory DWORD ?
  19. ObjectName DWORD ?
  20. Attributes DWORD ?
  21. SecurityDescriptor DWORD ?
  22. SecurityQualityOfService DWORD ?
  23. OBJECT_ATTRIBUTES ENDS
  24.  
  25. UNICODE_STRING STRUCT
  26. Len WORD ?
  27. MaxLen WORD ?
  28. Buffer DWORD ?
  29. UNICODE_STRING ENDS
  30.  
  31. LARGE_UNICODE_STRING STRUCT
  32.    Len DWORD ?
  33.    MaxLenBAnsi DWORD ? ;  ULONG MaximumLength:31  ULONG bAnsi:1
  34.    Buffer DWORD ?
  35. LARGE_UNICODE_STRING ENDS
  36.  
  37.  
  38. IO_STATUS_BLOCK STRUCT
  39. Status DWORD ?
  40. Information DWORD ?
  41. IO_STATUS_BLOCK ENDS
  42.  
  43. NTUSERGETMESSAGEINFO STRUCT
  44.  Msg MSG  <>
  45.  LParamSize DWORD ?
  46. NTUSERGETMESSAGEINFO ENDS
  47.  
  48. .data
  49. hFile dd 0
  50. ob OBJECT_ATTRIBUTES <>
  51. ;\??\i:\f.txt
  52. ;13*2=26
  53. fileBuff db '\',0,'?',0,'?',0,'\',0,'i',0,':',0,'\',0,'f',0,'.',0,'t',0,'x',0,'t',0,0,0
  54. fName UNICODE_STRING <>
  55. cNameWU UNICODE_STRING <>
  56. mNameWU UNICODE_STRING <>
  57.  
  58. classLUS LARGE_UNICODE_STRING <>
  59. titleLUS LARGE_UNICODE_STRING <>
  60.  
  61. isb IO_STATUS_BLOCK <>
  62.  
  63. buffer db "¿Ves como escribe? No es tan dificil de aceptar", 0
  64.  
  65. wcx WNDCLASSEX <>
  66.  
  67. mName db "MainMenu", 0
  68. cName db "MainWClass", 0
  69.  
  70. tName db 'S',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,'H',0,0
  71. hWnd dd 0
  72.  
  73. msg MSG <>
  74. ntMsg NTUSERGETMESSAGEINFO <>
  75.  
  76. mNameW db 'M',0,'a',0,'i',0,'n',0,'M',0,'e',0,'n',0,'u',0,0,0
  77. cNameW db 'M',0,'a',0,'i',0,'n',0,'W',0,'C',0,'l',0,'a',0,'s',0,'s',0,0,0
  78.  
  79. cStruct CLSMENUNAME <>
  80.  
  81. ps PAINTSTRUCT <>
  82.  
  83. pedantic db 0
  84.  
  85. .code
  86. main:
  87.  
  88. mov wcx.cbSize, SIZEOF(WNDCLASSEX)
  89. mov wcx.style, CS_HREDRAW or CS_VREDRAW
  90. mov wcx.lpfnWndProc, MainWndProc
  91. mov wcx.cbClsExtra, 0
  92. mov wcx.cbWndExtra, 0
  93. mov wcx.hInstance, 00400000h
  94.  
  95. mov wcx.hIcon, 0
  96. mov wcx.hCursor, 0
  97. mov wcx.hIconSm, 0
  98.  
  99. push GRAY_BRUSH
  100. call myZwGdiGetStockObject
  101.  
  102. mov wcx.hbrBackground, eax
  103. mov wcx.lpszMenuName, offset mNameW
  104. mov wcx.lpszClassName, offset cNameW
  105.  
  106.  
  107. mov cNameWU.Len, 014h
  108. mov cNameWU.MaxLen, 016h
  109. mov cNameWU.Buffer, offset cNameW
  110.  
  111. mov mNameWU.Len, 010h
  112. mov mNameWU.MaxLen, 012h
  113. mov mNameWU.Buffer, offset mNameW
  114.  
  115. mov cStruct.ANSIPtr, offset mName
  116. mov cStruct.WIDEPtr, offset mNameW
  117. mov cStruct.UStrPtr, offset mNameWU
  118.  
  119. mov classLUS.Len, 014h
  120. mov classLUS.MaxLenBAnsi, 016h
  121. mov classLUS.Buffer, offset cNameW
  122.  
  123. mov titleLUS.Len, 4
  124. mov titleLUS.MaxLenBAnsi, 6
  125. mov titleLUS.Buffer, offset tName
  126.  
  127. push 0
  128. push 0180h
  129. push 0
  130. push offset cStruct
  131. push offset cNameWU
  132. push offset cNameWU
  133. push offset wcx
  134. call myZwUserRegisterClassExWOW
  135.  
  136. push 0
  137. push 040000400h
  138. push 0
  139. push 00400000h
  140. push 0
  141. push 0
  142. push 200; CW_USEDEFAULT
  143. push 200; CW_USEDEFAULT
  144. push 150
  145. push 150
  146. push WS_OVERLAPPEDWINDOW
  147. push offset titleLUS
  148. push offset classLUS
  149. push offset classLUS
  150. push 0
  151. call myZwUserCreateWindowEx
  152. mov hWnd, eax
  153.  
  154. push SW_SHOW
  155. push hWnd
  156. call myZwUserShowWindow
  157.  
  158. ;1ra funcion: GUI visible!
  159.  
  160. bucle:
  161. push 0
  162. push 0
  163. push 0
  164. push offset ntMsg
  165. call myZwUserGetMessage
  166. .if eax != 0 && eax != -1
  167.  
  168. .if !pedantic
  169.    push offset ntMsg.Msg
  170.    call DispatchMessageW
  171. .else
  172.  .if  ntMsg.Msg.message == WM_SYSCOMMAND
  173.   push  33h
  174.   push 0
  175.   call myZwUserCallOneParam
  176.    jmp basta
  177.  .endif
  178. .endif
  179.  
  180. jmp bucle
  181. .endif
  182.  
  183. basta:
  184. ;Boton derecho en el taskbar, cerrar, y llega aca
  185.  
  186. mov fName.Len, 24
  187. mov fName.MaxLen, 24
  188. mov fName.Buffer, offset fileBuff
  189.  
  190. mov ob.Len, 018h
  191. mov ob.RootDirectory, 0
  192. mov ob.ObjectName, offset fName
  193. mov ob.Attributes, 00000040h
  194. mov ob.SecurityDescriptor, 0
  195. mov ob.SecurityQualityOfService, 0
  196.  
  197. push 00000060h  
  198. push 0
  199. push offset isb
  200. push offset ob
  201. push 010100080h
  202. push offset hFile
  203. call myZwOpenFile
  204. ;2da funcion apertura de archivo en hFile tenes el HANDLE al archivo
  205.  
  206. push 0
  207. push 0
  208. push 47
  209. push offset buffer
  210. push offset isb
  211. push 0
  212. push 0
  213. push 0
  214. mov eax, hFile
  215. push eax
  216. call myZwWriteFile
  217. ;3ra funcion, escritura en archivo
  218.  
  219.  
  220. ret
  221.  
  222. myZwOpenFile:
  223. mov     eax,74h
  224. call    SystemCallStub
  225. ret     18h
  226.  
  227. myZwWriteFile:
  228. mov     eax,112h
  229. call    SystemCallStub
  230. ret     24h
  231.  
  232. myZwUserCreateWindowEx:
  233. mov     eax,1157h
  234. call    SystemCallStub
  235. ret     3Ch
  236.  
  237. myZwUserRegisterClassExWOW:
  238. mov     eax,11E8h
  239. call    SystemCallStub
  240. ret     1Ch
  241.  
  242. myZwGdiGetStockObject:
  243. mov     eax,10C8h
  244. call    SystemCallStub
  245. ret     4
  246.  
  247. myZwUserShowWindow:
  248. mov     eax,122Bh
  249. call    SystemCallStub
  250. ret     8
  251.  
  252. myZwUserGetMessage:
  253. mov     eax,11A5h
  254. call    SystemCallStub
  255. ret     10h
  256.  
  257. myZwUserCallOneParam:
  258. mov     eax,1143h
  259. call    SystemCallStub
  260. ret     8
  261.  
  262. myZwUserMessageCall:
  263. mov     eax,11CCh
  264. call    SystemCallStub
  265. ret     1Ch
  266.  
  267.  
  268. myZwUserBeginPaint:
  269. mov     eax,1134h
  270. call    SystemCallStub
  271. ret     8
  272.  
  273. myZwUserEndPaint:
  274. mov     eax,1172h
  275. call    SystemCallStub
  276. ret     8
  277.  
  278. SystemCallStub:
  279. mov     edx,esp
  280. ;sysenter
  281. dw 340fh
  282. ret
  283.  
  284. MainWndProc:
  285.  
  286. .if dword ptr [esp+8] == WM_NCCREATE
  287.    push 0
  288.    push 029Eh
  289.    push 0
  290.    push [esp+16+12]
  291.    push [esp+12+16]
  292.    push [esp+8+20]
  293.    push [esp+4+24]
  294.    call myZwUserMessageCall
  295.    xor eax, eax
  296.    inc eax
  297.    ret 10h
  298. .endif
  299.  
  300. .if dword ptr [esp+8] == WM_NCPAINT
  301.    push 0
  302.    push 029Eh
  303.    push 0
  304.    push [esp+16+12]
  305.    push [esp+12+16]
  306.    push [esp+8+20]
  307.    push [esp+4+24]
  308.    call myZwUserMessageCall
  309.    xor eax, eax
  310.    ret 10h
  311. .endif
  312.  
  313. .if dword ptr [esp+8] == WM_DESTROY
  314.   push  33h
  315.   push 0
  316.   call myZwUserCallOneParam
  317.   ;   call PostQuitMessage
  318.   xor eax, eax
  319.   ret 010h
  320. .endif
  321.  
  322. .if dword ptr [esp+8] == WM_PAINT
  323.    push offset ps
  324.    push dword ptr [esp+8]
  325.    call myZwUserBeginPaint
  326.    .if !pedantic
  327.        invoke SetBkMode, ps.hdc, TRANSPARENT
  328.        invoke SetTextColor, ps.hdc, 0
  329.        invoke TextOutA, ps.hdc, 5,25, offset buffer, 19
  330.    .endif
  331.    push offset ps
  332.    push dword ptr [esp+8]
  333.    call myZwUserEndPaint
  334.    xor eax, eax
  335.    ret 010h
  336. .endif
  337.  
  338. .if !pedantic
  339.    jmp DefWindowProcW
  340. .endif
  341.  
  342. push 0
  343. push 029Eh
  344. push 0
  345. push [esp+16+12]
  346. push [esp+12+16]
  347. push [esp+8+20]
  348. push [esp+4+24]
  349. call myZwUserMessageCall
  350. xor eax, eax
  351. ret 10h
  352.  
  353. end main

pedantic=0:


pedantic=1:



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.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] sobre apis Findnextfile en vb6
Programación Visual Basic
AlxSpy 2 1,967 Último mensaje 31 Marzo 2011, 16:18 pm
por AlxSpy
duda sobre apis de windows de 32 bits
Programación General
AlxSpy 2 3,209 Último mensaje 27 Agosto 2011, 02:32 am
por AlxSpy
[Duda] Indetectar APis?
Análisis y Diseño de Malware
MrSatan 5 3,654 Último mensaje 18 Diciembre 2012, 22:21 pm
por Danyfirex
Duda con algunas APIS de VB
Ingeniería Inversa
.:UND3R:. 1 2,291 Último mensaje 25 Abril 2016, 07:47 am
por fary
Sobre un lenguaje, la ISA, el OS, las librerías y las APIs
Dudas Generales
arkady-svidrigailov 0 1,958 Último mensaje 28 Diciembre 2017, 01:13 am
por arkady-svidrigailov
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines