§
    A}£j0J  ã                   óÞ  — d 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Z ee¦  «         	                    ¦   «         j
        j
        Zej                             d eedz  dz  ¦  «        ¦  «         ddlZedz  dz  ZdZg d	¢Zd
Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zedz  dz  Zej                             d ee¦  «        ¦  «         ddlZedz  dz  dz  dz  ZdZd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'dS )u
  
AutoPOE2 - Kiá»ƒm thá»­ há»“i quy cho RE Pipeline & INV-BUILD-01 (Rule 11, 14)

Cháº¡y 100% á»Ÿ User Mode: KHÃ”NG cáº§n quyá»�n Admin, KHÃ”NG cáº§n game Ä‘ang cháº¡y.

CÃ¡c báº¥t biáº¿n Ä‘Æ°á»£c khÃ³a cháº·n:
  INV-BUILD-01  : tri thá»©c offset pháº£i khÃ³a theo build fingerprint cá»§a client.
                  TÃ¡i hiá»‡n sá»± cá»‘ tháº­t 10/09/2026: .data dá»‹ch -0x1000 giá»¯a hai build
                  (.text VSize 0x2E840BE -> 0x2E83B6E) lÃ m 8 static root RVA hardcode
                  lá»‡ch hoÃ n toÃ n vÃ  cáº£ 4 AOB pattern [MISS].
  CROSS-TIER    : SectionLayoutHash cá»§a táº§ng Python PHáº¢I khá»›p byte-for-byte vá»›i
                  C++ ClientBuildId::SectionLayoutHash() (Rule 10 - zero drift).
                  GiÃ¡ trá»‹ C++ Ä‘o Ä‘Æ°á»£c trong phiÃªn 10/09/2026: 0x5c4322f5cdc0551a
                  (stdout cá»§a AutoPOE2_Tests.exe, Test 60).
  AUTHENTIC DATA: má»�i sá»‘ liá»‡u Ä‘á»‘i chiáº¿u Ä‘á»�u láº¥y tá»« tá»‡p PE tháº­t / build record tháº­t,
                  khÃ´ng dÃ¹ng dá»¯ liá»‡u tá»± cháº¿.
é    N)ÚPathÚtoolsÚre_pipelineÚdataÚbuildsÚ0x5C4322F5CDC0551A))ú.texté   i¾@èé   `)z.rdatai `èi¦Ã· i@  @)ú.datai 0 iÜcÑ l   @    i ÐÉTc           
      óÜ   — t          j        |t           j        t          |¦  «        | |¬¦  «        }|D ]8\  }}}}|j                             t          j        |||||¬¦  «        ¦  «         Œ9|S )u\   Dá»±ng ClientBuildId tá»« sá»‘ liá»‡u section (dÃ¹ng sá»‘ liá»‡u THáº¬T, khÃ´ng tá»± cháº¿).)ÚvalidÚmachineÚnumber_of_sectionsÚtime_date_stampÚsize_of_image)ÚnameÚvirtual_addressÚvirtual_sizeÚraw_sizeÚcharacteristics)ÚfpÚClientBuildIdÚIMAGE_FILE_MACHINE_AMD64ÚlenÚsectionsÚappendÚSectionInfo)	Ústampr   r   r   Úbuildr   ÚvaÚvsizeÚcharss	            ú.C:\Projects\AutoPOE2\tests\test_re_pipeline.pyÚ_make_buildr%   /   s”   € åÔØÝÔ+Ý˜x™=œ=ØØ#ðñ ô €Eð #+ð 	
ð 	
Ñˆˆb�%˜ØŒ×ÒÝŒNØØ "Ø"ØØ %ðñ ô ñ	
ô 	
ð 	
ð 	
ð €Ló    c                  óø   — t          j        t           j        d¦  «        t           j        k    sJ ‚t          j        t           j        d¦  «        dk    sJ ‚t          j        t           j        d¦  «        dk    sJ ‚dS )uE   FNV-1a 64-bit pháº£i Ä‘Ãºng vá»›i giÃ¡ trá»‹ chuáº©n Ä‘Ã£ cÃ´ng bá»‘.r&   ó   al   Œl2q{
 s   foobarl   ègrnÇ¢, N©r   Úfnv1aÚFNV_OFFSET_BASIS© r&   r$   Útest_fnv1a_known_answerr-   E   sm   € åŒ8•BÔ'¨Ñ-Ô-µÔ1DÒDÐDÐDÐDåŒ8•BÔ'¨Ñ.Ô.Ð2DÒDÐDÐDÐDåŒ8•BÔ'¨Ñ3Ô3Ð7IÒIÐIÐIÐIÐIÐIr&   c                  ól   — t          j        t           j        ddz  ¦  «        } d| cxk    rdk    sn J ‚dS )uB   BÄƒm khÃ´ng Ä‘Æ°á»£c trÃ n khá»�i 64-bit (chá»‘t cháº·n overflow).ó   xi'  r   l   ÿÿÿÿ Nr)   )Úresults    r$   Útest_fnv1a_stays_within_uint64r1   N   sF   € åŒX•bÔ)¨4°%©<Ñ8Ô8€FØ�Ð,Ð,Ò,Ð,Ð,Ò,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r&   c                  óŠ   — t          j        t          d¦  «        ¦  «        } | j        du sJ ‚| j        sJ ‚| j        g k    sJ ‚dS )uP   Tá»‡p khÃ´ng tá»“n táº¡i pháº£i tháº¥t báº¡i an toÃ n, khÃ´ng nÃ©m ngoáº¡i lá»‡.zZ:/khong_ton_tai/fake.exeFN)r   Úload_pe_headersr   r   Úerrorr   )r    s    r$   Ú)test_load_pe_headers_missing_file_is_safer5   T   sT   € åÔ�tÐ$?Ñ@Ô@ÑAÔA€EØŒ;˜%ÐÐÐÐØŒ;ÐÐˆ;ØŒ>˜RÒÐÐÐÐÐr&   c                 óŽ   — | dz  }|                      d¦  «         t          j        |¦  «        }|j        du sJ ‚d|j        v sJ ‚dS )uD   Tá»‡p rÃ¡c khÃ´ng pháº£i PE pháº£i bá»‹ tá»« chá»‘i (magic != 'MZ').zjunk.bins                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   FÚMZN)Úwrite_bytesr   r3   r   r4   )Útmp_pathÚjunkr    s      r$   Ú#test_load_pe_headers_rejects_non_per;   \   s\   € à�jÑ €DØ×Ò�^Ñ$Ô$Ð$ÝÔ˜tÑ$Ô$€EØŒ;˜%ÐÐÐÐØ�5”;ÐÐÐÐÐÐr&   c                  ó¦   — t          t          j        dd¦  «        ¦  «        dk    sJ ‚t          t          j        dd¦  «        ¦  «        dk    sJ ‚dS )uQ   Ä�áº£m báº£o Ä‘á»‹nh dáº¡ng pack dÃ¹ng cho hash khá»›p kÃ­ch thÆ°á»›c kiá»ƒu C++.z<Hé   é   z<Ié ÀÉé   N)r   ÚstructÚpackr,   r&   r$   Ú&test_struct_packing_matches_cpp_layoutrC   e   sR   € å�vŒ{˜4 Ñ#Ô#Ñ$Ô$¨Ò)Ð)Ð)Ð)Ý�vŒ{˜4 Ñ+Ô+Ñ,Ô,°Ò1Ð1Ð1Ð1Ð1Ð1r&   Úre_outÚSMOKEúextraction.json)	Úplayer_addrÚxyz_addrÚshield_addrÚ	mana_addrÚspirit_addrÚingame_addrÚterrain_addrÚcamera_addrÚfog_density_addrc                 ób  ‡‡— t                                ¦   «         st          j        d¦  «         | dz  }| dz  }t	          j        t           ||¦  «        }|dk    s
J d¦   «         ‚|                     ¦   «         s
J d¦   «         ‚|                     ¦   «         s
J d¦   «         ‚|                     d¬	¦  «        }d
|v sJ ‚d|v sJ ‚|                     ¦   «         D ]_}|                     d¦  «        d          	                    ¦   «         }t          D ](}|                     |dz   ¦  «        rJ d|› d�¦   «         ‚Œ)Œ`t          j        t                                d¬	¦  «        ¦  «        }t          t          |d         d         ¦  «        d¦  «        Št          t          |d         d         ¦  «        d¦  «        Šˆˆfd„|d         d         D ¦   «         }	|	s
J d¦   «         ‚|	D ]}
|
|v sJ d|
› �¦   «         ‚Œt!          j        t          |¦  «        ¦  «        }	 |                     d¦  «                             ¦   «         }|s
J d¦   «         ‚|d         \  }}|t)          |	¦  «        k    s
J d¦   «         ‚|                     d¦  «                             ¦   «         d         }|dk    s
J d¦   «         ‚|                     d|f¦  «                             ¦   «         }|rt)          |d         d         ¦  «        dk    s
J d ¦   «         ‚	 |                     ¦   «          d!S # |                     ¦   «          w xY w)"u_  VÃ²ng Ä‘á»�i Ä‘áº§y Ä‘á»§: extraction.json -> SQLite + TOML build-keyed.

    Chá»©ng minh 3 invariant trÃªn ARTEFACT THáº¬T do pipeline sinh ra:
      INV-SIG-UNIQUE  : chá»‰ signature match_count==1 vÃ o registry
      INV-BUILD-01    : TOML pháº£i gáº¯n khÃ³a build fingerprint
      INV-OFFSET-01   : khÃ´ng cÃ³ khÃ³a heap tuyá»‡t Ä‘á»‘i nÃ o
    uD   ChÆ°a cÃ³ smoke extraction (cháº¡y re_extract.py --exe ... trÆ°á»›c)úpoe2_offsets.dbzoffsets_TEST.tomlr   u"   build_registry pháº£i thÃ nh cÃ´ngu$   Pháº£i sinh Ä‘Æ°á»£c SQLite registryu"   Pháº£i sinh Ä‘Æ°á»£c TOML registryúutf-8©Úencodingzbuild_time_date_stamp = 0xzbuild_section_layout_hash = 0xú#ú u   INV-OFFSET-01 VI PHáº M: 'u#   ' xuáº¥t hiá»‡n trong registry TOMLr0   Ú
image_baseé   Ú
provenancer   c                 óv   •— g | ]5}|                      d ¦  «        ¯t          j        |‰‰¦  «        ¯-|d         ‘Œ6S )ÚuniqueÚ	signature©ÚgetÚbrÚis_in_image_data_slot©Ú.0ÚcrW   r   s     €€r$   ú
<listcomp>z2test_build_registry_end_to_end.<locals>.<listcomp>Ÿ   sV   ø€ ð ð ð àØ�5Š5�‰?Œ?ðõ  "Ô7¸¸:À}ÑUÔUðØ	ˆ+Œðð ð r&   Ú
candidatesu9   Smoke extraction pháº£i cÃ³ Ã­t nháº¥t 1 signature uniqueu(   Signature unique bá»‹ máº¥t trong TOML: z;SELECT build_id, COUNT(*) FROM signatures GROUP BY build_idu4   SQLite pháº£i cÃ³ Ã­t nháº¥t 1 build vá»›i signatureu0   Sá»‘ signature trong DB pháº£i khá»›p extractionzHSELECT COUNT(*) FROM signatures WHERE unique_ok != 1 OR match_count != 1u4   INV-SIG-UNIQUE: má»�i record pháº£i match_count == 1z1SELECT file_sha256 FROM builds WHERE build_id = ?é@   u,   Build record pháº£i cÃ³ SHA-256 Ä‘áº§y Ä‘á»§N)ÚSMOKE_EXTRACTIONÚis_fileÚpytestÚskipr_   Úbuild_registryÚ	read_textÚ
splitlinesÚsplitÚstripÚFORBIDDEN_KEYSÚ
startswithÚjsonÚloadsÚintÚstrÚsqlite3ÚconnectÚexecuteÚfetchallr   ÚfetchoneÚclose)r9   ÚdbÚtomlÚrcÚcontentÚlineÚstrippedÚ	forbiddenÚpayloadÚunique_sigsr\   ÚconnÚrowsÚbuild_idÚ	sig_countÚbadr   rW   r   s                    @@r$   Útest_build_registry_end_to_endrŠ   z   sŒ  øø€ õ ×#Ò#Ñ%Ô%ð \ÝŒÐZÑ[Ô[Ð[à	Ð%Ñ	%€BØÐ)Ñ)€Då	Ô	Õ+¨R°Ñ	6Ô	6€BØ�Š7ˆ7ˆ7Ð8‰7Œ7ˆ7Ø�:Š:‰<Œ<Ð?Ð?Ð?Ñ?Ô?ˆ<Ø�<Š<‰>Œ>Ð?Ð?Ð?Ñ?Ô?ˆ>à�nŠn gˆnÑ.Ô.€Gð (¨7Ð2Ð2Ð2Ð2Ø+¨wÐ6Ð6Ð6Ð6ð ×"Ò"Ñ$Ô$ð ð ˆØ—:’:˜c‘?”? 1Ô%×+Ò+Ñ-Ô-ˆÝ'ð 	ð 	ˆIØ×*Ò*¨9°s©?Ñ;Ô;ð ð Ø[¨YÐ[Ð[Ð[ñô Ð;ð ð	õ ŒjÕ)×3Ò3¸WÐ3ÑEÔEÑFÔF€GÝ•S˜ Ô*¨<Ô8Ñ9Ô9¸2Ñ>Ô>€JÝ�˜G LÔ1°/ÔBÑCÔCÀRÑHÔH€Mðð ð ð ð à˜Ô" <Ô0ðñ ô €Kð
 ÐSÐSÐSÑSÔSˆ;Ø ð \ð \ˆ	Ø˜GÐ#Ð#Ð#Ð%[ÐPYÐ%[Ð%[Ñ#Ô#Ð#Ð#õ Œ?�3˜r™7œ7Ñ#Ô#€DðØ�|Š|ØIñ
ô 
ç
Š(‰*Œ*ð 	ð ÐKÐKÐKÑKÔKˆtØ" 1œgÑˆ�)Ø�C Ñ,Ô,Ò,Ð,Ð,Ð.`Ñ,Ô,Ð,Ø�lŠlØVñ
ô 
ç
Š(‰*Œ*�Qôˆð �aŠxˆxˆxÐO‰xŒxˆxØ—’ÐQÐT\ÐS^Ñ_Ô_×hÒhÑjÔjˆØÐa�#˜f Qœi¨œlÑ+Ô+¨rÒ1Ð1Ð1Ð3aÑ1Ô1Ð1Ð1à�
Š
‰Œˆˆˆøˆ�
Š
‰Œˆˆøøøs   ÈC,L ÌL.c                  ó²  — t          d¦  «        } |                      ¦   «         st          j        d¦  «         t	          j        | ¦  «        }|j        sJ d|j        › �¦   «         ‚|j        t          j	        k    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|j        |                      ¦   «         j        k    sJ ‚|                     d¦  «        }|€J ‚|j        du sJ ‚|j        d	u sJ ‚|                     d
¦  «        �J ‚t	          j        | ¦  «        }|                     |¦  «        sJ ‚|                     ¦   «         |                     ¦   «         k    sJ ‚dS )uV   Parse má»™t PE THáº¬T luÃ´n cÃ³ trÃªn Windows (khÃ´ng cáº§n game, khÃ´ng cáº§n Admin).zC:\Windows\System32\notepad.exeu.   notepad.exe khÃ´ng cÃ³ trÃªn há»‡ thá»‘ng nÃ yu    Parse notepad.exe tháº¥t báº¡i: é   r   r	   NTFz	.khongton)r   rh   ri   rj   r   r3   r   r4   r   r   r   r   Ú	file_sizeÚstatÚst_sizeÚfind_sectionÚ
executableÚwritableÚsame_build_asÚsection_layout_hash)Únotepadr    ÚtextÚagains       r$   Útest_parse_real_windows_binaryr˜   »   sz  € åÐ5Ñ6Ô6€GØ�?Š?ÑÔð FÝŒÐDÑEÔEÐEåÔ˜wÑ'Ô'€EØŒ;ÐHÐHÐH¸5¼;ÐHÐHÑHÔHˆ;ØŒ=�BÔ7Ò7Ð7Ð7Ð7ØÔ# qÒ(Ð(Ð(Ð(ØÔ Ò"Ð"Ð"Ð"ØŒ?˜gŸlšl™nœnÔ4Ò4Ð4Ð4Ð4à×Ò˜gÑ&Ô&€DØÐÐÐØŒ?˜dÐ"Ð"Ð"Ð"ØŒ=˜EÐ!Ð!Ð!Ð!Ø×Ò˜kÑ*Ô*Ð2Ð2Ð2õ Ô˜wÑ'Ô'€EØ×Ò˜uÑ%Ô%Ð%Ð%Ð%Ø×$Ò$Ñ&Ô&¨%×*CÒ*CÑ*EÔ*EÒEÐEÐEÐEÐEÐEr&   c                  óê   — dg} t          dd| ¦  «        }t          dd| d¬¦  «        }|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚dS )uO   Build khÃ´ng há»£p lá»‡ (valid=False) khÃ´ng bao giá»� Ä‘Æ°á»£c coi lÃ  khá»›p.)r	   r
   i    r   ii   F)r   TN)r%   r“   )r   Úgoodr‰   s      r$   Ú"test_same_build_as_rejects_invalidr›   Ô   s”   € à5Ð6€HÝ�z 7¨HÑ5Ô5€DÝ
�j '¨8¸5Ð
AÑ
AÔ
A€CØ×Ò˜dÑ#Ô# tÐ+Ð+Ð+Ð+Ø×Ò˜cÑ"Ô" eÐ+Ð+Ð+Ð+Ø×Ò˜TÑ"Ô" eÐ+Ð+Ð+Ð+Ð+Ð+r&   c                  óH  — t          dt          t          ¦  «        } t          dz  }|                     ¦   «         st          j        d¦  «         t          j        | 	                    d¬¦  «        ¦  «        }d„ |d         D ¦   «         }t          t          |d         d	¦  «        t          |d
         d	¦  «        |¦  «        }|                      ¦   «         |                     ¦   «         k    s
J d¦   «         ‚|                      |¦  «        du sJ ‚|                     d¦  «        }|                      d¦  «        }|�|€J ‚|j        |j        z
  dk    s
J d¦   «         ‚|                     d¦  «        }|                      d¦  «        }|j        |j        z
  dk    s
J d¦   «         ‚dS )uí   INV-BUILD-01 REPRODUCTION: .data dá»‹ch -0x1000 PHáº¢I lÃ m Ä‘á»•i layout hash.

    Sá»‘ liá»‡u THáº¬T tá»« bin/Release/memprobe_report.txt (build cÅ©, 5 phiÃªn) vÃ  tá»«
    data/builds/6A9E477A.json (build má»›i, Ä‘o 10/09/2026).
    r   z6A9E477A.jsonu$   ChÆ°a cÃ³ build record 6A9E477A.jsonrR   rS   c           	      óž   — g | ]J}|d          t          |d         d¦  «        t          |d         d¦  «        t          |d         d¦  «        f‘ŒKS )r   r   rX   r   r   )rt   )rb   Úss     r$   rd   zEtest_inv_build_01_data_section_shift_changes_hash.<locals>.<listcomp>ë   sk   € ð ð ð ð ð ˆfŒIÝ�Ð#Ô$ bÑ)Ô)Ý��.Ô! 2Ñ&Ô&Ý�Ð#Ô$ bÑ)Ô)ð		
ðð ð r&   r   r   rX   r   uD   INV-BUILD-01: layout hash pháº£i khÃ¡c nhau khi .data dá»‹ch -0x1000Fr   Nr
   uO   Báº±ng chá»©ng thá»±c Ä‘á»‹a: .data pháº£i dá»‹ch Ä‘Ãºng -0x1000 giá»¯a 2 buildr	   iP  u/   .text co láº¡i Ä‘Ãºng 0x550 byte giá»¯a 2 build)r%   ÚOLD_BUILD_SIZE_OF_IMAGEÚOLD_BUILD_SECTIONSÚ
BUILDS_DIRrh   ri   rj   rr   rs   rl   rt   r”   r“   r�   r   r   )	Ú	old_buildÚrecord_pathÚrecordÚnew_sectionsÚ	new_buildÚdata_newÚdata_oldÚtext_newÚtext_olds	            r$   Ú1test_inv_build_01_data_section_shift_changes_hashr«   Þ   sÓ  € õ ˜AÕ6Õ8JÑKÔK€Iå˜Ñ.€KØ×ÒÑ Ô ð <ÝŒÐ:Ñ;Ô;Ð;ÝŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€Fðð ð ˜
Ô#ðñ ô €Lõ ÝˆFÐ$Ô% rÑ*Ô*ÝˆF�?Ô# RÑ(Ô(Øñô €Ið ×(Ò(Ñ*Ô*¨i×.KÒ.KÑ.MÔ.MÒMÐMÐMØNñ NÔMÐMð ×"Ò" 9Ñ-Ô-°Ð6Ð6Ð6Ð6ð ×%Ò% gÑ.Ô.€HØ×%Ò% gÑ.Ô.€HØÐ HÐ$8Ð$8Ð8ØÔ# hÔ&>Ñ>À&ÒHÐHÐHØYñ IÔHÐHð ×%Ò% gÑ.Ô.€HØ×%Ò% gÑ.Ô.€HØÔ  8Ô#8Ñ8¸EÒAÐAÐAØ9ñ BÔAÐAÐAÐAr&   c                  ó>  — t          j        ¦   «         } | €t          j        d¦  «         t          j        | ¦  «        }|j        sJ d|j        › �¦   «         ‚t          |j        › d�z  }| 	                    ¦   «         s%t          j        d|j        › d|j        › d�¦  «         t          j        |                     d¬	¦  «        ¦  «        }|d
         dk    sJ ‚|d         |j        k    sJ ‚|d         d|j        d›�k    sJ ‚|d         d|j        d›�k    sJ ‚|d         |j        k    sJ ‚|d         |j        k    sJ ‚|d         d|                     ¦   «         d›�k    sJ ‚|j        dk    r-|d         t$          k    sJ dt$          › d|d         › d�¦   «         ‚dS dS )uY   Ä�á»‘i chiáº¿u 3 nguá»“n: build record JSON <-> client tháº­t trÃªn Ä‘Ä©a <-> táº§ng C++.Nõ2   KhÃ´ng tÃ¬m tháº¥y PathOfExile.exe trÃªn mÃ¡y nÃ yõ"   Parse client tháº­t tháº¥t báº¡i: ú.jsonu   Client Ä‘Ã£ Ä‘á»•i build (uY   ); cáº§n cháº¡y láº¡i `python tools/re_pipeline/fingerprint.py --hash --json data/builds/z.json`rR   rS   Úschemazautopoe2.client_build_id/v1r‡   r   Ú0xÚ08Xr   ÚXr�   r   r”   Ú016XÚ6A9E477Au=   SectionLayoutHash táº§ng Python Lá»†CH vá»›i táº§ng C++ (C++=z	, Python=ú))r   Úlocate_poe2_executableri   rj   r3   r   r4   r¡   Úshort_idrh   rr   rs   rl   r   r   r�   r   r”   ÚCPP_LAYOUT_HASH_POD)ÚexeÚliver£   r¤   s       r$   Ú2test_build_record_matches_live_client_and_cpp_tierr¼     s%  € å
Ô
#Ñ
%Ô
%€CØ
€{ÝŒÐHÑIÔIÐIåÔ˜cÑ"Ô"€DØŒ:ÐHÐHÐH¸D¼JÐHÐHÑHÔHˆ:å $¤-Ð6Ð6Ð6Ñ6€KØ×ÒÑ Ô ð 
ÝŒð8¨¬ð 8ð 8à"&¤-ð8ð 8ð 8ñ	
ô 	
ð 	
õ ŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€FØ�(ÔÐ<Ò<Ð<Ð<Ð<Ø�*Ô ¤Ò.Ð.Ð.Ð.ØÐ#Ô$Ð(G¨TÔ-AÐ(GÐ(GÐ(GÒGÐGÐGÐGØ�/Ô"Ð&A¨4Ô+=Ð&AÐ&AÐ&AÒAÐAÐAÐAØ�+Ô $¤.Ò0Ð0Ð0Ð0ØÐ&Ô'¨4Ô+BÒBÐBÐBÐBØÐ'Ô(Ð,R°×1IÒ1IÑ1KÔ1KÐ,RÐ,RÐ,RÒRÐRÐRÐRð „}˜
Ò"Ð"ØÐ+Ô,Õ0CÒCÐCÐCðSÝ'ðSð SØ28Ð9NÔ2OðSð Sð Sñ DÔCÐCð #Ð"ØCÐCr&   c                  óÆ  — t          j        ¦   «         } | €t          j        d¦  «         t          j        | ¦  «        }|j        sJ d|j        › �¦   «         ‚t          |j        › d�z  }| 	                    ¦   «         st          j        d|j        › d�¦  «         t          j        |                     d¬¦  «        ¦  «        }|                     dd	¦  «        }t          |¦  «        d
k    s
J d¦   «         ‚t          d„ |D ¦   «         ¦  «        s
J d¦   «         ‚t          j        | ¦  «        }|j        sJ ‚|j        |k    s
J d¦   «         ‚|                     |¦  «        sJ ‚dS )uF   SHA-256 trong build record pháº£i do bÄƒm tháº­t tá»‡p client sinh ra.Nr­   r®   r¯   u   ChÆ°a cÃ³ build record rR   rS   Úfile_sha256Ú rf   u*   SHA-256 pháº£i lÃ  chuá»—i hex 64 kÃ½ tá»±c              3   ó   K  — | ]}|d v V — Œ	dS )Ú0123456789abcdefNr,   ©rb   rc   s     r$   ú	<genexpr>z8test_build_record_sha256_is_authentic.<locals>.<genexpr>@  s(   è è € Ð4Ð4¨1ˆqÐ&Ð&Ð4Ð4Ð4Ð4Ð4Ð4r&   u    SHA-256 pháº£i lÃ  hex thÆ°á»�nguN   SHA-256 trong build record pháº£i khá»›p vá»›i tá»‡p client tháº­t trÃªn Ä‘Ä©a)r   r·   ri   rj   r3   r   r4   r¡   r¸   rh   rr   rs   rl   r^   r   ÚallÚload_pe_headers_with_hashr¾   r“   )rº   r»   r£   r¤   ÚshaÚrebuilts         r$   Ú%test_build_record_sha256_is_authenticrÈ   0  su  € å
Ô
#Ñ
%Ô
%€CØ
€{ÝŒÐHÑIÔIÐIåÔ˜cÑ"Ô"€DØŒ:ÐHÐHÐH¸D¼JÐHÐHÑHÔHˆ:å $¤-Ð6Ð6Ð6Ñ6€KØ×ÒÑ Ô ð DÝŒÐB¨d¬mÐBÐBÐBÑCÔCÐCåŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€FØ
�*Š*�] BÑ
'Ô
'€CÝˆs‰8Œ8�rŠ>ˆ>ˆ>ÐG‰>Œ>ˆ>ÝÐ4Ð4°Ð4Ñ4Ô4Ñ4Ô4ÐXÐXÐ6XÑXÔXÐ4åÔ*¨3Ñ/Ô/€GØŒ=ÐÐˆ=ØÔ #Ò%Ð%Ð%ØXñ &Ô%Ð%ð × Ò  Ñ&Ô&Ð&Ð&Ð&Ð&Ð&r&   c                  ó  ‡‡— t           dz  dz  dz  dz  } |                      ¦   «         st          j        d¦  «         t	          j        |                      d¬¦  «        ¦  «        }|d         d	         dk    sJ ‚t          t          |d
         d         ¦  «        d¦  «        Št          t          |d         d         ¦  «        d¦  «        Š‰dk    sJ ‚d„ |d
         d         D ¦   «         }|s
J d¦   «         ‚|D ]}t          j
        |‰‰¦  «        du sJ ‚Œˆˆfd„|d
         d         D ¦   «         }|s
J d¦   «         ‚|D ]D}t          j        |d         ‰¦  «        }d|cxk    r‰k     sn J ‚|d         t          j        v sJ ‚ŒEdS )u;  Extract tháº­t 6A9E477A cÃ³ slot tdb/TEB unique â€” registry PHáº¢I loáº¡i.

    Artefact: data/re_out/6A9E477A/extraction.json (PyGhidra 10/09/2026,
    PathOfExile.exe SHA-256 e0cde00d...7504). Slot tdb ff00000058 khÃ´ng náº±m
    trong SizeOfImage=0x4C9C000 nÃªn khÃ´ng Ä‘Æ°á»£c thÃ nh static_root/AOB TOML.
    r   rD   rµ   rF   u'   ChÆ°a cÃ³ extract Ä‘áº§y Ä‘á»§ 6A9E477ArR   rS   rY   r‡   r0   rW   rX   r   r?   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚblockÚtdb)r^   rÂ   s     r$   rd   zMtest_in_image_filter_rejects_tdb_from_live_client_extract.<locals>.<listcomp>[  s3   € ð ð ð Ø°a·e²e¸G±n´nÈÒ6MÐ6MˆÐ6MÐ6MÐ6Mr&   re   uE   Extract tháº­t pháº£i cÃ²n ghi nháº­n slot tdb (khÃ´ng xÃ³a artefact)Fc                 óœ   •— g | ]H}|                      d ¦  «        r1|                      d¦  «        dk    ¯0t          j        |‰‰¦  «        ¯F|‘ŒIS )r[   Úmatch_counté   r]   ra   s     €€r$   rd   zMtest_in_image_filter_rejects_tdb_from_live_client_extract.<locals>.<listcomp>b  sg   ø€ ð ð ð àØ�5Š5�‰?Œ?ðð �EŠE�-Ñ Ô  AÒ%Ð%ÝÔ$ Q¨
°MÑBÔBð &ð 	
ð &Ð%Ð%r&   u5   Pháº£i cÃ²n signature UNIQUE náº±m trong .data/.rdataÚaddressr   rË   N)Ú	REPO_ROOTrh   ri   rj   rr   rs   rl   rt   ru   r_   r`   Úrva_from_addressÚIN_IMAGE_DATA_BLOCKS)	Ú
extractionrƒ   Ú	tdb_slotsÚslotÚacceptedr¤   ÚrvarW   r   s	          @@r$   Ú9test_in_image_filter_rejects_tdb_from_live_client_extractrÙ   J  s  øø€ õ ˜VÑ# hÑ.°Ñ;Ð>OÑO€JØ×ÒÑÔð ?ÝŒÐ=Ñ>Ô>Ð>åŒj˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€GØ�<Ô  Ô,°
Ò:Ð:Ð:Ð:Ý•S˜ Ô*¨<Ô8Ñ9Ô9¸2Ñ>Ô>€JÝ�˜G LÔ1°/ÔBÑCÔCÀRÑHÔH€MØ˜IÒ%Ð%Ð%Ð%ðð Ø˜8Ô$ \Ô2ðñ ô €Ið Ð]Ð]Ð]Ñ]Ô]ˆ9Øð Rð RˆÝÔ'¨¨j¸-ÑHÔHÈEÐQÐQÐQÐQÐQðð ð ð ð à˜Ô" <Ô0ðñ ô €Hð ÐLÐLÐLÑLÔLˆ8Øð :ð :ˆÝÔ! &¨Ô"3°ZÑ@Ô@ˆØ�CÐ'Ð'Ò'Ð'˜-Ò'Ð'Ð'Ð'Ð'Ð'Ø�gŒ¥"Ô"9Ð9Ð9Ð9Ð9Ð9ð:ð :r&   c                 ó@  — t           j                             dt          t          dz  dz  ¦  «        ¦  «         ddl}d}| dz  }t          j        t          |¦  «        ¦  «        }|                     d¦  «         |                     dd	d
dt          j
        dd|dœ¦  «        dddf¦  «         |                     ¦   «          |                     ¦   «          ddd	dddd|ddœddddddœgdœ}| dz  }|                     t          j
        |¦  «        d ¬!¦  «         | d"z  }|                     d#d ¬!¦  «         |                     |||¦  «        }|dk    sJ ‚t          j        t          |¦  «        ¦  «        }|                     d$¦  «                             ¦   «         }	|                     ¦   «          d%|	v sJ ‚t!          d&„ |	D ¦   «         ¦  «        sJ ‚|                     d ¬!¦  «        }
d|
v sJ ‚d|
vsd'|
v sJ ‚d(|
v sJ ‚d)|
v sJ ‚|
                     d*¦  «        dk    sJ ‚dS )+u[  Live labeler UPDATE target InGameState theo RVA live 0x45C9C90.

    RVA láº¥y tá»« MemProbe label-registry PID 36104 (10/09/2026 14:00:17),
    ValidateInGameState + ResolvePlayer maxHP=1330. KhÃ´ng dÃ¹ng fan-in cao
    0x45CF0A0 (LOCK ADD, khÃ´ng pháº£i InGameState). KhÃ³a heap cáº¥m (player_addr)
    pháº£i bá»‹ bá»� qua (INV-OFFSET-01).
    r   r   r   NÚ	0x45C9C90rQ   aÉ  
        CREATE TABLE offsets (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            build_id TEXT NOT NULL,
            kind TEXT NOT NULL,
            target TEXT NOT NULL,
            payload TEXT NOT NULL,
            validator_id TEXT,
            source TEXT NOT NULL,
            discovered_at TEXT NOT NULL,
            last_verified TEXT,
            hit_count INTEGER DEFAULT 0,
            miss_count INTEGER DEFAULT 0
        )
        zŸ
        INSERT INTO offsets (
            build_id, kind, target, payload, validator_id, source, discovered_at
        ) VALUES (?, ?, ?, ?, ?, ?, ?)
        rµ   Úaob_patternÚ
unreviewedzF0 48 01 1Dr@   )ÚpatternÚ
rip_offsetÚ
target_rvaÚValidateInGameStateÚ	static_rez10/09/2026 13:15:06zautopoe2.live_label/v1z10/09/2026 13:45:00Ú0x3E8ÚInGameStateÚstatic_rootrÏ   z ResolveInGameState+ResolvePlayer)ÚtargetÚkindÚindexrØ   ÚevidencerG   ÚheapÚ0x8853EF06Czmust-reject)r°   Úgenerated_atr‡   Úentity_map_offsetÚlabelszlive_label_6A9E477A.jsonrR   rS   zoffsets_6A9E477A.tomlz^# test
build_time_date_stamp = 0x6A9E477A
static_root_1 = 0x45CF0A0
static_root_2 = 0x45C9C90
z%SELECT target, hit_count FROM offsets)rä   rÏ   c              3   ó.   K  — | ]}|d          dk    V — ŒdS )r   rG   Nr,   )rb   Úrows     r$   rÃ   zJtest_label_targets_assigns_ingame_and_rejects_heap_keys.<locals>.<genexpr>È  s+   è è € Ð7Ð7¨3ˆs�1Œv˜Ò&Ð7Ð7Ð7Ð7Ð7Ð7r&   u   Bá»� quazentity_map_offset = 0x3E8zstatic_root_1 = 0x45C9C90z# LIVE)ÚsysÚpathÚinsertru   rÑ   Úlabel_targetsrv   rw   rx   rr   ÚdumpsÚcommitr{   Ú
write_textÚapply_labelsry   rÄ   rl   Úcount)r9   ÚltrØ   r|   r…   ÚreportÚreport_pathÚ	toml_pathr~   r†   r–   s              r$   Ú7test_label_targets_assigns_ingame_and_rejects_heap_keysrþ   p  s·  € õ „H‡O‚O�A•s�9 wÑ.°Ñ>Ñ?Ô?Ñ@Ô@Ð@ØÐÐÐà
€CØ	Ð%Ñ	%€BÝŒ?�3˜r™7œ7Ñ#Ô#€DØ‡L‚Lð	ñô ð ð" 	‡L‚Lð	ð ØØÝŒJ =ÀÐQTÐUÐUÑVÔVØ!ØØ!ð	
ñô ð ð  	‡K‚K�M„M€MØ‡J‚J�L„L€Lð +Ø-ØØ$ð (Ø%ØØØ>ðð ð (ØØØ$Ø)ðð ð
ðð €Fð, Ð7Ñ7€KØ×Ò�4œ: fÑ-Ô-¸ÐÑ@Ô@Ð@ØÐ2Ñ2€IØ×Òð	Aàð ñ ô ð ð 
�Š˜ b¨)Ñ	4Ô	4€BØ�Š7ˆ7ˆ7ˆ7åŒ?�3˜r™7œ7Ñ#Ô#€DØ�<Š<Ð?Ñ@Ô@×IÒIÑKÔK€DØ‡J‚J�L„L€LØ Ð%Ð%Ð%Ð%ÝÐ7Ð7°$Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ø×Ò¨ÐÑ0Ô0€DØ˜DÐ Ð Ð Ð Ø Ð$Ð$¨
°dÐ(:Ð(:Ð(:Ð:Ø&¨$Ð.Ð.Ð.Ð.Ø&¨$Ð.Ð.Ð.Ð.Ø�:Š:�hÑÔ 1Ò$Ð$Ð$Ð$Ð$Ð$r&   )T)(Ú__doc__rr   rv   rA   rñ   Úpathlibr   ri   Ú__file__ÚresolveÚparentrÑ   rò   ró   ru   Úfingerprintr   r¡   r¹   r    rŸ   r%   r-   r1   r5   r;   rC   ÚRE_PIPELINE_DIRrk   r_   rg   rp   rŠ   r˜   r›   r«   r¼   rÈ   rÙ   rþ   r,   r&   r$   ú<module>r     s%  ððð ð$ €€€Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à €€€àˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2€	Ø „‡‚��3�3�y 7Ñ*¨]Ñ:Ñ;Ô;Ñ <Ô <Ð <à Ð Ð Ð à˜Ñ (Ñ*€
ð +Ð ðð ð Ð ð
 $Ð ðð ð ð ð,Jð Jð Jð-ð -ð -ð ð  ð  ðð ð ð2ð 2ð 2ð ˜gÑ%¨Ñ5€Ø „‡‚��3�3�Ñ'Ô'Ñ (Ô (Ð (à Ð Ð Ð à˜vÑ%¨Ñ0°7Ñ:Ð=NÑNÐ ð€ð>ð >ð >ðBFð Fð Fð2,ð ,ð ,ð-ð -ð -ð`
ð 
ð 
ðD'ð 'ð 'ð4#:ð #:ð #:ðL^%ð ^%ð ^%ð ^%ð ^%r&   