• Domingo 22 de Diciembre de 2024, 18:45

Autor Tema:  Problema Tonto En Ring 0  (Leído 3172 veces)

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Problema Tonto En Ring 0
« en: Lunes 10 de Diciembre de 2007, 22:13 »
0
Hola, a todos.

Verán tengo un problemilla que no acierto resolver. Les cuento:

Empece a programar en masm32 una simple a aplicacion de consola que saltase a ring 0 y escribiese el tipico hola mundo.

Termino el code y esta bien, es decir salta a ring 0 y me deja ejecutar instrucciones privilegiadas (el fallo no esta aqui porque tras ejecutarlas, vuelvo a ring 3).

Pero al intentar usar la api WriteConsole desde ring 0 para escribir el saludo, el programa falla.
Si lo corro desde windows, te da el tipico cartel de enviar errores. Si lo corro desde OllyDbg se me resetea el ordenador (lo que tiene tocar el kernel xD).

Se me ocurrio usar LoadLibrary y GetProcAddress pero no funciona.

Aqui es donde me pierdo porque al intentar usar cualquier api de ring 3 (MessageBoxA,GetStdHandle,etc) solo me da error el programa.

Mi pregunta es que debo hacer para usar esas apis desde ring 0 ? Tiene apis "equivalentes" ? Porque si es como en ring 3 deberia cargar la libreria, buscar su direccion y llamarla. Pero si no se como hacerlo.

Gracias por su ayuda.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #1 en: Lunes 10 de Diciembre de 2007, 22:21 »
0
¿Estas trabajando bajo 9x o NT? Desde el vamos en modo Kernel no existen esas funciones ... igual no se exactamente que estas haciendo.

De cualquier manera usa el WinDbg para depurarlo y analiza el dump generado si da un BSOD.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #2 en: Lunes 10 de Diciembre de 2007, 22:50 »
0
Perdón, se me olvidó nombrar la plataforma. Si Nt 5, Windows Xp SP2.

Eso si lo hago analizar los archivos de dump, pero que el fallo es poner un bp cuando estoy en ring 0.

Lo que no he probado es a correr el programa con WinDbg no se si dara dump tambien.

Solo intento escribir un texto en una consola, pero desde ring 0. Por eso que intente cargar la libreria y buscar la funcion. Pero me fue imposible.

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #3 en: Lunes 10 de Diciembre de 2007, 22:59 »
0
OK, NT 5.1 entonces.

¿Que fallo es poner un breakpoint? Depura en modo Kernel con el WinDbg entonces (necesitas otra maquina) o usa el SoftIce (obsoleto ya).

La logica es que no funcione nada de lo que estas haciendo, tendria que ver tu codigo y depurarlo como para decirte en que punto esta el problema exactamente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #4 en: Martes 11 de Diciembre de 2007, 01:19 »
0
Mi error esta en que no se llamar a las apis desde ring 0.

Por ejemplo, esto lo hago para usar la api WriteConsole en ring 3

Código: Text
  1.  
  2.  
  3. .386
  4. .model flat,stdcall
  5. .option casemap:none
  6.  
  7. include windows.inc
  8. include kernel32.inc
  9.  
  10. includelib kernel32.lib
  11.  
  12. .data
  13.  
  14. api db 'WriteConsole',0
  15.  
  16. dll db 'Kernel32.dll ',0
  17.  
  18. .code
  19.  
  20. start:
  21.  
  22.      
  23.       lea eax,dll
  24.       push eax
  25.       call GetModuleHandle &#59;porque esta dll ya esta cargada en memoria
  26.       test eax,eax  
  27.       jz fin
  28.       mov ecx,eax
  29.      
  30.      lea edx,api
  31.      push edx
  32.      push ecx
  33.      call GetProcAddress   &#59;me daria la direccion de la api
  34.      jz fin
  35.  
  36.     &#59; en eax nos queda la direccion de la funcion WriteConsole
  37.     &#59; y ya podria hacer un
  38.     &#59; push arg 5
  39.     &#59; push arg 4
  40.     &#59; push  arg...
  41.     &#59; call eax
  42.     &#59; y la api se ejecutaria
  43.  
  44. fin:
  45.      push 0
  46.      call ExitProcess
  47.  
  48. end start
  49.  
  50.  
  51.  
 
 
Lo que quiero hacer es eso mismo pero en ring 0. Usar cualquier api. A no ser que pr estar en un anillo diferente no me deje acceder a ellas. En ese caso estoy mas perdido que antes xD

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #5 en: Martes 11 de Diciembre de 2007, 08:11 »
0
Lo que querias hacer ya se habia entendido, sino queres mostrar lo que estas haciendo exactamente no hay problema pero no esperes que te ayude.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #6 en: Martes 11 de Diciembre de 2007, 20:49 »
0
Perdon, creia que no se me entendia.

Aqui pongo el code y digo donde me falla:
Gracias por la ayuda

Código: Text
  1.  
  2. .386p
  3. .model flat,stdcall
  4. option casemap :none
  5.  
  6. include windows.inc
  7. include user32.inc
  8. include kernel32.inc
  9. include advapi32.inc
  10.  
  11. includelib user32.lib
  12. includelib kernel32.lib
  13. includelib advapi32.lib
  14.  
  15. ;*********************************************************************************************
  16. ; Includes Extra
  17. ;*********************************************************************************************
  18.  
  19. include ntdll.inc                                                            
  20. includelib ntdll.lib
  21.  
  22. ;_____________________________________________________________________________________________
  23.  
  24. ;   Variables
  25. ;_____________________________________________________________________________________________
  26.  
  27.  
  28. .data
  29.  
  30. d1 db 'Hola desde Ring0',0
  31.  
  32. .data?
  33.  
  34.     align dword
  35.  
  36.         dacl            dd      ?
  37.         nexp            dd      ?
  38.  
  39.         hPhysicMem      dd      ?
  40.  
  41.         pSecuDescript   dd      ?
  42.  
  43.         pOldDacl        dd      ?
  44.         pNewDacl        dd      ?
  45.  
  46.         unicode_str     dw      ?               &#59;UNICODE_STRING{    USHORT          Length
  47.                         dw      ?               &#59;                   USHORT          MaxLength
  48.                         dd      ?               &#59;                   PWSTR           Buffer };
  49.  
  50.         obj_attrib      dd      ?               &#59;OBJECT_ATTRIBUTES{ ULONG           Length
  51.                         dd      ?               &#59;                   HANDLE          RootDirectory
  52.                         dd      ?               &#59;                   UNICODE_STRING* ObjectName
  53.                         dd      ?               &#59;                   ULONG           Attributes
  54.                         dd      ?               &#59;                   VOID*           SecurityDescriptor
  55.                         dd      ?               &#59;                   VOID*           SecurityQualityOfService };
  56.  
  57.         Exp_Access      dd      ?               &#59;EXPLICIT_ACCESS{   DWORD           grfAccessPermissions
  58.                         dd      ?               &#59;                   ACCESS_MODE     grfAccessMode
  59.                         dd      ?               &#59;                   DWORD           grfInheritance
  60.                                                 &#59;                   TRUSTEE         Trustee };
  61.  
  62.                         dd      ?               &#59;TRUSTEE{           TRUSTEE*        pMultipleTrustee
  63.                         dd      ?               &#59;                   MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation
  64.                         dd      ?               &#59;                   TRUSTEE_FORM    TrusteeForm
  65.                         dd      ?               &#59;                   TRUSTEE_TYPE    TrusteeType
  66.                         dd      ?               &#59;                   LPSTR           ptstrName };
  67.  
  68.         gdt             dw      ?               &#59;KGDTENTRY{         WORD            LimitLow
  69.                         dw      ?               &#59;                   WORD            BaseLow
  70.                         dw      ?               &#59;                   WORD            BaseHigh };
  71.  
  72.         pad1            dw      ?
  73.  
  74.         pAddrgdt        dq      ?               &#59;PHYSICAL_ADDRESS
  75.  
  76.         Callgate        dq      ?               &#59;                  PHYSICAL_ADDRESS pAddress
  77.                         dd      ?               &#59;                   VOID*           MappedAddress
  78.                         dd      ?               &#59;                   CALLGATE_DESC*  pDesc
  79.                         dw      ?               &#59;                   WORD            Segment
  80.                         dw      ?               &#59;                   WORD            LastEntry
  81.  
  82.         ViewSize        dd      ?
  83.  
  84.         CgCall          df      ?
  85.  
  86.         pad2            dw      ?
  87.  
  88.         udevname        db      62 dup(?)
  89.        
  90. buff db ?
  91. hout dd ?
  92. hin dd ?
  93.  
  94. .const
  95.  
  96.         modname         db      "Ring0",0
  97.  
  98.         err1            db      "error",0
  99.         err2            db      "error : Acceso Denegado",0
  100.  
  101.         devname         db      "\device\physicalmemory",0
  102.  
  103.         user            db      "CURRENT_USER",0
  104.        
  105.    
  106. ;_____________________________________________________________________________________________
  107. .code
  108.  
  109. Start:
  110. ;_____________________________________________________________________________________________
  111.  
  112.  
  113.  
  114.  &#59;push 30
  115.    
  116.  
  117.         invoke      MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED,addr devname,-1,addr udevname,30
  118.  
  119.         .IF eax == 0
  120.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  121.             jmp         fin
  122.         .ENDIF
  123.  
  124.  
  125.         invoke      RtlInitUnicodeString,addr unicode_str,addr udevname
  126.  
  127.         mov         ebx,offset obj_attrib
  128.         mov         dword ptr [ebx],24                                  &#59; sizeof de (OBJECT_ATTRIBUTES)
  129.         mov         dword ptr [ebx+4],NULL
  130.         mov         dword ptr [ebx+8],offset unicode_str
  131.         mov         dword ptr [ebx+12],OBJ_CASE_INSENSITIVE
  132.         or          dword ptr [ebx+12],OBJ_KERNEL_HANDLE
  133.         mov         dword ptr [ebx+16],NULL
  134.         mov         dword ptr [ebx+2],NULL
  135.  
  136.         mov         edx,SECTION_MAP_READ
  137.         or          edx,SECTION_MAP_WRITE
  138.         invoke      NtOpenSection,addr hPhysicMem,edx,ebx
  139.  
  140.         .IF eax != ERROR_SUCCESS
  141.             .IF eax == 0C000022h
  142.                 jmp         needrw
  143.             .ELSE            
  144.                 invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  145.                 jmp         fin
  146.             .ENDIF
  147.         .ELSE
  148.             mov         pOldDacl,NULL
  149.             jmp     rw
  150.         .ENDIF
  151.  
  152. needrw: mov         edx,WRITE_DAC
  153.         or          edx,READ_CONTROL
  154.         invoke      NtOpenSection,addr hPhysicMem,edx,addr obj_attrib
  155.  
  156.         .IF eax != ERROR_SUCCESS
  157.             .IF eax == 0C0000022h
  158.                 invoke      MessageBox,NULL,addr err2,addr modname,MB_OK
  159.                 jmp         fin
  160.             .ELSE            
  161.                 invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  162.                 jmp         fin
  163.             .ENDIF
  164.         .ENDIF
  165.  
  166.  
  167.         invoke      GetSecurityInfo,hPhysicMem,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,addr pOldDacl,NULL,addr pSecuDescript
  168.  
  169.         .IF eax != ERROR_SUCCESS
  170.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  171.             jmp         fin
  172.         .ENDIF
  173.  
  174.  
  175.       &#59;invoke      GetExplicitEntriesFromAcl,pOldDacl,addr nexp,addr dacl
  176.  
  177.       &#59;mov         edx,dacl
  178.       &#59;mov         edx,[edx+32]
  179.       &#59;and         edx,2
  180.       &#59;cmp         edx,2
  181.       &#59;je          noneed
  182.  
  183.  
  184.         mov         ebx,offset Exp_Access
  185.         mov         dword ptr [ebx],SECTION_ALL_ACCESS
  186.         mov         dword ptr [ebx+4],GRANT_ACCESS
  187.         mov         dword ptr [ebx+8],NO_INHERITANCE
  188.         mov         dword ptr [ebx+12],NULL
  189.         mov         dword ptr [ebx+16],NO_MULTIPLE_TRUSTEE
  190.         mov         dword ptr [ebx+2],TRUSTEE_IS_NAME
  191.         mov         dword ptr [ebx+24],TRUSTEE_IS_USER
  192.         mov         dword ptr [ebx+28],offset user
  193.  
  194.         invoke      SetEntriesInAcl,1,addr Exp_Access,pOldDacl,addr pNewDacl
  195.  
  196.         .IF eax != ERROR_SUCCESS
  197.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  198.             jmp         fin
  199.         .ENDIF
  200.  
  201.  
  202.         invoke      SetSecurityInfo,hPhysicMem,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL
  203.  
  204.         .IF eax != ERROR_SUCCESS
  205.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  206.             jmp         fin
  207.         .ENDIF
  208.  
  209.  
  210.         invoke      LocalFree,pNewDacl
  211. noneed: invoke      LocalFree,dacl
  212.         invoke      LocalFree,pSecuDescript
  213.         invoke      NtClose,hPhysicMem
  214.         mov         hPhysicMem,NULL
  215.  
  216. ;______________________________________________________________________________________________________________________
  217. ;
  218. ;   Instalacion de la CallGate
  219. ;______________________________________________________________________________________________________________________
  220.  
  221.  
  222.         mov         edx,SECTION_MAP_READ
  223.         or          edx,SECTION_MAP_WRITE
  224.         invoke      NtOpenSection,addr hPhysicMem,edx,addr obj_attrib
  225.  
  226.         .IF eax != ERROR_SUCCESS
  227.             .IF eax == 0C0000022h
  228.                 invoke      MessageBox,NULL,addr err2,addr modname,MB_OK
  229.                 jmp         fin
  230.             .ELSE            
  231.                 invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  232.                 jmp         fin
  233.             .ENDIF
  234.         .ENDIF
  235.  
  236.  
  237. rw:     sgdt        gdt
  238.         mov         ebx,offset gdt
  239.         movzx       eax,word ptr [ebx+2]
  240.         movzx       edx,word ptr [ebx+4]
  241.         shl         edx,16
  242.         or          edx,eax
  243.  
  244.         .IF (edx < 8000000h) || (edx >= 0A0000000h)
  245.             and         edx,0FFFF000h
  246.         .ELSE
  247.             and         edx,1FFFF000h
  248.         .ENDIF
  249.  
  250.         mov         ebx,offset pAddrgdt        
  251.         mov         dword ptr [ebx],edx
  252.         mov         dword ptr [ebx+4],0
  253.         mov         dword ptr [ebx+8],edx
  254.         mov         dword ptr [ebx+12],0
  255.  
  256.         push        PAGE_READWRITE
  257.         push        0
  258.         push        1
  259.         movzx       edx,word ptr gdt
  260.         mov         ViewSize,edx
  261.         push        offset ViewSize
  262.         mov         eax,offset Callgate
  263.         push        eax
  264.         push        edx
  265.         push        0
  266.         add         eax,8
  267.         push        eax
  268.         push        -1
  269.         push        hPhysicMem
  270.         call        NtMapViewOfSection
  271.  
  272.         .IF eax != ERROR_SUCCESS
  273.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  274.             jmp         fin
  275.         .ENDIF
  276.  
  277.  
  278.         mov         ebx,offset Callgate
  279.         mov         dx,word ptr gdt
  280.         and         dx,0FFF8h
  281.         mov         word ptr [ebx+18],dx
  282.         mov         dword ptr [ebx+12],NULL
  283.         movzx       eax,dx
  284.         mov         ecx,[ebx+8]
  285.         add         eax,ecx
  286.  
  287.         .WHILE eax > ecx                                              &#59; Busca un descriptor libre para la callgate en la gdt
  288.             mov         dl,byte ptr [eax+5]                           &#59; Mira si el bit 'ocupado' esta a 0. Si esta a 1
  289.             and         dl,80h                                        &#59; , esta ocupada la posicion
  290.             jne         @f                                            &#59; y se busca en otro sitio.
  291.  
  292.             mov         edx,Ring0
  293.             mov         word ptr [eax],dx                             &#59; inicio de la direccion de la funcion de ring 0
  294.             mov         word ptr [eax+2],KGDT_R0_CODE
  295.             mov         byte ptr [eax+4],1                            &#59; Le paso 1 parametro
  296.                                                                       &#59; El nº de parametro esta codificado
  297.                                                                       &#59; en los 4 primeros bits del byte, no se pueden pasar mas de 15
  298.                                                                       &#59; sino me pasaria de bytes
  299.             mov         byte ptr [eax+5],0ECh
  300.             shr         edx,16
  301.             mov         word ptr [eax+6],dx                           &#59; final de la direccion de la funcion de ring0
  302.             mov         dword ptr [ebx+12],eax
  303.             jmp         fwh
  304.  
  305. @@:         sub         eax,8                   &#59; le paso un parametro porque me gustaria llamar
  306.         .ENDW                                                         &#59; a GetModuleHandle desde dentro de la funncion
  307.                                                                       &#59;ring 0
  308. fwh:    mov         edx,[ebx+12]
  309.  
  310.         .IF edx == NULL                                               &#59; Encuentro un descriptor libre ? Sino paro.
  311.             invoke      MessageBox,NULL,addr err1,addr modname,MB_OK
  312.             jmp         fin
  313.         .ENDIF
  314.  
  315.  
  316.         mov         edx,eax
  317.         sub         edx,[ebx+8]
  318.         or          dx,3
  319.         mov         word ptr [ebx+16],dx
  320.  
  321. ;______________________________________________________________________________________________________________________
  322. ;
  323. ;   Llamada de la función Ring0
  324. ;______________________________________________________________________________________________________________________
  325.  
  326.  
  327.         mov         eax,offset CgCall
  328.         mov         dx,word ptr [ebx+16]
  329.         mov         word ptr [eax+4],dx
  330.         mov         dword ptr [eax],0
  331.  
  332.         push        thend-Ring0
  333.         push        Ring0
  334.         call        VirtualLock
  335.  
  336.         call        GetCurrentThread
  337.         invoke      SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL
  338.  
  339.         invoke      Sleep,0
  340.                                  
  341.         push        fs                                                  
  342.                                                                        
  343.                                                                          
  344.  
  345.    
  346.  
  347.         pop         fs
  348.  
  349.         call        GetCurrentThread
  350.         invoke      SetThreadPriority,eax,THREAD_PRIORITY_NORMAL
  351.  
  352.         push        thend-Ring0
  353.         push        Ring0
  354.         call        VirtualUnlock
  355.  
  356. ;______________________________________________________________________________________________________________________
  357. ;
  358. ;   Limpieza y desinstalacion de la CallGate
  359. ;______________________________________________________________________________________________________________________
  360.  
  361.  
  362.         mov         ebx,offset Callgate
  363.         mov         edi,[ebx+12]
  364.         xor         eax,eax
  365.         stosd
  366.         stosd
  367.  
  368.         .IF pOldDacl != NULL
  369.             invoke      SetSecurityInfo,hPhysicMem,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pOldDacl,NULL
  370.         .ENDIF
  371.  
  372.         invoke      NtUnmapViewOfSection,-1,dword ptr [ebx+8]
  373.         invoke      NtClose,hPhysicMem
  374.  
  375. ;______________________________________________________________________________________________________________________
  376.  
  377.  
  378. fin:    invoke      ExitProcess,0
  379.  
  380. ;______________________________________________________________________________________________________________________
  381.  
  382.  
  383. ;______________________________________________________________________________________________________________________
  384. ;
  385. ;   La funcion que va a "saltar" a modo kernel
  386. ;   no hace nada, pero cuidado que el sistema puede caerse al mas minimo error
  387. ;   me dieron algunos pantallazos al programar esto...
  388. ;______________________________________________________________________________________________________________________
  389.  
  390.  
  391. Ring0 PROC
  392.  
  393.         pushad                                        &#59; Guardo los registros y flags
  394.         pushf                                          
  395.  
  396.         mov         ebp,esp                           &#59; para restaurar mas tarde la pila
  397.                                                       &#59;
  398.  
  399.         mov         eax,[ebp+42]                      &#59; recupero los parametros en eax
  400.                                                       &#59; durante un call, se pushea la direccion de retorno cuando
  401.                                                       &#59; es una llamada far, la direccion de retorno incluye CS
  402.                                                      &#59; asi que son 8 bytes de la pila (en realidad son 6 bytes)
  403.                                                  
  404.                                                       &#59; Al cambiar de privilegios se pushea :
  405.                                                       &#59; ss y esp de la pila de ring 3, la configuracion y entonces cs eip.
  406.                                                       &#59; Al entrar al procedimiento el primer parametro
  407.                                                       &#59; esta en [esp+8], entonces se calcula lo que se pusheo
  408.                                                       &#59; hace tiempo pushad (32), pushf (2) + esp
  409.                                                       &#59; 32 + 2+ 8 = 42
  410.  
  411.  
  412.  &#59; Aqui Cli y Sti funciona pero este code de debajo no y no se el por que.
  413.  &#59; No me deja llamara ninguna api
  414.  
  415.   push STD_OUTPUT_HANDLE
  416.   call GetStdHandle; obtendre el handle de la consola
  417.   mov  edi,eax   &#59; copio a hout el handle obtenido
  418.  
  419.   push NULL; nulo
  420.       lea eax,buff; buffer de escritura
  421.       push eax; meto el buffer en la pila
  422.       push 17;longitud del mensaje
  423.       lea eax,d1
  424.       push eax; meto la cadena en la pila
  425.       push edi;meto en la pila el handle
  426.       call WriteConsole
  427.  
  428.  
  429.      
  430.  
  431.         popf                                          &#59; restauro los flags
  432.         popad
  433.         retf 4                                        &#59; ajusto la pila
  434.  
  435. Ring0 ENDP
  436.  
  437. thend:                  &#59; etiqueta para facilitar el calculo del tamaño de la funcion
  438.  
  439. ;______________________________________________________________________________________________________________________
  440.  
  441.  
  442.  
  443. end   Start
  444.  
  445.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #7 en: Martes 11 de Diciembre de 2007, 22:42 »
0
Me traiciono la memoria evidentemente, hubiera jurado que PhysicaMemory estaba vedado en XP pero veo que es de 2003 Server en adelante.

Al codigo le faltaba la parte en la cual llamaba a la funcion aunque la encontre rapidamente en  Internet.

¿Cual es la razon por la cual pensas que tiene algun sentido llamar a una funcion de modo Usuario desde modo Kernel? La amplia mayoria de ellas intentan pasar a modo Kernel justamente. GetStdHandle es una excepcion ya que usa el PEB (RTL_USER_PROCESS_PARAMETERS) para devolver esos valores.

En fin, si se comporta tal como en mi maquina virtual la excepcion se produce por una razon muy simple, esa funcion no esta en memoria y el Kernel se encarga de manejar el page-fault (si lo depuraras verias como justo despues de la ejecucion de MmAccessFault si esta disponible el codigo de la funcion en memoria)  :D Si llamaras a WriteConsoleA antes no daria una excepcion aunque seguiria siendo inutil por supuesto. En modo Kernel hay que usar las funciones ofrecidas por el Kernel y no por la API de Windows de modo Usuario.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #8 en: Martes 11 de Diciembre de 2007, 23:15 »
0
mm El WinDbg es feo. Me baje incluso una interfaz para él pero sigo sin conocerlo muy bien todavia.

La razon de llamar apis de modo usuario ? Pues porque si hay apis en modo kernel que hacen lo mismo no se cuales son.

Tengo un pdf de la api nativa de Windows Xp pero si existen las apis equivalentes no se cuales son. No creas que no las estoy buscando.

Si consiguiera cargar la libreria kernel32.dll en modo kernel podria acceder a sus apis ?
Hay alguna forma de hacer esto ?
Es que tenia entendido que en modo kernel tienes acceso a todas las direcciones.

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #9 en: Martes 11 de Diciembre de 2007, 23:25 »
0
El WinDbg permite depurar en modo Usuario y modo Kernel, el OllyDbg no asi que no hay punto de comparacion.

¿Y cual es la razon para hacer en modo Kernel lo que en modo Usuario? No tiene sentido ...

La API nativa de XP es la NTDLL.dll - una libreria dinamica comun y corriente de modo Usuario - que en su mayoria de funciones solo transforma unos parametros y pasa a modo Kernel.


La DLL - Kernel32 - ya esta cargada en tu proceso y GetStdHandle es ejecutada correctamente, si llamaras antes desde modo Usuario a esa funcion - WriteConsoleA - como te dije no daria una excepcion al no tener que resolver el page-fault el Kernel - cuando lo hace vuelve a modo Usuario -.

En modo Kernel hay que usar las funciones ofrecidas por el Kernel y no por la API de Windows de modo Usuario.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #10 en: Martes 11 de Diciembre de 2007, 23:35 »
0
No quiero ser pesado, ya me entere de que hay que usar la api nativa.
Me olvidare de la api de nivel usuario y ya esta.

Ya se que el WinDbg debuggea en modo kernel, pero me referia a que tiene una interfaz muy fea. Sabes si existe alguna interfaz decente ? porque me bajé una de crackslatinos y ayuda pero no mucho.

Es que veo los datos de forma muy compactada y se me hace dificil de manejar.

Aparte de esto, algun consejo ?

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #11 en: Miércoles 12 de Diciembre de 2007, 00:11 »
0
Cita de: "G.Owl"
No quiero ser pesado, ya me entere de que hay que usar la api nativa.
Me olvidare de la api de nivel usuario y ya esta.

Ya te comente lo que era la API nativa, si la usas es en un programa NORMAL desde modo Usuario. Esa manera de pasar a modo Kernel no es mas que un hack horroroso que no deberias usar jamas para nada que no sea probar que funciona.

Cita de: "G.Owl"
Ya se que el WinDbg debuggea en modo kernel, pero me referia a que tiene una interfaz muy fea. Sabes si existe alguna interfaz decente ? porque me bajé una de crackslatinos y ayuda pero no mucho.

No conozco, siempre uso esa y es asi de chota como la ves pero es funcional y permite depurar tanto en modo Usuario como en modo Kernel.

Cita de: "G.Owl"
Aparte de esto, algun consejo ?

Si queres trabajar en modo Kernel mejor empeza por conseguir el WDK y un par de libros sobre Windows y WDM. Aprende a escribir tu primer modulo de modo Kernel en assembly y despues usa C/C++.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

G.Owl

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problema Tonto En Ring 0
« Respuesta #12 en: Miércoles 12 de Diciembre de 2007, 00:32 »
0
Citar
Ya te comente lo que era la API nativa, si la usas es en un programa NORMAL desde modo Usuario. Esa manera de pasar a modo Kernel no es mas que un hack horroroso que no deberias usar jamas para nada que no sea probar que funciona.

Esacto, no queria hacer nada serio con esto. Sólo tontear.

Bueno, aprendere a usar el WinDbg para el futuro porque no me entero de lo que ocurre cuando hago tonterias como esta.

Ya consegui 2 libros de WDM gracias por decirme que existe la WDK sabia que tendria que haber algo sobre el tema.

Gracias por la info