
    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mZ  e	e      j!                         j2                  d   Zed	z  Zdd
ZddZddZd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)zJSummarize the opcode 0x24 payload boundary after the current route writer.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset)handler_for_opcodesection_name_for_va   outc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     E/home/exedev/hwanse/tools/summarize_save_selector_opcode24_payload.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   <Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr)   !   s?    (B'F~!c#h.dC033r   c                2   t        j                  d|      }g }|D ]y  }|d   }||d   z   }| || }	|	j                  |      }
|
dk\  s,|j                  |d   d|d   |
z   dd	       t	        |      |k\  r|c S |	j                  ||
d
z         }
|
dk\  rN{ |S )Nr!   rawraw_sizer   name0xr'   08x)sectionvaHexr   )r#   packfindappendr"   )r%   r&   r   limitneedlerefsr0   startenddataposs              r   refs_to_valuer<   (   s    [[u%FD -gj))5~iiQhKK"6?gdmc1#67  4yE!))FC!G,C Qh- Kr   c                   t        | ||      d|dddnd d}d|d<   |S dz  }t        | ||      }|j                  dz  dz	  dz  d|d	|j                  d
      |j                  d      |j                  d      t	        | ||d      d       t        |      |v rd|d<   |   |d<   |S r1d|d<    dt        fd|D              z
  d|d<   dd|d<   |S dz	  dk  rdz  dk  rd|d<   |S d|d<   |S )Nr.   r/   )r1   valueHex
unreadablekind   i  r   02xhandlerVaHexhandlerSectionisCodeHandler   )lo16hi16
lowByteHexlowByteHandlerVaHexlowByteHandlerSectionlowByteIsCodeHandlerr7   cnstargetpointerz+0xc              3  p   K   | ]-  }|d    k(  s|d   cxk  r|d   |d   z   k  s$n n|d    / yw)r-   r'   r,   N ).0sr0   r   s     r   	<genexpr>zrow_at.<locals>.<genexpr>U   sq       4VQRSYQZ^eQejklpjquz  kU}~  @D  ~E  HI  JT  HU  ~U  kUAdG  4Vs   666xtargetVaHexi   pairscalar)r)   r	   updategetr<   r
   next)	r%   r&   stringsr'   rowopcodehandlerr0   r   s	          @@r   row_atr`   ;   s   S(B'EbX(-(9bs$tC }"F
T\F h7GJJ"&6#,'&{{>:!(-=!> 'O <c8R3  "(E2GFH J 
F")3ut  4VX  4V  0V  (V  WX  'Y  ZH!%-M
 J	 2+%	UV^$=F J FJr   c           
        t        |       }t        | |      }g }|D ]G  j                  d      xs i }t        |j                  d            }t        j                  d            }||R|dz
  }t	        ||dz   d      D 	cg c]  }	t        | |||	       }
}	|
D cg c]  }|j                  d      dk(  r| }}|
D cg c]N  }t        |j                  d	            r2t        |j                  d	            |kD  r|j                  d
      du r|P }}|
D cg c]O  }t        |j                  d	            r3t        |j                  d	            |kD  r|j                  d      dk(  r|Q }}|j                  i dj                  d      dj                  d      d|j                  d      d|j                  d      d|j                  d      dj                  d      dt        fd|
D        d       dj                  d      dj                  d      dd|ddd|dz   dd|
dt        |      d t        |      d!t        |      d"d#       J |S c c}	w c c}w c c}w c c}w )$Nopcode24BoundaryopcodeVaHexdispatchStopVaHexr   P   r    r@   rO   r1   rL   TrK   z.datasourcerN   opcode24VaHexopcode24ValueHexopcodeValueHexopcode24HandlerVaHexrC   dispatchStopValueHexc              3     K   | ]9  }|j                  d       j                  d      k(  s'|j                  d       ; yw)r1   rd   r>   NrZ   )rR   itemgates     r   rT   zbuild_rows.<locals>.<genexpr>   s7     t$'ARVZV^V^_rVsAs*%ts
   (AAdispatchStopHandlerVaHexdispatchStopHandlerSectionwindowStartHexr.   r/   windowEndHexL   
windowRowspointerRowCountcodeLowByteCountAfterBoundarydataLowByteCountAfterBoundary
conclusiona  Opcode 0x24 at 0x005428e4 advances by +4 only in the statically visible handler path, but the following region contains self/pointer-table values such as 0x005428e8 and 0x0054294c. A naive low-byte trace through those dwords reaches 0xe8 at 0x005428f4, whose handler-table entry is .data, not code. Treat the region after 0x005428e4 as unresolved payload/table data until the opcode 0x24 runtime mode is decoded.)	r   r   rZ   r   ranger`   r4   r[   r"   )r%   
gate_pathsr&   r\   rowsboundary	opcode_vastop_vawindow_startr'   window_rowsrn   pointer_rowscode_low_bytes_after_boundarydata_low_bytes_after_boundaryro   s                  @r   
build_rowsr   ^   s
   S!HsH-GD 388./52hll=9:	DHH%89: 4' L'D.!<
 3'2.
 

 )
xx9, 
 

 ))
'*+	$((7:K0Ly0X/0D8 )
% )
 ))
'*+	$((7:K0Ly0X01W< )
% )

 	 
dhhx(
dhhx(
 X\\-8
 -= >	

 #HLL$@
  *=!>
 #Dt+t%
 '1K(L
 )$((3O*P
 <"45
 b4 45
 +
  s<0!
" ,S1N-O#
$ ,S1N-O%
& ;)
 	33h K[

)

)
s   I*!I/AI4AI9c                p   g d}| D ]  }|j                  d|j                  d       d|j                  d       dd|j                  d       d	|j                  d
       d|j                  d       dd|j                  d       d	|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       dddg       |j                  d      xs g D ]  }dj                  d  |j                  d!      xs g D              xs d"}|j                  d#      xs |j                  d      xs d"}|j                  d$|j                  d%       d&|j                  d'       d(|j                  d)       d*| d+|j                  d,      xs d" d&|j                  d-      xs d" d.|j                  d/      xs d" d*| d0        |j                  d        d1j                  |      S )2N)z## Save Selector Opcode 0x24 Payload zSPayload/table evidence for the opcode 0x24 boundary after the current route writer.r   z## rf   z -> rN   r   z- opcode 0x24: `rg   z	` value `rh   z` handler `rj   `z- naive stop: `rd   rk   rp   z` in rq   z- pointer rows in window: rv   z&- code-like low bytes after boundary: rw   z(- data low-byte entries after boundary: rx   z- conclusion: ry   zE| va | value | kind | target | low byte | handler | refs to this va |z+| --- | --- | --- | --- | --- | --- | --- |ru   , c              3  f   K   | ])  }|j                  d        d|j                  d        + ywr0   :r1   Nrm   rR   refs     r   rT   zmarkdown.<locals>.<genexpr>   /     jC	 231SWWW5E4FGj   /1r7   -rV   z| `r1   z` | `r>   z` | r@   z | z | `rI   rJ   z` rK   z |
)extendrZ   joinr4   )r|   linesr]   rn   r7   rN   s         r   markdownr      s   E  #''(#$D):(;<sww78	#''J\B]A^^ijmjqjq  sI  kJ  jK  KL  Mcgg&9:;9SWWMcEdDeepqtqxqx  zT  rU  qV  V[  \_  \c  \c  d@  \A  [B  C(1B)C(DE4SWW=\5]4^_6sww?^7_6`aSWW\234S9
 	 GGL)/R 	D99jSWS[S[\bScSigijjqnqDXXm,I0BIcFLLdhhw'(dhhz.B-C4QWHXGYY\($txx5<= >HH23:s;2dhhG^>_>fcf=ggjkojpprt	 	R-. 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
t        j                  t        |j	                  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|j	                  d       dd|j	                  d       dd|j	                  d       ddt        j                  t        |j	                  d                   dddg
       |j	                  d       xs g D ]  }d!j                  d" |j	                  d#      xs g D              xs d$}|j	                  d%      xs |j	                  d      xs d$}|j                  d&t        j                  t        |j	                  d'                   d(t        j                  t        |j	                  d)                   d*t        j                  t        |j	                  d+                   d,t        j                  t        |             d-t        j                  t        |j	                  d.      xs d$             d(t        j                  t        |j	                  d/      xs d$             d0t        j                  t        |j	                  d1      xs d$             d,t        j                  |       d2        |j                  d3        d4j                  |      S )5N)zU<!doctype html><meta charset="utf-8"><title>Save Selector Opcode 0x24 Payload</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 Opcode 0x24 Payload</h1>zZ<p>Payload/table evidence for the opcode 0x24 boundary after the current route writer.</p>z<h2>rf   z -&gt; rN   z</h2>z<ul>z<li>opcode 0x24: <code>rg   z</code> value <code>rh   z</code> handler <code>rj   z</code></li>z<li>naive stop: <code>rd   rk   rp   z</code> in rq   z</li>z<li>pointer rows in window: rv   z(<li>code-like low bytes after boundary: rw   z*<li>data low-byte entries after boundary: rx   z<li>ry   z</ul>z<table><thead><tr><th>va</th><th>value</th><th>kind</th><th>target</th><th>low byte</th><th>handler</th><th>refs to this va</th></tr></thead><tbody>ru   r   c              3  f   K   | ])  }|j                  d        d|j                  d        + ywr   rm   r   s     r   rT   zhtml_page.<locals>.<genexpr>   r   r   r7   r   rV   z<tr><td><code>r1   z</code></td><td><code>r>   z</code></td><td>r@   z	</td><td>z</td><td><code>rI   rJ   z</code> rK   z
</td></tr>z</tbody></table>r   )r   htmlescapestrrZ   r   r4   )r|   partsr]   rn   r7   rN   s         r   	html_pager      s   E  )4;;s3778#4567wt{{3swwW_O`Ka?b>cchi%dkk#cggo6N2O&P%QQefjfqfqruvyv}v}  Q  wR  sS  gT  fU  Uk  lp  lw  lw  x{  |  |C  |C  DZ  |[  x\  l]  k^  ^j  k$T[[SWW=P5Q1R%S$TThimitituxy|  zA  zA  BX  zY  vZ  j[  i\  \r  sw  s~  s~  B  CF  CJ  CJ  Ke  Cf  g  sh  ri  it  uy  u@  u@  AD  EH  EL  EL  Mi  Ej  Ak  ul  tm  mr  s*3773D+E*FeL6sww?^7_6``ef8A`9a8bbgh4;;s377<#89:;5A c
 	 GGL)/R 	D99jSWS[S[\bScSigijjqnqDXXm,I0BIcFLL![[TXXg->)?@A B![[TXXj-A)BCD E{{3txx'7#89: ;{{3v;/0 1![[TXXl-C-Js)KLM N![[TXX6K-L-SPS)TUVV^_c_j_jknosowow  yP  pQ  pX  UX  lY  `Z  _[ [{{4() *
	 	'(7)8 99Ur   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok#save_selector_opcode24_payload.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)r|   out_dirs     r   write_outputsr      sD    MM$M.44@@

4eA6= A 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                         t        dt        |       d|j                  dz          y )	Nz--exezHwanse2.exe)typedefaultz	--out-dirzsave_selector_gate_paths.jsonzwrote z opcode 0x24 payload rows -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r%   
read_bytesr   r   r   printr"   )parserargsr|   s      r   mainr      s    $$&F
dD=4HI
$<D$,,!@@"ED $%	F3t9+:4<<Jo;o:p
qrr   __main__)r   r   r   r   returnr   )r   z
str | Noner   
int | None)r%   bytesr&   
list[dict]r'   r   r   r   )r   )
r%   r   r&   r   r   r   r5   r   r   r   )
r%   r   r&   r   r\   zdict[int, str]r'   r   r   dict)r%   r   r{   r   r   r   )r|   r   r   r   )r|   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	   r
   r   r   r   r   r   r)   r<   r`   r   r   r   r   r   __name__rQ   r   r   <module>r      s    P "     
   3tH~--/667 8 P P R H~''*
Ul8-4& F8vB#L
s zF r   