
    UHj=                       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	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZmZ ddlmZ ddlmZ  e	e      j!                         j4                  d	   Zed
z  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k(  r e&        yy)zDTrace the gated path after the nearest selectionBuffer[0x20] writer.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset)handler_for_opcode)trace_stream   outc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     ?/home/exedev/hwanse/tools/summarize_save_selector_gate_paths.py	load_jsonr      s*    ;;=::dnngn677    c                "    | rt        | d      S d S )N   )int)values    r   	parse_hexr      s    "3ub>,,r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr(   "   s?    (B'F~!c#h.dC033r   c                    t        | ||      }d|d|d|dnd d}|d|d<   |S ||v rd|d<   ||   |d<   |S t        ||      d|d<   d|d|d<   |S d	|d<   |S )
N0x08x)vaHexvalueHex
unreadablekindcnspointer	targetHexscalar)r(   r   )r$   r%   stringsr&   r   rows         r   pointer_rowr6   )   s    S(B'EbX(-(9bs$tC }"F J 
'	FU^E
 J 
h	&	2Fc{+K J FJr   c                v   g }t        | |||d      D ]  }|j                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      d	        |S )N   stepr,   r-   	opcodeHexhandlerVaHexbranchTargetHexfallthroughVaHex
stopReason
branchNote)	r9   r,   r-   r:   r;   r<   r=   r>   r?   )r
   appendget)r$   r%   r4   startrowsr5   s         r   trace_startrD   <   s    DC7E2> GGFOWWW%
+-GGN3"ww'89 #(: ;'',/'',/

 
	 Kr   c                   t        |       }t        | |      }g }|D ]+  j                  d      xs i }t        |j                  d            }t        j                  d            }||R|dz   }	t	        | |||	      }
|
rt        |
d   j                  d            nd }|rt	        | |||      ng }|rt        |d   j                  d            nd }|rt	        | |||      ng }|r|d   ni }t        |j                  d            }t        |j                  d	      xs d
d      }t        | ||      }t        d |D        i       }t        |j                  d            }|rt        | |||dz         ni }t        |j                  d      xs ddd  d      }t        | ||      }|r2t        |xs d|xs ddz   d      D cg c]  }t        | |||       c}ng }t        fd|D        i       }|j                  i dj                  d      dj                  d      d|j                  d      dj                  d      d|
d|d|d|j                  d      d|j                  d	      d|j                  d      d|j                  d      d|j                  d       d!|d"|j                  d      |j                  d      |j                  d      d#d$|d%|d&|j                  d      |j                  d      |j                  d       d'
d(|j                  d)      d*|j                  d+      xs g d,d-       . |S c c}w ).NnearestLinearWriterwriterVaHexfrontierReaderVaHex   r   r=   r,   r:   0x00r   c              3  J   K   | ]  }|j                  d       dk(  s|  yw)r:   0x24NrA   ).0items     r   	<genexpr>zbuild_rows.<locals>.<genexpr>a   s!     ]$TXXk=RV\=\]s   ##r    r-   
0x00000000(   c              3     K   | ]`  }|j                  d       dk(  rJ|j                  d      j                  d      k(  r'|j                  d      j                  d      k(  r| b yw)leafPointerHex
0x00542ae8sourcetargetNrN   )rO   streamchains     r   rQ   zbuild_rows.<locals>.<genexpr>k   s_      !::./<?JJx(EIIh,??JJx(EIIh,?? s   A&A)rX   rY   nearestWriterVaHexfirstGateTracesecondGateTracepostGateTracedispatchStopVaHexdispatchStopOpcodeHexdispatchStopHandlerVaHexr;   dispatchStopHandlerSectionhandlerSectiondispatchStopIsCodeHandlerisCodeHandlerdispatchContextopcode24Boundary0x01zOpcode 0x24 is an action/state handler. It reads stream+1 as a mode, checks runtime globals 0x0059e34d/0x0059e33e and object state fields, writes context+0x58 in several branches, and only has a simple +4 advance in the statically detected path.r*   02x)
opcodeVaHexopcodeValueHexr;   streamPlus1Hexmeaning	nextDwordnextLowByteOpcodeHexnextLowByteHandlerVaHexnextLowByteHandlerSectionnextLowByteIsCodeHandlerfrontierLeafPointerHexrV   frontierLeafFieldRecordsfieldRecords
conclusiona\  The nearest writer 0x005428bc does not linearly prove the frontier reader. It falls through two 0x11 gates with scalar branch targets 0x00000001/0x00000002, then reaches opcode 0x24 at 0x005428e4. Opcode 0x24 is a runtime action/state handler, so the bytes after 0x005428e4 are not proven linear bytecode by the simple stream tracer. The naive linear trace later reaches low byte 0xe8 at 0x005428f4, but its handler-table entry 0x00440c28 is in .data rather than code. The next proof step is decoding that action/state payload boundary and showing it selects leaf 0x00542ae8 before the 0x00542b0c reader.)r   r   rA   r   rD   r   r	   nextr6   ranger@   )r$   writer_chain_rowsleaf_streamsr%   r4   rC   nearest	writer_va	reader_va
first_gate
gate_tracesecond_gatesecond_gate_trace	post_gatepost_gate_tracestopstop_vastop_opcodestop_handleropcode24opcode24_vaopcode24_nextopcode24_next_opcodeopcode24_next_handlerr&   dispatch_contextfrontier_leafr[   s                              @r   
build_rowsr   M   s   S!HsH-GD" L))128bgkk-89	eii(=>?		 1]
 hD
JTi
1 1 12D EFZ^P[KXwLacO`I/2667IJKfj	LU+c8WiH[]&5r"2DHHW-.488K0:FR@)#xE]/]_abW 56P[C7K!OLac"M$5$5j$A$Q\SUSV#WY[\ 23BV W  W\W\T,A1E
 Xw3
  	 %1 
 	 *
eii)*
eii)*
 !'++m"<*
 "599-B#C	*

 j*
 0*
 _*
  '!2*
 $TXXk%:*
 '(@*
 ),*:*:;K*L*
 ()9)9/)J*
 /*
 '||G4"*,,z": (^ <"(m +*,-A#,F(G+@+D+D^+T-B-F-FGW-X,A,E,Eo,V!*
< %m&7&78H&I=*
> '(9(9.(I(OR?*
@ @C*
 *	ELZ Kq
s   Mc                   g d}| D ]  }|j                  d|d    d|d    dd|j                  d       d	d
|j                  d       d	d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d	d|j                  d      xs i j                  d       d|j                  d      xs i j                  d       d	d|j                  d      xs i j                  d       d|j                  d      xs i j                  d       d|j                  d      xs i j                  d       d|j                  d        dd!d"g       d#|j                  d$      xs g fd%|j                  d&      xs g fd'|j                  d(      xs g ffD ]  \  }}|D ]  }|j                  d)| d*|j                  d+       d,|j                  d-       d.|j                  d/       d.|j                  d0       d.|j                  d       d.|j                  d1      xs d2 d.|j                  d3      xs d2 d4|j                  d5      xs d2 d6         |j                  g d7       |j                  d8      xs g D ]u  }|j                  d9      xs |j                  d:      xs d2}|j                  d;|j                  d-       d.|j                  d/       d4|j                  d<       d*| d6	       w |j                  d      xs i }|j                  dd=d|j                  d>      xs d2dd?|j                  d@      xs i j                  d/       dA|j                  d@      xs i j                  d-       d	d|j                  d       d|j                  d       d|j                  d       g       |j                  d        dBj                  |      S )CN)z# Save Selector Gate Paths zGControl-flow boundary after the nearest `selectionBuffer[0x20]` writer.r   z## rX   z -> rY   r   z- nearest writer: `r\   `z- frontier reader: `rH   z- dispatch stop: `r`   z
` opcode `ra   z` handler `rb   z` in rc   z- frontier leaf candidate: `rt   z- opcode 0x24 boundary: `rh   rk   r;   z- next low-byte handler: `rp   z` -> `rq   rr   z- conclusion: rw   zW| segment | step | va | value | opcode | handler | branch target | fallthrough | stop |z8| --- | ---: | --- | --- | --- | --- | --- | --- | --- |
first gater]   second gater^   	post gater_   z| z | r9   z | `r,   z` | `r-   r:   r<   -r=   z` | r>   z |)r   z### Dispatch Contextr   z| va | value | kind | target |z| --- | --- | --- | --- |rg   r2   r0   z| `r/   z### Opcode 0x24 Boundaryrn   z- next dword: `ro   z` at `
)extendrA   r@   join)rC   linesr5   segmenttracerP   rY   boundarys           r   markdownr      sT   E  )#h-S]O4!#''*>"?!@B"377+@#A"B!D )<!= >jQhIiHjjuvyv}v}  Y  wZ  v[  [`  ad  ah  ah  iE  aF  `G  H*3773K+L*MQO'1C)D)J(O(OP](^'__jlolsls  uG  mH  mN  LN  lS  lS  Tb  lc  kd  de  f(#''2D*E*K)P)PQg)h(iioqtqxqx  zL  rM  rS  QS  qX  qX  Yr  qs  pt  ty  {~  {B  {B  CU  {V  {\  Z\  za  za  b}  z~  y  @SWW\234eF
 	 377#34:;CGG$56<"=#''/28b9
 	NGU
  	TXXf%5$6d488G;L:MUSWS[S[\fSgRh i-.eDHH^4L3M N!23:s;5J\A]Adad@eeixx-45R9	 	tuGG-.4" 	rDXXk*DdhhuoDFLL3txx01txx
7K6LDQUQYQYZ`QaPbbeflemmopq	r 77-.4"&LL#*sx||K8>BCCJOPPVX`XdXdepXqXwuwW|W|  ~E  XF  WG  GH  I(6L)M(NfU]UaUab{U|T}  ~C  DL  DP  DP  Ql  Dm  Cn  o
 	 	RS)T 99Ur   c                   g d}| D ]  }|j                  dt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                   dddt        j                  t        |j	                  d	                   d
dt        j                  t        |j	                  d                   d
dt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                   d	dt        j                  t        |j	                  d                   d
dt        j                  t        |j	                  d      xs i j	                  d                   dt        j                  t        |j	                  d      xs i j	                  d                   d
dt        j                  t        |j	                  d      xs i j	                  d                   dt        j                  t        |j	                  d      xs i j	                  d                   dt        j                  t        |j	                  d      xs i j	                  d                    dd!t        j                  t        |j	                  d"                   dd#d$g       d%|j	                  d&      xs g fd'|j	                  d(      xs g fd)|j	                  d*      xs g ffD ]  \  }}|D ]  }|j                  d+t        j                  |       d,|j	                  d-       d.t        j                  t        |j	                  d/                   d0t        j                  t        |j	                  d1                   d0t        j                  t        |j	                  d2                   d0t        j                  t        |j	                  d                   d0t        j                  t        |j	                  d3      xs d4             d0t        j                  t        |j	                  d5      xs d4             d6t        j                  t        |j	                  d7      xs d4             d8         |j                  d9       |j	                  d:      xs g D ]  }|j	                  d;      xs |j	                  d<      xs d4}|j                  d=t        j                  t        |j	                  d/                   d0t        j                  t        |j	                  d1                   d6t        j                  t        |j	                  d>                   d,t        j                  t        |             d8	        |j	                  d      xs i }|j                  d?       |j                  d@       |j                  dAt        j                  t        |j	                  dB      xs d4             dC       |j                  dDt        j                  t        |j	                  dE      xs i j	                  d1                   dFt        j                  t        |j	                  dE      xs i j	                  d/                   dGt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                   dt        j                  t        |j	                  d                    dC        dHj                  |      S )IN)zL<!doctype html><meta charset="utf-8"><title>Save Selector Gate Paths</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z!<h1>Save Selector Gate Paths</h1>zY<p>Control-flow boundary after the nearest <code>selectionBuffer[0x20]</code> writer.</p>z<h2>rX   z -&gt; rY   z</h2>z<ul>z<li>nearest writer: <code>r\   z</code></li>z<li>frontier reader: <code>rH   z<li>dispatch stop: <code>r`   z</code> opcode <code>ra   z</code> handler <code>rb   z</code> in rc   z</li>z#<li>frontier leaf candidate: <code>rt   z <li>opcode 0x24 boundary: <code>rh   rk   r;   z!<li>next low-byte handler: <code>rp   z</code> -&gt; <code>rq   rr   z<li>rw   z</ul>z<table><thead><tr><th>segment</th><th>step</th><th>va</th><th>value</th><th>opcode</th><th>handler</th><th>branch target</th><th>fallthrough</th><th>stop</th></tr></thead><tbody>r   r]   r   r^   r   r_   z<tr><td>z	</td><td>r9   z</td><td><code>r,   z</code></td><td><code>r-   r:   r<   r   r=   z</code></td><td>r>   z
</td></tr>z</tbody></table><h3>Dispatch Context</h3><table><thead><tr><th>va</th><th>value</th><th>kind</th><th>target</th></tr></thead><tbody>rg   r2   r0   z<tr><td><code>r/   z</tbody></table>z<h3>Opcode 0x24 Boundary</h3>z<p>rn   z</p>z<p>next dword: <code>ro   z</code> at <code>z&</code>; next low-byte handler: <code>r   )r   htmlescapestrrA   r@   r   )rC   partsr5   r   r   rP   rY   r   s           r   	html_pager      sE   E  6
4;;s3778#4567wt{{3swwW_O`Ka?b>cchi(SAU9V5W)X(YYef)$++c#''BW:X6Y*Z)[[gh'C@S8T4U(V'WWlmqmxmxy|  ~A  ~E  ~E  F]  ~^  z_  n`  ma  aw  x|  xC  xC  DG  HK  HO  HO  Pj  Hk  Dl  xm  wn  ny  z~  zE  zE  FI  JM  JQ  JQ  Rn  Jo  Fp  zq  yr  rw  x1$++c#''JbBc>d2e1ffrs.t{{3HZ@[@a_a?f?fgt?u;v/w.x  yO  PT  P[  P[  \_  ad  ah  ah  i{  a|  aB  @B  `G  `G  HV  `W  \X  PY  OZ  Zf  g/CI[A\Ab`b@g@gh~@  =A  1B  0C  CW  X\  Xc  Xc  dg  il  ip  ip  qC  iD  iJ  HJ  hO  hO  Pi  hj  dk  Xl  Wm  mx  y}  yD  yD  EH  JM  JQ  JQ  Rd  Je  Jk  ik  Ip  Ip  qL  IM  EN  yO  xP  PU  V4;;s377<#89:;5A A
 	 377#34:;CGG$56<"=#''/28b9
 	NGU
  ;;w/0 188F+, -!!%S'1B-C!D E F!!%S*1E-F!G H I!!%S+1F-G!H I J!!%S.1I-J!K L M!!%S:K1L1SPS-T!U V W!!%S:L1M1TQT-U!V W X;;s488L+A+HS'IJK L
	& 	  \  	]GG-.4" 		DXXk*DdhhuoDFLL![[TXXg->)?@A B![[TXXj-A)BCD E{{3txx'7#89: ;{{3v;/0 1			 77-.4"'(45s4;;s8<<	+B+Ic'JKLDQR#DKKX\\+5N5TRT4Y4YZd4e0f$g#h iCk)B)Hb(M(Mg(V$WXY Z,,0KKHLLI_<`8a,b+c d;;s8<<8Q+R'STU V++c(,,/J"KLMNd	T	
a6
n 99Ur   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_oksave_selector_gate_paths.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)rC   out_dirs     r   write_outputsr     sC    MM$M...::

4eA6= ; r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                         }t        |j                  j                         t        |j                  dz  g       t        |j                  dz  g             }t        ||j                         t        dt        |       d|j                  d	z          y )
Nz--exezHwanse2.exe)typedefaultz	--out-dirzsave_selector_writer_chain.jsonzsave_selector_leaf_streams.jsonzwrote z! save selector gate path rows -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r$   
read_bytesr   r   r   printr!   )parserargsrC   s      r   mainr     s    $$&F
dD=4HI
$<D$,,!BBBG$,,!BBBGD
 $%	F3t9+>t||Nm?m>n
opr   __main__)r   r   r   r   returnr   )r   z
str | Noner   
int | None)r$   bytesr%   
list[dict]r&   r   r   r   )
r$   r   r%   r   r4   dict[int, str]r&   r   r   dict)
r$   r   r%   r   r4   r   rB   r   r   r   )r$   r   rz   r   r{   r   r   r   )rC   r   r   r   )rC   r   r   r   r   None)r   r   )(__doc__
__future__r   r   r   r   r"   syspathlibr   typingr   r   insertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   summarize_script_handler_tabler	   %summarize_save_selector_stream_tracesr
   r   r   r   r   r   r(   r6   rD   r   r   r   r   r   __name__ r   r   <module>r      s    J "     
   3tH~--/667 8 P P = > H~''*
Ul8-4&"Qh1h>Bq zF r   