
    XLj7              	         d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZmZ  e
e      j-                         j.                  d	   Zed
z  Zedz  Zedz  ZdZdZdddddddddZdddddddZi ddd	d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAZ dJdBZ!dKdCZ"dLdDZ#dMdEZ$dNdFZ%dOdGZ&dPdHZ'e(dIk(  r e'        yy)Qa  Scan x86 absolute references into the status-comment backing block.

The short status-window comment selector is read through object+0xa8+0, with
object+0xa8 bound to 0x004576d8.  Prior reports proved the consumer but left the
writer for backing offset +0 unresolved.  This pass performs a narrow static
scan over .text for absolute memory operands that point anywhere inside the
0x004576d8 backing block, then classifies likely reads/writes.
    )annotationsN)Counterdefaultdict)Path)Any)find_functionfunction_rangeshx)offset_to_varead_sectionsva_to_offset   zHwanse2.exeoutwebivE r   zmov-al-from-moffs8zmov-eax-from-moffs32zmov-r8-from-memzmov-r32-from-memz
cmp-r8-memzcmp-r32-memz
cmp-mem-r8zcmp-mem-r32)            8   9   :   ;   zmov-moffs8-from-alzmov-moffs32-from-eaxzmov-mem-from-r8zmov-mem-from-r32zmov-mem8-imm8zmov-mem32-imm32)                  z
add-mem-r8zadd-mem-r32   z	or-mem-r8	   z
or-mem-r32   z
adc-mem-r8   zadc-mem-r32   z
sbb-mem-r8   zsbb-mem-r32    z
and-mem-r8!   zand-mem-r32(   z
sub-mem-r8)   zsub-mem-r320   z
xor-mem-r81   zxor-mem-r32   zgrp1-mem8-imm8   zgrp1-mem32-imm32   zgrp1-mem32-imm8zinc-dec-mem8z
grp5-mem32)      c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)values    1tools/build_status_comment_backing_writer_scan.pyhr9   I   s%    ;;U]r$GGE
$GG    c                \    | D ]  }|j                  d      |k(  s|c S  t        d|       )Nnamezmissing section )getRuntimeError)sectionsr<   sections      r8   section_by_namerA   M   s<     ;;v$&N )$0
11r:   c                .   |dk\  r:| |dz
     }|t         v rdt         |   |dz
  ddS |t        v rdt        |   |dz
  ddS |dk\  rK| |dz
     dk(  r@| |dz
     }|t         v rddt         |   z   |dz
  ddS |t        v rddt        |   z   |dz
  ddS |dk\  r| |dz
     }| |dz
     }|d	z  d
k(  rr|t         v rdt         |   |dz
  d|dddS |t        v rdt        |   |dz
  d|dddS |t        v r.|dz	  dz  }d}|dv r|dv rd}nd}|t        |   |dz
  d|d|ddS |dk\  rl| |dz
     dv rb| |dz
     }| |dz
     }|d	z  d
k(  rJt        | |      }|d   dk7  r6|dz
  |d<   d| |dz
     ddt	        |j                  dd            z   |d<   |S dddddS ) z@Classify a possible instruction whose disp32 begins at file_pos.r   readhigh)classificationmnemonicinstructionFileOffset
confidencewrite   f   z	prefix66-r      0x02x)rE   rF   rG   modrmHexrH         >   r/   r0   >   rJ   rP      rL   zindirect-control-read
read-writemedium)rE   rF   rG   rO   groupRegrH   >   rK         rE   unclassifiedrG   prefix-rF   r2   Nlow)READ_OPS	WRITE_OPSRMW_OPSclassify_atr6   r=   )exefile_posopmodrmregrE   bases          r8   r_   r_   T   s    1}A>"($RL)1A$	  ?")%bM)1A$	  1}X\*d2A>"('(2,6)1A$	  ?")')B-7)1A$	  1}AHqL!DLT!X~&, (-5\"$U3K 0"(  Y&- )"-5\"$U3K 0"(  W}zQ&!'%#*=%<N%1N&4 '-5\"$U3K 0 #"*  1}X\*.@@AHqL!DLT!sH-D$%7081,-%+C1,=c+B!#Ds488T^`bKcGd#dZ (!%	 r:   c                   t        |d      }t        |d         }|t        |d         z   }t        | |      }g }t        t              D ]  }t
        |z   }t        j                  d|      }	| j                  |	||      }
|
dk7  s<t        ||
      }t        | |
      }|j                  d      }t        |t              rt        ||      nd }t        ||xs |xs d      }|j                  |t        |d      t        |      t        |      t        |      |rt        t        |d	               nd
|rt        t        |d               nd
|d   |j                  dd
      |j                  dd      |j                  dd
      |j                  d      | t!        ||
dz
        t#        ||
dz          j%                  d      d       | j                  |	|
dz   |      }
|
dk7  r\ |S )Nz.textrawraw_sizez<IrG   r   rJ   startVar2   endVarE   rF   rH   r[   rO   rU   r        )offset	offsetHex
addressHexrefVaHexinstructionVaHexfunctionVaHexfunctionEndVaHexrE   rF   rH   rO   rU   
contextHexr   )rA   intr	   rangeBACKING_SIZEBACKING_BASEstructpackfindr   r_   r=   
isinstancer   appendr
   maxminhex)r`   r?   text
text_starttext_end	functionsrowsrn   addrneedleposref_vaclsinst_offinst_vafunctions                   r8   	scan_refsr      s   8W-DT%[!JCZ 011HX.I!#D% 6f$T4(hhvz84Ri!(C0Fc3'Cww67H:DXs:Sl8X6Y]G$Y0F60FQGHKK$!#FA"$T( "6
(*7EMRHY,?(@%ASUFN3x/@+A(BTV&)*:&; #
B 7"%'',"> #
B 7 #
 3"%c*cAg&>XsUWxAX"Y"]"]^a"b" ((637H5C/ Ri	68 Kr:   c                 J   t         j                         } t        |       }t        | |      }t	        t
              }|D ]  }||d      j                  |        g }t        |j                         d       D ]y  \  }}t        d |D              |j                  ||d   d   t        |      t              t        fddD              t        |D ch c]  }|d	   s	|d	    c}      d
       { |j                  dg       }|D cg c]  }|d   dv s| }	}|D cg c]  }|d   dkD  s| }
}t        t              t         t        |      t        |      t        |
      t        |      t        |	      t        |	      dkD  dd	}ddd|||
||dS c c}w c c}w c c}w )Nro   c                     t        | d   d      S )Nr   r"   )rv   )items    r8   <lambda>zbuild.<locals>.<lambda>   s    s4PQ7TVGW r:   )keyc              3  &   K   | ]	  }|d      yw)rE   N .0rows     r8   	<genexpr>zbuild.<locals>.<genexpr>   s     ?3-.?s   r   rp   c              3  B   K   | ]  }j                  |d         yw)r   N)r=   )r   kindcountss     r8   r   zbuild.<locals>.<genexpr>   s     %^dfjjq&9%^s   )rI   rS   rs   )ro   rp   refCountclassificationCountswriteLikeCountr   0x00rE   >   rI   rS   r   zNo direct absolute write to backing offset +0 was found. The exact selector byte still appears to be supplied through a VM/object base path rather than a simple x86 absolute store.)	backingBlockVaHexbackingBlockSizeBytesabsoluteTextRefCountreferencedOffsetCountwriteLikeOffsetCountoffset0RefCountoffset0WriteLikeCountoffset0WriterProvendecisionr   z)hwanse-status-comment-backing-writer-scanz1tools/build_status_comment_backing_writer_scan.py)versionr   sourcesummaryoffsetSummarieswriterOffsetSummariesoffset0Refsrefs)EXE
read_bytesr   r   r   listr~   sorteditemsr   lendictsumr=   r
   ry   rx   )r`   r?   r   	by_offsetr   offset_summaries
offset_hexr   offset0_refsoffset0_write_likewriter_offsetsr   r   s               @r8   buildr      s   
..
CS!HS(#D1<T1BI 0#k"#**3/0"9??#4:WX 

D?$??'"1gl3I(,V"%%^F]%^"^#T$bcSQ`MaS%9$bc		

 ==,L#s+;'<@W'W  (3/?+@1+DN   -!- #D	!$%5!6 #N 3|,!$%7!8"#56:JG ;E+!/#	 	1 %cs$   
FF
FF!F /F c                6   | d   }dj                  d |j                         D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d	   D              }d
t        |d          d| d| d| d| dS )Nr   r2   c              3  b   K   | ]'  \  }}|d k7  rdt        |       dt        |       d ) yw)r   z<div class='card'><b>z
</b><span>z</span></div>Nr9   )r   kvs      r8   r   zrender_html.<locals>.<genexpr>
  s:      Aq
?  !vZ!v]Cs   -/c              3     K   | ]s  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          dt        d	j                  |d
   dd              d u yw)<tr><td>ro   </td><td><code>rp   </code></td><td>r   	</td><td>r   r   , r   Nr    
</td></tr>r9   joinr   s     r8   r   zrender_html.<locals>.<genexpr>  s      
 	[!"# $s<()* +Z!" #%&'( )+,-. /3{+BQ/012 3	
s   A9A;r   c              3     K   | ]a  }d t        |d          dt        |d          dt        |d          dt        |d          dt        dj                  |d	                d
 c yw)r   ro   r   rp   r   r   r   r   r   r   r   Nr   r   s     r8   r   zrender_html.<locals>.<genexpr>  s      	 	[!"# $s<()* +%&'( )+,-. /3{+,-. /		   A'A)r   c              3     K   | ]a  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          d	t        |d
          d c yw)z<tr><td><code>rq   z</code></td><td><code>rr   rs   r   rE   r   rF   r   ru   z</code></td></tr>Nr   r   s     r8   r   zrender_html.<locals>.<genexpr>$  s      
 	s:'( )s-./0 1s?+,- .%&'( )Z!" #s<()* +	
r   r   u9  <!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Status Comment Backing Writer Scan</title>
<style>
  :root { --bg:#f6f7f9; --panel:#fff; --line:#d8dee8; --text:#20242b; --muted:#687080; --bad:#a33b2d; }
  * { box-sizing:border-box; }
  body { margin:0; background:var(--bg); color:var(--text); font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
  main { width:min(1180px, calc(100vw - 28px)); margin:0 auto; padding:24px 0 40px; }
  h1 { margin:0 0 6px; font-size:28px; }
  h2 { margin:22px 0 8px; font-size:18px; }
  p { margin:0; line-height:1.45; }
  .lead { color:var(--muted); }
  .decision { margin:14px 0; padding:12px; border:1px solid #efc3bb; background:#fff5f3; border-radius:8px; }
  .cards { display:grid; grid-template-columns:repeat(auto-fit,minmax(170px,1fr)); gap:10px; margin:16px 0; }
  .card,section { background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:12px; }
  .card b { display:block; color:var(--muted); font-size:12px; }
  .card span { display:block; margin-top:4px; font-weight:700; overflow-wrap:anywhere; }
  table { width:100%; border-collapse:collapse; font-size:13px; }
  th,td { border-top:1px solid var(--line); padding:7px; text-align:left; vertical-align:top; }
  th { color:var(--muted); font-size:12px; }
  code { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; white-space:pre-wrap; }
  @media (max-width:760px) { main { width:min(100vw - 18px,1180px); padding-top:16px; } table { display:block; overflow-x:auto; white-space:nowrap; } }
</style>
<main>
  <h1>Status Comment Backing Writer Scan</h1>
  <p class="lead">0x004576d8 상태창 문구 backing block 전체에 대한 .text 절대주소 read/write 스캔입니다.</p>
  <div class="decision"><b>결론:</b> r   z</div>
  <div class="cards">z</div>
  <section>
    <h2>Writer-Like Offsets</h2>
    <table><thead><tr><th>offset</th><th>address</th><th>write-like refs</th><th>classifications</th><th>functions</th></tr></thead><tbody>z</tbody></table>
  </section>
  <section>
    <h2>Offset +0 References</h2>
    <table><thead><tr><th>ref</th><th>instruction</th><th>function</th><th>class</th><th>mnemonic</th><th>context</th></tr></thead><tbody>z</tbody></table>
  </section>
  <section>
    <h2>All Referenced Offsets</h2>
    <table><thead><tr><th>offset</th><th>address</th><th>refs</th><th>write-like</th><th>classes</th><th>functions</th></tr></thead><tbody>z&</tbody></table>
  </section>
</main>
)r   r   r9   )datascardsoffset_rowswriter_rowsoffset0_rowss         r8   render_htmlr     s	   YAGG GGI E
 '' 
 )*
 
K '' 	 /0	 	K 77 
 &
 
L(6 )*!J-(8'9 :W L MX  LY YK LX  KY YL MX  LY YO* *r:   c                 P   t         j                  d       t        j                  d       t               } t         dz  j	                  t        j                  | dd      d       t        d	z  j	                  t        |       d       | d
   }t        d|d    d|d    d       y )NT)exist_okz'status_comment_backing_writer_scan.jsonF),:)ensure_ascii
separatorszutf-8)encodingz'status_comment_backing_writer_scan.htmlr   z/wrote status comment backing writer scan (refs=r   z, offset0_write=r   ))	OUTmkdirWEBr   
write_textjsondumpsr   print)r   r   s     r8   mainr   \  s    IItIIItI7D44@@

4e
C A  	44@@D A  	YA		)*++;A>U<V;WWX	Zr:   __main__)r7   r   returnr6   )r?   list[dict[str, Any]]r<   r6   r   dict[str, Any])r`   bytesra   rv   r   r   )r`   r   r?   r   r   r   )r   r   )r   r   r   r6   )r   None))__doc__
__future__r   r4   r   rz   collectionsr   r   pathlibr   typingr   %build_hud_menu_opener_frontier_reviewr   r	   r
   probe_exe_scene_tablesr   r   r   __file__resolveparentsROOTr   r   r   ry   rx   r\   r]   r^   r9   rA   r_   r   r   r   r   __name__r   r:   r8   <module>r      s   #    ,   T T L L H~''*
]
Ul
Ul 
 





	 
 



	,- 	+ 	,	
 	, 	- 	, 	- 	, 	- 	, 	- 	, 	- 	
  	
!" 	
#$ 
'.H2Wt"J2jQh& zF r:   