
    IjsX                       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eZd
ZdZg 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Z&d+dZ'd+d Z(edfd,d!Z)d-d"Z*e+d#k(  r e*        yy).zLScan broad block write candidates that could cover opcode 0x24 mode1 source.    )annotationsN)Path)read_sections   outiHY i Y 0   i    )eaxecxedxebxespebpesiedi)zmode1-source-block-writez covering-size-transfer-candidatezruntime-watchpoint-trace)zHbroad block write candidate covering opcode 0x24 mode1 source 0x0059e348zMnearby covering size and transfer instruction proving a static block producerz8runtime watchpoint trace proving the 0x0059e348 producerHwanse2.exez<dword-reference block-write scan over 0x0059e300..0x0059e348)pathdescriptionz3out/save_selector_opcode24_mode1_source_writes.jsonz0direct/static source-write scan for mode1 sourcez"out/runtime_trace_feasibility.jsonz-runtime watchpoint trace availability blockerc                    d| dS )N0x08x values    P/home/exedev/hwanse/tools/summarize_save_selector_opcode24_mode1_block_writes.pyhex32r   *       c{    c                    d| dS )Nr   02xr   r   s    r   hex8r    .   r   r   c                ^    t        d t        |       D              }|| |d   |d   |d   z    fS )Nc              3  2   K   | ]  }|d    dk(  s|  yw)namez.textNr   ).0sections     r   	<genexpr>ztext_section.<locals>.<genexpr>3   s     [wSZ@Z7[s   rawraw_size)nextr   )exer%   s     r   text_sectionr+   2   s;    [-*<[[GC'*:M)MNNNr   c                    t        j                  d|      }g }| j                  |      }|dk\  r,|j                  |       | j                  ||dz         }|dk\  r,|S )N<Ir   r   )structpackfindappend)datatargetneedlerefsposs        r   find_dword_refsr7   7   s\    [[v&FD
))F
C
(Ciia( ( Kr   c                   |dk\  r| |dz
     dk(  r| |dz
     dk(  rdddddd	S |d
k\  r| |d
z
     dk(  r| |dz
     dv rddddd
d	S |dk\  r(| |dz
  | dv r| |dz
     dk(  }|rdnddd|rdnd ddd	S |dk\  rn| |dz
     }|dv r/|dk(  rdddddd	S |dk(  rdddddd	S |dk(  rdddddd	S ddd ddd	S d!|cxk  rd"k  rn nt         |d!z
     }ddd| d#d$dd	S |d%k(  rddd&d'dd	S |d
k\  rK| |d
z
     d(k(  r@| |dz
     d)v r6| |dz
     }|dz  dk(  r&| |dz
     d*k(  }|rdnddd+| |dz
     d,d-|d,d.d/d
d	S |dk\  rC| |dz
     d0v r9| |dz
     }| |dz
     }|dz  dk(  r!|d1v }|d2v rdnd}|rdnd|d3|d,d-|d,d.d4dd	S d5d d6d5d7d	S )8N            address   z!mov dword ptr [ebp+disp32], imm32zmov-stack-imm32)
accessKindwidthinstructioninstructionKindinstructionPrefixBytes         D   E    mov dword ptr [ebp+disp8], imm32>      f   fr      writereadmov zds:[addr], axzax, ds:[addr]zdirect-moffs16>            rL   rP   zmov al, ds:[addr]zdirect-moffs8rQ   zmov eax, ds:[addr]zdirect-moffs32rR   zmov ds:[addr], alzmov ds:[addr], eax      , imm32zmov-reg-imm32h   
push imm32z
push-imm32f   >         rY   zopcode 0x66 0xr   z	 modrm 0xz direct disp32zdirect-modrm16>               rY      rZ      r:         >	   r[   r\   r]   r^   rY   r`   r:   ra   rb   >   r[   r]   r^   r_   r`   ra   z	opcode 0xzdirect-modrmunknownzunclassified dword referencer   )	REG_NAMES)r2   r6   rM   opcoderegmodrmr@   s          r   classify_refrh   A   s   
axDqMT)d37mt.C#>0&'
 	
 axDqMT)d37m|.K#=0&'
 	
 axDq3'+EES1W%%*'!U/!PQ/&'
 	
 axcAg--~"(#6'6./  ~"(#7'7./  ~")#6'6./  &3#3*+  6!T!FTM*C'!%cU'2#2*+  T>'+#/*+  axDqMT)d37m|.KS1W4<4qMT)E).gF!/S1Wc/B)ERU;Vde#3*+  axDqM%ggcAgS1W4<4TTE#GGAQE).gF!*6#,ic{.Y#1*+   5$"# r   c           	        g }|}|t        |t        |             k  r| |   }|dk(  rq|dz   t        |       k  r`t        j                  d| |dz         d   }d|cxk  r	t        k  r.n n+|j                  t        ||z         |t        |      dd       |dz  }|dv r|d	z   t        |       k  rvt        j                  d
| |dz         d   }d|cxk  r	t        k  rCn n@|j                  t        ||z         |t        |      |dk(  rdndt        |dz
      dd       |dz  }|dk(  r||dz   t        |       k  rk| |dz      dv rat        j                  d
| |dz         d   }d|cxk  r	t        k  r.n n+|j                  t        ||z         |t        |      dd       |dz  }|dz  }|t        |t        |             k  r|S )Nj   r   br   z	push imm8)vaHexr   valueHexrA   rE   >   rV   rS               rT   r>   r-   rV   rW   rO   rS   rU   r;   r:   r9   rF   rD   rI      )	minlenr.   unpack_fromMAX_BLOCK_SIZEr1   r   r    rd   )r2   startendtext_varowsindexre   r   s           r   small_immediatesr|      s   DE
#c3t9%
%eT>eai#d)3&&sD%!)<Q?EE+^+"7U?3" $U#.	  QJE??EAIPSTXPYDY&&tT519=a@EE+^+"7U?3" %e "T> %#Iftm$<#=WE	 	 QJET>eai#d)3UQY<8W&&tT519=a@EE+^+"7U?3" %e#E	  QJE
O #c3t9%
%P Kr   c                   g }|}|t        |t        |             k  r_| |   dk(  ri|dz   t        |       k  rXt        j                  d| |dz         d   }||z   dz   |z   }|j	                  t        ||z         dt        |      d       |dz  }| |   d	k(  rC|dz   t        |       k  r2| |dz      d
k(  r'|j	                  t        ||z         dd d       |dz  }| |   dk(  rM|dz   t        |       k  r<| |dz      dv r2|j	                  t        ||z         d| |dz      dd d       |dz  }*| |   dv r(|j	                  t        ||z         d| |   dd d       |dz  }|t        |t        |             k  r_|S )N   r>   z<ir   r   r;   z
call-rel32)rl   kind	targetHexrb      zcall-iatr9      >               zrep-opcode-0xr   rE   >   r   r   zstos-opcode-0x)rs   rt   r.   ru   r1   r   )r2   rw   rx   ry   rz   r{   relr3   s           r   call_or_rep_rowsr      s   DE
#c3t9%
%;$519s4y#8$$T4;A>Cu_q(3.FKKw/$"6] 
 QJE;$519s4y#8T%!)_PT=TKKw/"! 
 QJE;$519s4y#8T%!)_Ph=hKKw/'UQY'<=! 
 QJE;,&KKw/(eS(9:! 
 	
C #c3t9%
%D Kr   c                l   t        |       \  }}g }t        t        t        dz         D ]p  }t	        ||      D ]]  }t        ||      }t        d||j                  d      xs dz
        }|dz   }t        |z
  dz   }	|d   dk(  xr; t        |j                  d      t              xr |t        cxk  xr ||d   z   k  nc }
|d   dk(  xr	 |t        k  }|}|t        z   }|r't        ||||d	         D cg c]  }|d
   |	k\  r| c}ng }|rt        ||||d	         ng }|xr t        |      xr t        |      }|j                  t!        |      t!        |d	   |z         t!        |d	   |z         |d   |d   |d   |d   |	t!        |	      |
||||d       ` s |j#                  d        |S c c}w )Nr   r   rC   r>   r?   rM   r@   r=   var   rB   rA   )
addressHexrefVaHexinstructionVaHexr?   r@   rB   rA   requiredSizeToCoverMode1requiredSizeToCoverMode1HexdirectCoveringWriteaddressLikeCoveringBasecoveringSizeCandidatestransferCandidatesblockWriteCandidatec                    | d   | d   fS )Nr   r   r   )rows    r   <lambda>zbuild_rows.<locals>.<lambda>,  s    s<0#j/B r   )key)r+   rangeBLOCK_SCAN_STARTBLOCK_SCAN_ENDr7   rh   maxgetMODE1_SOURCE
isinstanceintWINDOW_BYTESr|   r   boolr1   r   sort)r*   textr2   rz   r=   r6   refinstruction_indexinstruction_endrequired_sizedirect_covering_writeaddress_likewindow_start
window_endr   	size_rowstransfer_rowsblock_candidates                     r   
build_rowsr     s   c"JD$D)>A+=> #"41 "	CtS)C #Ascgg6N.O.TST'U V!AgO(72Q6ML!W, Eswww/5E|DgG.DD "
 |,	9Ug>UL*L(<7J   0lJPTUYPZ[w<=0  $&  ]i,T<TRVZXnpM*VtIV4CVOKK#Gn!$t*s"23$)$t*7H*H$I!,/W#&'8#9"=1,9/4]/C'<+7*3&3'6 '"	#H 	IIBICK/s   3F1c                D   t        |       }|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}|s|s|rdt        |       dnd}d| 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|d|d|d|dddddt        dt        dt        t        t              d|dS c c}w c c}w c c}w ) Nr   r   r   z It did find zz address-like covering base ref(s), but none has a nearby covering size immediate, so they are not block-write candidates.z2 It found no address-like covering base candidate.a!  No broad block write candidate was found for 0x0059e348. The scan covers dword immediates in 0x0059e300..0x0059e348 and looks for address-like uses with nearby covering size immediates and call/rep transfer instructions; it also checks direct wide stores that could cover the mode1 source.z This does not replace a runtime trace, but it removes the obvious static memset/memcpy-style producer shape from the current evidence.ztAt least one broad block write candidate was found; inspect candidate rows before treating 0x0059e348 as unresolved.scopezUdword references to 0x0059e300..0x0059e348 with nearby size/call/rep block-write scanmode1SourceHexscanRangeHexz..windowBytesrowCountaddressLikeCoveringBaseCountdirectCoveringWriteCountblockWriteCandidateCountaddressLikeCoveringBasesdirectCoveringWritesblockWriteCandidatesrz   
proofFoundF!opcode24Mode1BlockWriteProofFound$failedOpcode24Mode1BlockWriteGateIdsmissingEvidenceevidenceRefsblocked)evidenceRefCountpromotionStatus
conclusion)
r   rt   r   r   r   r   r   *FAILED_OPCODE24_MODE1_BLOCK_WRITE_GATE_IDS+OPCODE24_MODE1_BLOCK_WRITE_MISSING_EVIDENCE(OPCODE24_MODE1_BLOCK_WRITE_EVIDENCE_REFS)r*   rz   r   r   direct_coveringblock_candidatesaddress_noter   s           r   build_summaryr   0  s   c?D#'JC3/H+ICJLJ&*Isc2G.HsIOI'+Js3H/IJJ#3  C-. /O O F	 	s n LL 	 L
h%- 	5!1232eN6K5LM 	|	
 	CI 	'L(9 	#C$8 	#C(8$9 	#L 	 	 0 	 	e 	,U 	/0Z  	F!" 	@#$   HI$ ) ' KIJs   
DD
DD
DD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   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 cg c]  }|d'   s
|d(   s|d)   r| }}|D ]  }d*j                  d+ |d,   D              xs d-}d*j                  d. |d/   D              xs d-}|j                  d0|d1    d2|d3    d4|d5    d6|d7    d8|d9    d4| d6| d6|d)    d8|d:    d;        |s|j                  d<       |j                  g d=       | d&   D ]E  }|j                  d0|d1    d2|d3    d4|d5    d6|d7    d6|d>   |d>   nd- d8|d9    d2|d:    d;       G |j                  d       d?j                  |      S c c}w )@Nz.# Save Selector Opcode 0x24 Mode1 Block Writes zScope: r   .z- mode1 source: `r   `z- scan range: `r   z- scan window bytes: r   z- rows: r   z- address-like covering bases: r   z- direct covering writes: r   z- block write candidates: r   z- proofFound: `r   z&- opcode24Mode1BlockWriteProofFound: `r   z- promotion status: `r   r   z## Failed Gatesc              3  (   K   | ]
  }d | d  yw)- `r   Nr   r$   items     r   r&   zmarkdown.<locals>.<genexpr>s  s     [43tfA[s   r   )r   z## Missing Evidencer   c              3  &   K   | ]	  }d |   yw)z- Nr   r   s     r   r&   zmarkdown.<locals>.<genexpr>y  s     D2dVDs   r   )r   z## Evidence Refsr   c              3  8   K   | ]  }d |d    d|d      yw)r   r   z`: r   Nr   r$   r   s     r   r&   zmarkdown.<locals>.<genexpr>  s/       c&k]#c-012s   r   )r   z## Candidate Rowsr   ze| address | ref | kind | access | required size | sizes | transfers | block candidate | instruction |z8| --- | --- | --- | --- | ---: | --- | --- | --- | --- |rz   r   r   r   , c              3  6   K   | ]  }|d     d|d      ywrm   @rl   Nr   r   s     r   r&   zmarkdown.<locals>.<genexpr>  %     jDT*-.aW?j   r   -c              3  6   K   | ]  }|d     d|d      ywr   r   rl   Nr   r   s     r   r&   zmarkdown.<locals>.<genexpr>  #     fDfaW?fr   r   z| `r   z` | `r   z` | rB   z | r?   z | `r   rA   z` |z%| - | - | - | - | - | - | - | - | - |)r   z## All Referencesr   zG| address | ref | kind | access | width | required size | instruction |z-| --- | --- | --- | --- | ---: | ---: | --- |r@   
)extendjoinr1   )summarylinesr   candidate_rowssizes	transferss         r   markdownr   ]  sW   8

''"#1%

G$456a8
'.12!4
 678
7:&'(
)'2P*Q)RS
$W-G%H$IJ
$W-G%H$IJ
',/02
09\1]0^^_`
(9 :;1=


'E* 
LL[73Y+Z[[	LL  
 
LLD1B)CDD	LL  
 
LL >*  
LL   v()S1F-G3OdKe 	N   
		jCPhLijjqnqIIfCPdLeffmjm	#l#$E#.@*A)B$sK\G]F^^a< !c*G&H%IeWTWXaWbbe()*$s=/A.B#G	

 <=	LL   v 
#l#$E#.@*A)B$sK\G]F^^a< !S\5MS\SV$W X1235]9K8LCQ	

 
LL99U9s   2H(c                 r   g }| d   D ]+  }|d   s|d   s|d   sdj                  d |d   D              xs d}dj                  d	 |d
   D              xs d}|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |       dt        j                  |       d|d    dt        j                  |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't        j                  | d(          d)d*t        j                  | d+          d)d,| d-    d.d/| d0    d.d1| d2    d.d3| d4    d.d5| d6    d.d7t        j                  t	        | d8                d)d9t        j                  | d:          d)d;d<t        j                  | d=          d>d?d&| d;d@d&| d;dAd&| d;dBdCdj                  |      xs dDdEdFdG|dEg      S )HNrz   r   r   r   r   c              3  6   K   | ]  }|d     d|d      ywr   r   r   s     r   r&   zhtml_page.<locals>.<genexpr>  r   r   r   r   c              3  6   K   | ]  }|d     d|d      ywr   r   r   s     r   r&   zhtml_page.<locals>.<genexpr>  r   r   r   <tr><td><code>r   </code></td><td><code>r   </code></td><td>rB   	</td><td>r?   </td><td><code>r   rA   </code></td></tr>r   c              3  h  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d   |d   nd
 dt        j                  |d          dt        j                  |d          d  y	w)r   r   r   r   r   rB   r   r?   r@   Nr   r   r   rA   r   htmlescaper   s     r   r&   zhtml_page.<locals>.<genexpr>  s       	[[\!234 5[[%7!89: ;{{30123 4{{3|,-. /"7|7s7|SA B[[%B!CDE F[[]!345 6	s   B0B2r   c              3  N   K   | ]  }d t        j                  |       d  yw)
<li><code></code></li>Nr   r   s     r   r&   zhtml_page.<locals>.<genexpr>  s+       T[[&'|4   #%r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li></li>Nr   r   s     r   r&   zhtml_page.<locals>.<genexpr>  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   r&   zhtml_page.<locals>.<genexpr>  sE       T[[V-.iCDV8W7XX]^s   ?Ar   z`<!doctype html><meta charset="utf-8"><title>Save Selector Opcode 0x24 Mode1 Block Writes</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1180px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z5<h1>Save Selector Opcode 0x24 Mode1 Block Writes</h1>z
<p>Scope: r   z.</p>z<ul>z<li>mode1 source: <code>r   r   z<li>scan range: <code>r   z<li>scan window bytes: r   r   z
<li>rows: r   z!<li>address-like covering bases: r   z<li>direct covering writes: r   z<li>block write candidates: r   z<li>proofFound: <code>r   z<li>promotion status: <code>r   z</ul>z<p>r   z</p>z<h2>Failed Gates</h2>z<h2>Missing Evidence</h2>z<h2>Evidence Refs</h2>z<h2>Candidate Rows</h2>z<table><thead><tr><th>address</th><th>ref</th><th>kind</th><th>access</th><th>required size</th><th>sizes</th><th>transfers</th><th>block candidate</th><th>instruction</th></tr></thead><tbody>z8<tr><td colspan="9">No block write candidates.</td></tr>z</tbody></table>z<h2>All References</h2>z<table><thead><tr><th>address</th><th>ref</th><th>kind</th><th>access</th><th>width</th><th>required size</th><th>instruction</th></tr></thead><tbody>)r   r1   r   r   str)	r   r   r   r   r   all_rowsfailed_gatesmissing_evidenceevidence_refss	            r   	html_pager    s{   Nv 
-.#6K2LPSTiPj		jCPhLijjqnqIIfCPdLeffmjm	S%678 9S);%<=> ?;;s#4567 8;;s<012 3S)F%GHI J;;u%& ';;y)* +,-. /S%789 :
	

$ yy  6? H 77 BC L ww -.  GG >* M 99l 	n?
T[[!12359
"4;;w7G/H#I"J,W
 W^-D!E FlS
!'-"8!9?
WZ()/
+G4R,S+TTYZ
&w/I'J&K5Q
&w/I'J&K5Q
 S1F-G!H IV
&t{{7;L3M'N&O|\
dkk',/016
|nE"#
 & 
}oU#! 	K		.!_%_! 	a=  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_ok.save_selector_opcode24_mode1_block_writes.jsonF),:)ensure_ascii
separatorsr   zutf-8)encoding)mkdir
write_textjsondumpsparentr  )r   out_dirhtml_outs      r   write_outputsr    s    MM$M.??KK

7:FM L  dT:Ig.A r   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                  dt        d d       | j                         }t        |j                  j                               }t        ||j                  |j                         t        d	|j                  d
z          y )N)r   z--exer   )typedefaultz	--out-dirz
--html-outz!Optional HTML report output path.)r  r  helpz%wrote opcode24 mode1 block writes -> r  )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r*   
read_bytesr  r  r  print)parserargsr   s      r   mainr%    s    $$9F
dD=4HI
$<
4DghDDHH//12G'4<<7	1$,,Aq2q1r
str   __main__)r   r   returnr   )r*   bytesr'  ztuple[dict, bytes])r2   r(  r3   r   r'  z	list[int])r2   r(  r6   r   r'  dict)
r2   r(  rw   r   rx   r   ry   r   r'  
list[dict])r*   r(  r'  r*  )r*   r(  r'  r)  )r   r)  r'  r   )r   r)  r  r   r  zPath | Noner'  None)r'  r+  ),r  
__future__r   r  r   r  r.   syspathlibr   r   insertr   __file__resolver  probe_exe_scene_tablesr   r  r  r  r   r   r   r   rv   rd   r   r   r   r   r    r+   r7   rh   r|   r   r   r   r   r  r  r%  __name__r   r   r   <module>r4     s6   R "     
  3tH~--/667 8 0 H~''*
Ul D	. *
/ + +ijB  TF  G1Bqr, (O
k\+\%P(V*ZIXK\ 25d Bu zF r   