
    UHj2,                       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mZmZ  e	e      j                         j(                  d   Zedz  ZdZd	Zd
Zddd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"d(dZ#d)dZ$d*dZ%d*dZ&efd+dZ'd,dZ(e)dk(  r e(        yy)-zLFind raw event/object VM stream candidates for branch-state writer handlers.    )annotationsN)Path)find_cns_stringsread_sectionsva_to_offset   outiG iA iͶA zobject/stat comparison groupzparty/object condition groupzsix-slot object condition groupz#list selection initialization group)%   &   '   1   c                    d| dS )N0x08x )values    R/home/exedev/hwanse/tools/summarize_event_object_branch_state_stream_candidates.pyhex32r      s    c{    c                L    | D ]  }|d   |cxk  r|d   |d   z   k  s|c S  ! y )Nvaraw_sizer   )sectionsr   sections      r   section_for_var   "   s@     4=BD1D!DDN E r   c                L    | D ]  }|d   |cxk  r|d   |d   z   k  s|c S  ! y )Nrawr   r   r   offsetr   s      r   section_for_offsetr    )   s@     5>VJgenwz7J&JJN K r   c                d    |dk  s|dz   t        |       kD  ry t        j                  d| |      d   S )Nr      <I)lenstructunpack_from)exer   s     r   dword_at_offsetr(   0   s5    zVaZ#c(*dC033r   c                <    t        | |      }|y |d   |z   |d   z
  S )Nr   r   )r    r   s      r   va_for_offsetr*   6   s.     62G4=6!GEN22r   c                B    t        ||      }|y t        |      |d   dS )Nname)targetVaHextargetSection)r   r   )r'   r   r   r   s       r   pointer_targetr/   =   s)    Xu-G <'&/JJr   c           	     V   t        d||z
        }t        t        |       dz
  ||z         }g }t               }t	        ||dz   d      D ]_  }	t        | |	      }
|
|vr|	|
f}||v r|j                  |       |j                  t        t        ||	      xs d      ||
   |	|z
  d       a |S )Nr   r"   r   )refVaHexr,   distance)
maxminr$   setranger(   addappendr   r*   )r'   r   stringsr   radiusstartendrowsseenoffr   keys               r   linked_cns_nearrA   D   s     6F?#E
c#hlFVO
,CD5DUC!GQ' S)El$;mHc:?a@ENf
 	 Kr   c                    t        j                  d|      }d}d}	 | j                  ||      }|dk  r|S |dz   }t        ||      |dz  }0)Nr#   r   r   )r%   packfindr    )r'   r   targetneedlecountsearchhits          r   pointer_ref_countrJ   _   s_    [[v&FEF
hhvv&7Lqh,8QJE r   c                H   t        ||      }||dz  z
  }t        | |      }t        | |      }|dkD  r| |dz
     nd }|dz   t        |       k  r| |dz      nd }	|t        | ||      nd }
|t        | ||      nd }|dz  dk(  r|rd}d}n|dk(  rd}d	}n|	d
v rd}d}nd}d}t	        |xs d      d|dd|dt
        |   |dz  |d|dnd |	d|	dnd t	        t        ||      xs d      |t	        |      nd |
|t	        |      nd ||t        | ||xs d      nd||dS )Nr"   r   r      z4aligned pointer bytes, likely data not command startlow   zKembedded after 0x10 prefix; possible operand overlap, needs VM length proofweak>   r   r   rL      r"   zEraw 0x40-index byte pair in data; possible event/object command startmediumz0raw byte overlap in data; unproven command startr   06x02x)vaHexfileOffsetHexindexHexhandlerLabel
offsetMod4precedingByteHexfollowingByteHexalignedDwordVaHexalignedDwordHexalignedDwordPointercurrentDwordHexcurrentDwordPointerpointerRefCountclassification
confidence)r*   r(   r$   r/   r   BRANCH_STATE_HANDLER_INDEXESrJ   )r'   r   r   indexr   aligned_offaligned_valuecurrent_value	preceding	followingaligned_pointercurrent_pointerra   rb   s                 r   classify_candidaterl   l   s   	x	(BFQJ'K#C5M#C0M#)A:FQJ4I#)A:C#8FQJdIFSF_nS(MBeiOFSF_nS(MBeiOzQ?O
	d	f
	4	4`
K
rwQfS\*s$4U;qj4=4Ib30t4=4Ib30t"=;#G#L1M3@3L5/RV.3@3L5/RV.HJ,S(BG!D\](  r   c                   t        |       }t        | |      }g }|D ]  }|d   dvr|d   }| |||d   z    }t        D ]l  }t        d|g      }d}		 |j	                  ||	      }
|
dk  r+|
dz   }	||
z   }t        | |||      }|d   |d<   t        | |||      |d	<   |j                  |       [  |j                  d
        i }i }|D ]>  }|j                  |d   d      dz   ||d   <   |j                  |d   d      dz   ||d   <   @ dt        t              t        t              t        t              ddt        |      ||d|dS )Nr,   >   .data.rdatar   r   @   r   r   r   	nearbyCnsc                    | d   | d   fS )NrV   rT   r   )rows    r   <lambda>zbuild_summary.<locals>.<lambda>   s    S_c'l$C r   )r@   rV   rb   zRraw .data/.rdata byte pairs that could dispatch branch-state event/object handlerszLstream byte0 must be 0x40; stream byte1 indexes dword [byte1*4 + 0x0047f1d8])dispatcherVaHexdispatchCallVaHexhandlerTableVaHexdispatchRulea#  Raw 0x40-index byte pairs exist for branch-state writer handlers, but many are embedded in pointers or operands. This report separates byte overlap from command-start evidence; none of these rows alone proves that selector root 2:0 executes a branch-state writer before the current frontier.)scopeeventObjectDispatchercandidateCountcandidateCountsByIndexcandidateCountsByConfidence
conclusion
candidates)r   r   rc   bytesrD   rl   rA   r8   sortgetr   EVENT_DISPATCHER_VAEVENT_DISPATCH_CALL_VAEVENT_HANDLER_TABLE_VAr$   )r'   r   r9   r   r   	raw_startr   rd   patternrH   rI   r   rs   by_indexby_confidences                  r   build_summaryr      s   S!HsH-GJ '6?"55EN	)Y)<<=1 	'ET5M*GFhhw/7q"S(hF!(I#23'6#RK !!#& 	''$ OOCODHM W$,LLZ!$Dq$HZ!+8+<+<S=NPQ+RUV+Vc,'(W f$%89!&'=!>!&'=!>j	"
 j/"*'4J !! r   c                   ddddd| d   d    dd| d   d	    dd
| d   d    dd| d    d| d   dddg}| d   D ]j  }dj                  d |j                  d      xs g D              xs d}|j                  d|d    d|d    d|d    d|d    d|d    d|d     d!| d"       l |j                  d       d#j                  |      S )$Nz-# Event/Object Branch State Stream Candidates z`Raw `0x40 xx` byte-pair candidates for event/object VM handlers that write `primaryBranchState`.z- dispatcher: `rz   ru   `z- dispatch call: `rv   z- handler table: `rw   z- candidates: r{   r~   zI| va | index | confidence | classification | aligned dword | nearby CNS |z%| --- | --- | --- | --- | --- | --- |r   z, c              3  &   K   | ]	  }|d      ywr,   Nr   .0items     r   	<genexpr>zmarkdown.<locals>.<genexpr>   s     LVLs   rq   -z| `rT   z` | `rV   z` rW   z | rb   ra   z | `r\   z` | z |
)joinr   r8   )summarylinesrs   cnss       r   markdownr      sH   7
j

'"9:;LMNaP
W%<=>QRSSTU
W%<=>QRSSTU
!1234

S/E |$ 
iiL1E1KLLSPS#g,uS_$5RN8K7LCPST`PaObbe#$%T#.?*@)AcU"N	

 
LL99Ur   c                B   g }| d   D ]  }dj                  d |j                  d      xs g 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                  |j                  d      xs d       d| d        dj                  ddddddddddddd d!d"d#d$t        j                  | d%   d&          d't        j                  | d%   d(          d)t        j                  | d%   d*          d+d,t        j                  | d-          d.d/d0d1j                  |       d2d3d4d1g      S )5Nr   z<br>c              3  L   K   | ]  }t        j                  |d            ywr   )htmlescaper   s     r   r   zhtml_page.<locals>.<genexpr>   s     [$++d6l3[s   "$rq   r   z<tr><td><code>rT   z</code></td><td><code>rV   z</code><br>rW   z	</td><td>rb   ra   z</td><td><code>r\   z</code></td><td>z
</td></tr>r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z<  <title>Event/Object Branch State Stream Candidates</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin-bottom: 24px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z    th { background: #1d1d1d; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z6  <h1>Event/Object Branch State Stream Candidates</h1>z  <p>Dispatcher: <code>rz   ru   z</code>, call <code>rv   z</code>, table <code>rw   z</code>.</p>z  <p>r~   z</p>z  <table><thead><tr><th>va</th><th>index</th><th>confidence</th><th>classification</th><th>aligned dword</th><th>nearby CNS</th></tr></thead>z	  <tbody>r   z</tbody></table>z</body>z</html>)r   r   r8   r   r   )r   r=   rs   r   s       r   	html_pager      s   D|$ 
kk[@T@ZXZ[[b_bS\23 4S_56k$++cR`NaBbAc d;;s<012 3;;s#3456 7SWW->%?%F3GH I% 		

 99"PFhTW)&@
!$++g6M.NO`.a"b!c dkk'*A"BCV"WXY Z{{7+B#CDW#XYZZf	h GL12348 	X
BGGDM?"23
3  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok0event_object_branch_state_stream_candidates.jsonF),:)ensure_ascii
separatorsr   zutf-8)encoding)mkdir
write_textjsondumps)r   out_dirs     r   write_outputsr   	  sD    MM$M.AAMM

7:FM N r   c                 v   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz	--out-dirz5wrote event/object branch-state stream candidates -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r'   
read_bytesr   r   print)parserargsr   s      r   mainr     s    $$9F
dD=4HI
$<DDHH//12G'4<<(	A$,,  RD  CD  BE  F  Gr   __main__)r   intreturnstr)r   
list[dict]r   r   r   dict | None)r   r   r   r   r   r   )r'   r   r   r   r   
int | None)r   r   r   r   r   r   )r'   r   r   r   r   r   r   r   )   )r'   r   r   r   r9   zdict[int, str]r   r   r:   r   r   r   )r'   r   r   r   rE   r   r   r   )
r'   r   r   r   r   r   rd   r   r   dict)r'   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )*r   
__future__r   r   r   r   r%   syspathlibr   pathinsertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   r   r   r   r   rc   r   r   r    r(   r*   r/   rA   rJ   rl   r   r   r   r   r   __name__r   r   r   <module>r      s<   R "     
  3tH~--/667 8 P P H~''*
Ul#   # 
(
(
+
/	  43K 	  	
  6
%P-`4(V 25 G zF r   