
    JjJ                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZ  e	e      j                         j$                  d   Zedz  ZdZd	Zd
ZdZdZg dZg dZdddddddddgZd!dZd"dZd#dZd$dZ d$dZ!d%dZ"d&dZ#d&dZ$d'd(dZ%d)dZ&e'd k(  r e&        yy)*zJScan overlapping stores that may initialize opcode 0x24 mode1 source byte.    )annotationsN)Path)read_sections   outiHY iDY iMY i@Y iPY )zstatic-mode1-source-writezindexed-mode1-source-producerzruntime-watchpoint-trace)zEstatic overlapping write covering opcode 0x24 mode1 source 0x0059e348zAindexed or address-producer candidate that initializes 0x0059e348z8runtime watchpoint trace proving the 0x0059e348 producerHwanse2.exezAabsolute-address and static producer-like scans around 0x0059e348)pathdescriptionz5out/save_selector_opcode24_mode1_runtime_context.jsonz+runtime-producer proof gap for mode1 sourcez"out/runtime_trace_feasibility.jsonz-runtime watchpoint trace availability blockerc                    d| dS )N0x08x )values    Q/home/exedev/hwanse/tools/summarize_save_selector_opcode24_mode1_source_writes.pyhex32r   )   s    c{    c                .   g }|dk\  rm| |dz
     dv rc| |dz
     }|dk(  r|j                  d       nD|dk(  r|j                  d       n-|dk(  r|j                  d       n|d	k(  r|j                  d
       |dk\  rm| |dz
  | dv rc| |dz
  | }|dk(  r|j                  d       nD|dk(  r|j                  d       n-|dk(  r|j                  d       n|dk(  r|j                  d       |dk\  rm| |dz
  | dv rc| |dz
  | }|dk(  r|j                  d       nD|dk(  r|j                  d       n-|dk(  r|j                  d       n|dk(  r|j                  d       |dk\  r| |dz
  | dk(  r|j                  d        |dk\  r| |dz
  | d!k(  r|j                  d"       |dk\  r| |dz
  | d#k(  r|j                  d$       |dk\  r| |dz
  | d%k(  r|j                  d&       |sd'd d(d)|t        k(  d*S |d)   \  }}}}	||||	|t        cxk  xr
 ||z   k  d*S c d*S )+Nr   >               r   )readr   zmov al, ds:[addr]r   r   )r      zmov eax, ds:[addr]r   r   )writer   zmov ds:[addr], alr   r   )r   r   zmov ds:[addr], eaxr      >               r   )r   r   zmov cl, byte ptr ds:[addr]r   r   )r   r   zmov ecx, dword ptr ds:[addr]r   r   )r   r   zmov byte ptr ds:[addr], clr   r   )r   r   zmov dword ptr ds:[addr], ecxr   >               r"   )r   r   zmov dl, byte ptr ds:[addr]r   r#   )r   r   zmov edx, dword ptr ds:[addr]r   r    )r   r   zmov byte ptr ds:[addr], dlr   r!   )r   r   zmov dword ptr ds:[addr], edxr      s   f)r   r   zmov word ptr ds:[addr], cxr$   s   f)r   r   zmov cx, word ptr ds:[addr]r$   s   )r   r   zmov byte ptr ds:[addr], imm8r   s   )r   r   zmov dword ptr ds:[addr], imm32r   unknownz%unclassified direct address referencer   )
accessKindwidthinstructioninstructionPrefixBytescoversMode1Source)appendMODE1_SOURCE)
dataposaddress
candidatesopcodeprefixaccessr'   r(   
prefix_lens
             r   classify_refr5   -   s   J
axDqM%==cAgT>ABt^BCt^BCt^CD
axDq%)]]cAgc"[ JK{"LM{"KL{"MN
axDq%)]]cAgc"[ JK{"LM{"KL{"MN
axDq%8GH
axDq%8FG
axDq%4IJ
axDq%4KL#B&'!(L!8
 	
 .8]*FE;
"",$FwF 
 G r   c           
     \   |dk\  r1d| |dz
     cxk  rdk  r n ng d| |dz
     dz
     }dddd| d	dd
dS |dk\  r| |dz
     dk(  r	dddddd
dS |dk\  r<| |dz
     dk(  r1d| |dz
     cxk  rdk  r n ng d| |dz
     dz
     }dddd| d	dd
dS |dk\  rH| |dz
     dv r>| |dz
     }| |dz
     }d|cxk  rdk  r#n n d|dv rdnd|dv rdndd|dd|ddd|dv dS |dk\  rJ| |dz
     dv r@| |dz
     }| |dz
     }| |dz
     }|dv r$d|dv rdnd|dv rdndd|dd|dd|ddd|dv dS y ) Nr         )eaxecxedxebxespebpesiediaddress-immediater/   r   zmov z, imm32F)candidateKindr&   r'   r(   r)   isWriteCandidateh   z
push imm32r         >                  rE      indexed-displacement>   rG   rH   rK   rE   r   r   >   rG   rI   rK   z	opcode 0x02xz	 modrm 0xz disp32r$   >   r            $   ,   4   <                           sib-displacementz sib 0xr   )r-   r.   r/   regr1   modrmsibs          r   "classify_static_producer_candidaterb   g   s'   
axDDqM1T1FtCRSG}W[G[\0#!#g.&' %
 	
 axDqMT)0#'&' %
 	
 axDqMT)dd37m.Kt.KFtCRSG}W[G[\0#!#g.&' %
 	
 axDqM%IIcAgS1W5 D !7)/3K)KgQW$(::!*6#,ic{'R*+$*.F$F  axDqM%IIcAgS1W37mtt!3)/3K)KgQW$(::!*6#,ic{'RUVYQZZab*+$*.F$F  r   c                F   t        |       }t        d |D              }| |d   |d   |d   z    }g }t        t        t        dz         D ]  }t        j                  d|      }|j                  |      }|dk\  s0t        |||      }|j                  t        |      t        |d   |z         t        |d   t        d||j                  d      xs dz
        z         |d	   |d
   |d   |d   d       |j                  ||dz         }|dk\  r |j                  d        |S )Nc              3  2   K   | ]  }|d    dk(  s|  ywnamez.textNr   .0sections     r   	<genexpr>zscan_refs.<locals>.<genexpr>        NG76?g3MN   rawraw_sizer   <Ir   var)   r&   r'   r(   r*   )
addressHexrefVaHexinstructionVaHexr&   r'   r(   r*   c                    | d   | d   fS Nrq   rr   r   rows    r   <lambda>zscan_refs.<locals>.<lambda>       s<0#j/B r   key)r   nextrange
SCAN_STARTSCAN_ENDstructpackfindr5   r+   r   maxgetsort)	exesectionstextr-   rowsr/   needler.   refs	            r   	scan_refsr      s7   S!HNxNNDtE{DK$z*::;DDX\2 -T7+iiQhtS'2CKK#Gn!$t*s"23$)$t*s1cSWWMeEfEkjk>l7m*m$n!,/W"=1%()<%=  ))FC!G,C Qh- 	IIBICKr   c                B   t        |       }t        d |D              }| |d   |d   |d   z    }g }t        t        t        dz         D ]  }t        j                  d|      }|j                  |      }|dk\  s0t        |||      }|rh|j                  t        |      t        |d   |z         t        |d   t        d||d   z
        z         |d	   |d
   |d   |d   |d   |t        k(  d	       |j                  ||dz         }|dk\  r |j                  d        |S )Nc              3  2   K   | ]  }|d    dk(  s|  ywre   r   rg   s     r   rj   z2scan_static_producer_candidates.<locals>.<genexpr>   rk   rl   rm   rn   r   ro   r   rp   r)   rB   r&   r'   r(   rC   )	rq   rr   rs   rB   r&   r'   r(   rC   exactMode1Displacementc                    | d   | d   fS ru   r   rv   s    r   rx   z1scan_static_producer_candidates.<locals>.<lambda>   ry   r   rz   )r   r|   r}   PRODUCER_SCAN_STARTPRODUCER_SCAN_ENDr   r   r   rb   r+   r   r   r,   r   )	r   r   r   r-   r   r/   r   r.   	candidates	            r   scan_static_producer_candidatesr      sD   S!HNxNNDtE{DK$z*::;DD,.?!.CD -T7+iiQh:4gNI"'. %d4j3&6 7(-d4j3q#	RjHkBk;l.l(m%.%?"+L"9&w/#,]#;(12D(E.5.E
 
 ))FC!G,C Qh-$ 	IIBICKr   c                P   t        |       }t        |       }|D cg c])  }|j                  d      r|j                  d      dk(  r|+ }}|D cg c]&  }|j                  d      t        t              k(  s%|( }}|D cg c](  }|j                  d      dv r|j                  d      r|* }}|D cg c]  }|j                  d      dk(  r| }}|s|s|sd	nd
}i dddt        t              dt        t
               dt        t               dt        |      dt        |      dt        |      dt        |      dt        |      dt        |      d|d|d|d|d|dddddt        t        t        t        t              d|d S c c}w c c}w c c}w c c}w )!Nr*   r&   r   rq   rB   >   r^   rM   rC   rA   a  No overlapping .text store covering 0x0059e348 was found in the absolute-address scan, and no static address-immediate or indexed-displacement producer candidate was found for the 0x0059e340..0x0059e350 neighborhood. The only exact mode1 source reference remains the opcode 0x24 mode1 read, so 0x0059e348 is still an unresolved runtime byte rather than a proven leaf selector. Adjacent references are useful for object-state context but do not initialize the current mode1 source.zAt least one static producer-like candidate was found near 0x0059e348; inspect those rows before treating mode1 source as unresolved.scopezrabsolute .text references to 0x0059e344..0x0059e34d plus static producer-like references to 0x0059e340..0x0059e350mode1SourceHexstaticProducerScanRangeHexz..rowCountexactMode1RefCountcoveringWriteCountindexedWriteCandidateCountaddressProducerCandidateCountstaticProducerCandidateCountcoveringWritesindexedWriteCandidatesaddressProducerCandidatesstaticProducerCandidatesr   
proofFoundF"opcode24Mode1SourceWriteProofFound%failedOpcode24Mode1SourceWriteGateIdsblocked)missingEvidenceevidenceRefsevidenceRefCountpromotionStatus
conclusion)r   r   r   r   r,   r   r   len+FAILED_OPCODE24_MODE1_SOURCE_WRITE_GATE_IDS,OPCODE24_MODE1_SOURCE_WRITE_MISSING_EVIDENCE)OPCODE24_MODE1_SOURCE_WRITE_EVIDENCE_REFS)	r   r   static_candidatesrw   covering_writesexact_mode1_refsindexed_write_candidatesaddress_producer_candidatesr   s	            r   build_summaryr      sQ   S>D7<77&'CGGL,AW,L 	O  (,\sww|/DlH[/[\\( 77?#'SSGG&' 	    )#77?#':: 	# # '?Hc	S U   F%- 	%/B)C(DBuM^G_F`&a 	CI	
 	c"23 	c/2 	%c*B&C 	(-H)I 	',=(> 	/ 	!": 	$%@ 	#$5 	 	e  	-e!" 	01\#$ HA IJ$ - / ] 
#s   .F&F6F -F3F#c                z   ddd| d    ddd| d    dd	| d
    dd| d    d| d    d| d    d| d    d| d    dd| d    dd| d    d| d    dddg}|j                  d | d   D               |j                  g d       |j                  d | d    D               |j                  g d!       |j                  d" | d#   D               |j                  g d$       | d%   D ]>  }|j                  d&|d'    d(|d)    d*|d+    d,|d-    d,|d.    d,|d/    d,|d0    d1       @ | d%   s|j                  d2       |j                  g d3       | d4   D ]?  }|j                  d&|d'    d(|d)    d*|d-    d,|d.   |d.   nd5 d,|d6    d,|d0    d1       A |j                  d       d7j                  |      S )8Nz/# Save Selector Opcode 0x24 Mode1 Source Writes zScope: r   .z- mode1 source: `r   `z- static producer scan range: `r   z- exact mode1 refs: r   z,- overlapping writes covering mode1 source: r   z- indexed write candidates: r   z- address producer candidates: r   z- proofFound: `r   z'- opcode24Mode1SourceWriteProofFound: `r   z- promotion status: r   z- conclusion: r   z## Failed Gatesc              3  (   K   | ]
  }d | d  yw)- `r   Nr   rh   items     r   rj   zmarkdown.<locals>.<genexpr>  s     \43tfA\s   r   )r   z## Missing Evidencer   c              3  &   K   | ]	  }d |   yw)z- Nr   r   s     r   rj   zmarkdown.<locals>.<genexpr>$  s     D2dVDs   r   )r   z## Evidence Refsr   c              3  8   K   | ]  }d |d    d|d      yw)r   r	   z`: r
   Nr   rh   rw   s     r   rj   zmarkdown.<locals>.<genexpr>*  s/       c&k]#c-012s   r   )r   z## Static Producer Candidatesr   zR| address | ref | kind | access | width | exact mode1 displacement | instruction |z,| --- | --- | --- | --- | ---: | --- | --- |r   z| `rq   z` | `rs   z` | rB   z | r&   r'   r   r(   z |z| - | - | - | - | - | - | - |)r   z## Absolute Referencesr   z?| address | ref | access | width | covers mode1 | instruction |z&| --- | --- | --- | ---: | --- | --- |r   -r*   
)extendr+   join)summarylinesrw   s      r   markdownr   
  s   9

''"#1%

G$456a8
)'2N*O)PPQR
w';<=>
6w?S7T6UV
&w/K'L&MN
)'2Q*R)ST
',/02
1':^2_1``ab
w'89:;
./0

#E& 
LL\73Z+[\\	LL  
 
LLD1B)CDD	LL  
 
LL >*  
LL   12 
#l#$E#.@*A)B$s?G[F\\_< !S\N#c:R6S5TTWX[\iXjWkkmo	


 -.45	LL   v 
#l#$E#.@*A)B$s<GXFYY\"7|7s7|SASI\E]D^^abefsbtauuwy	


 
LL99Ur   c                   dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d	 | d
   D              }dj                  d | d   D              }dj                  ddddt        j                  | d          dd| d    d| d    d| d    d| d    d| d    d| d    dt        j                  t        | d                 d!t        j                  | d"          d#d$t        j                  | d%          d#d&d'| d(d)d'| d(d*d'| d(d+d,|xs d-d.d/d0|d.g      S )1Nr   c              3  4  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d|d	    dt        j                  |d
          d  yw)<tr><td><code>rq   </code></td><td><code>rs   </code></td><td>rB   	</td><td>r&   r'   r   r(   
</td></tr>Nhtmlescaper   s     r   rj   zhtml_page.<locals>.<genexpr>M  s       	[[\!234 5[[%7!89: ;{{3/01 2{{3|,-. /7|n +,- .{{3}-./ 0	s   BBr   c              3    K   | ]~  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d|d   |d   nd	 d|d
    dt        j                  |d          d  yw)r   rq   r   rs   r   r&   r   r'   Nr   r*   r(   r   r   r   s     r   rj   zhtml_page.<locals>.<genexpr>Y  s      
 	[[\!234 5[[%7!89: ;{{3|,-. /"7|7s7|SA B&'( ){{3}-./ 0	
s   BBr   r   c              3  N   K   | ]  }d t        j                  |       d  yw)
<li><code>z</code></li>Nr   r   s     r   rj   zhtml_page.<locals>.<genexpr>d  s+       T[[&'|4   #%r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li></li>Nr   r   s     r   rj   zhtml_page.<locals>.<genexpr>h  s+       t{{4 !'r   r   c              3     K   | ]9  }d t        j                  |d          dt        j                  |d          d ; yw)r   r	   z	</code>: r
   r   Nr   r   s     r   rj   zhtml_page.<locals>.<genexpr>l  sE       T[[V-.iCDV8W7XX]^s   ?Ar   za<!doctype html><meta charset="utf-8"><title>Save Selector Opcode 0x24 Mode1 Source Writes</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z6<h1>Save Selector Opcode 0x24 Mode1 Source Writes</h1>z
<p>Scope: r   z.</p>z<p>mode1 source <code>r   z$</code>; static producer scan <code>r   z</code>; exact refs r   z,; overlapping writes covering mode1 source: r   z; indexed write candidates: r   z; address producer candidates: r   z; proofFound <code>r   z</code>; promotion status: r   z</p>z<p>r   z<h2>Failed Gates</h2>z<ul>z</ul>z<h2>Missing Evidence</h2>z<h2>Evidence Refs</h2>z#<h2>Static Producer Candidates</h2>z<table><thead><tr><th>address</th><th>ref</th><th>kind</th><th>access</th><th>width</th><th>exact mode1 displacement</th><th>instruction</th></tr></thead><tbody>z<<tr><td colspan="7">No static producer candidates.</td></tr>z</tbody></table>z<h2>Absolute References</h2>z<table><thead><tr><th>address</th><th>ref</th><th>access</th><th>width</th><th>covers mode1</th><th>instruction</th></tr></thead><tbody>)r   r   r   str)r   producer_rowsr   failed_gatesmissing_evidenceevidence_refss         r   	html_pager   L  s   II  56 M 99 
 6?
 
D 77 CD L ww -.  GG >* M 99m 	n@
T[[!12359
 )9!: ;;_`g  iE  aF  `G  G[  \c  dx  \y  [z  zf  gn  oC  gD  fE  Ea  bi  jF  bG  aH  Hg  ho  pO  hP  gQ  Qd  ei  ep  ep  qt  u|  }I  uJ  qK  eL  dM  Mh  im  it  it  u|  }N  uO  iP  hQ  QU  	V
dkk',/016
|nE"#
 & 
}oU#- 	lWW& 	S)  r   c                   |j                  dd       |dz  }|j                  t        j                  | dd      dz   d	       |9|j                  j                  dd       |j                  t        |       d	       |S )
NT)parentsexist_okz/save_selector_opcode24_mode1_source_writes.jsonFr   )ensure_asciiindentr   zutf-8)encoding)mkdir
write_textjsondumpsparentr   )r   out_dirhtml_outjson_outs       r   write_outputsr     s    MM$M.JJH

7q9D@   dT:Ig.AOr   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                  dt               | j                         }t        |j                  j                               }t        ||j                  |j                        }t        d|        y )Nz--exer   )typedefaultz	--out-dirz
--html-out)r   z&wrote opcode24 mode1 source writes -> )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r   
read_bytesr   r   r   print)parserargsr   r   s       r   mainr     s    $$&F
dD=4HI
$<
40DDHH//12GWdllDMMBH	28*
=>r   __main__)r   intreturnr   )r-   bytesr.   r   r/   r   r   dict)r-   r   r.   r   r/   r   r   zdict | None)r   r   r   z
list[dict])r   r   r   r   )r   r   r   r   )N)r   r   r   r   r   zPath | Noner   r   )r   None)(__doc__
__future__r   r   r   r   r   syspathlibr   r	   insertr   __file__resolver   probe_exe_scene_tablesr   r   r   r   r,   r~   r   r   r   r   r   r   r   r5   rb   r   r   r   r   r   r   r   __name__r   r   r   <module>r     s   P "     
  3tH~--/667 8 0 H~''*
Ul
   / +
0 , +noD  VC  D1Bqr- )7t9x061h?D9x
? zF r   