This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Ananta-ps/tools/AnantaInjector/__pycache__/loader_common.cpython-313.pyc
T

226 lines
34 KiB
Plaintext
Raw Normal View History

ó
Žß»j8kãó”•SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK r \R\R4Hr \ RSSS9 M \rSrSSS.rS rS
r\R("5r/rS rS r/S
QrSr\"5rSrSrSrSrSr Sr!Sr"\RFRI\RFRK\RFRM\'55S5r(Sr)Sr*Sr+Sr,\ RZ"S5r.Sr/"SS\05r1"SS \05r2/r3\R("5r4S!r5g!\a GMf=f)"uš
Ananta 注入器(�挂�龄�瓶 + 气�)—— 共享基础设施
★ �字说明:这一份**�是**「统一加载器 AnantaUnifiedLoader�。
那份是全通�诊断版(A/B/C/D/E/F 都能开),在
C:\Game\Ananta_mainleakflow_keitaro_gg\AnantaUnifiedLoaderï¼›
本目录是它的**最�副本**,日常跑��挂 bowling + balloon 两个模�。
★ 由 AnantaTrainSeatLoader v5.0.0.4 的 loader_common.py 改写。�留它踩过的所有�:
· 优雅�机三阶段(先让 agent �手 → 等在途 RPC → �脚本)
· �载超时**�� detach**(�拆的会�会把游�拖死)
· attach 走�线程 + 超时 detach(attach 本身�能永久阻塞)
· �次 RPC 失败**�拆会�**,交给主循环打�真实原因 + 退��连
★ 与�脚本版的唯一结构性差别:**一个 frida 会�里开多个 script**。
为什么必须这样(�是�并�一个大 JS):
- �个 agent.js 顶层都是 `var Il2Cpp2;` + 一堆 IIFE,�并会撞全局命�空间;
- 更致命的是 world_mod.js / gadget_world.js / train_agent.js 都写
`rpc.exports = { ... }`(**整体覆盖**),�并��有最�一个模�的导出会活下�;
- 分�多个 script:�自独立 realm,导出互�覆盖,且�是**�一个会�**
(满足「�一时刻�能有一个 frida 会��这�硬约�)。
éNúutf-8Úreplace©ÚencodingÚerrorscóF•SUS'[U0UD6 g![a gf=f)NTÚflush)Ú_builtin_printÚ Exception)ÚaÚks Úloader_common.pyÚprintr#s/€Ø€A€g�Jð
ܘИQÓøÜ ó
Ù ð
ús ‡ “
Ÿ F)ÚaskÚdoneg9@gN@écóÔ•[ [Vs/sHoR5(dMUPM sn[SS&[[5sSSS5 $s snf!,(df  g=f)u^当å‰�å�¡åœ¨ frida å�Œæ­¥è°ƒç”¨é‡Œã€�join ä¸�回æ�¥çš„线程数(供上层观测/自检)。N)Ú _STUCK_LOCKÚ_STUCK_THREADSÚis_aliveÚlen)Úxs rÚstuck_thread_countr;s>€æ Ý(6ÓGª 1¿*¹*¿,ŸQ©ÑGŒ‘qÐÜ”>Ó"÷
‰ùÚG÷
�ús ‡ A�A¬A²AÁAÁ
A')zAnantaGymLoader.exezAnantaTrainSeatLoader.exezAnantaBowlingLoader.exezAnantaBalloonLoader.exezAnantaGadgetLoader.exezAnantaWorldMod.exezAnantaPropScanner.execó8^•[RS:wag[RRm[R
"[R [R5nU4SjnU"U5nX!lTRUS5 g![a gf=f)NÚntFcóÂ>•US;agS[S'[5 [S5H$n[S(a gTR S5 M& g![a N@f=f)N)rééééFTriré2)ÚSTOPÚ
_atexit_closer ÚrangeÚSleep)ÚevÚ_Úk32s €rÚhandlerÚ&_install_ctrl_handler.<locals>.handlerUsdø€Ø˜Ó(ØØŒD�‰Kð
Ü”ô˜3–Z�ܘ—<Øàð— ‘ ˜"–
ñ ðøô
ó
Ùð
ús“
AÁ
AÁAT) ÚosÚnameÚctypesÚwindllÚkernel32Ú WINFUNCTYPEÚc_boolÚc_uintÚ_cbÚSetConsoleCtrlHandlerr )ÚPROTr)Úcbr(s @rÚ_install_ctrl_handlerr7Nsyø€Ü ‡w�w�$ƒØðÜ�m‰m×$Ñ$ˆÜ×!Ò!¤&§-¡-´·±Ó?ˆõ ñ�'‹]ˆØŒ Ø ×!Ñ! " dÔ+ØøÜ óÙðús˜A3B Â
BÂBc ó<•[R"5U-n[R"5U:ak[S(ag[R"[S[ SU[R"5-
555 [R"5U:aMjgg)Nrgš™™™™™É?g)Útimer"ÚsleepÚminÚmax)ÚsecÚends rÚ sleep_slicer?ns_€Ü
�)Š)‹+˜Ñ
€CÜ
�)Š)‹+˜Ó
Ü ��;Ø Ü �
Š
”3�sœC  S¬4¯9ª9«;Ñ%6Ó7Ó8Ô9ô �)Š)‹+˜×
ócó.•[R"S5$)Nz%H:%M:%S)r9Ústrftime©r@rÚtsrDvs€Ü �=Š=˜Ó $Ð$r@c
óØ•/n[R"SSSSSS9nUR5H’nUR S5Vs/sH!o3R 5R S5PM# nn[
U5S:aMQURUS R5[US
RS S 5545 M” U$![a Us$f=fs snf![a M¼f=f)
uh全� tasklist 一次,返回 [(进程��写, pid)]。
⛑ 为什么�用 `tasklist /FI "IMAGENAME eq xxx"`:
实测(2026-09-28)游�是���动的,`/FI` 过滤会直接回
「没有�行的任务匹�指定标准�,而**�带 filter 的全�列表里明明有**。
所以一律走全�解�,filter 那�路��信。
ztasklist /FO CSV /NHTÚmbcsr)ÚshellÚtextrrz","Ú"rrrÚ,Ú) Ú
subprocessÚ check_outputr Ú
splitlinesÚsplitÚstriprÚappendÚlowerÚintrÚ
ValueError)ÚrowsÚoutÚlineÚpÚpartss rÚ_tasklist_rowsrZzsä€ð €DðÜ×%Ò%Ø "¨$Ø ¨yñ:ˆð
—‘Ö ˆØ/3¯z©z¸%Ô/@ÓAÒ/@¨!—‘“—‘ Ö%Ñ/@ˆÐAÜ ˆu‹:˜‹>Ù ð Ø �K‰K˜˜q™Ÿ™Ó)¬3¨u°Q©x×/?Ñ/?ÀÀRÓ/HÓ+IÐJÖ Kñ !ð €Køô óØŠ ðüòBøô
ó Ú ð ús*„CÁ(CÁ>ACÃ CÃCÃ
C)Ã(C)có•[5HupUS;dM
Us $ SSKnUR5nUR5H/nURR 5S;dM#UR s $ g![a gf=f)uN找 Ananta.exe 的 pid:全� tasklist → frida 枚举(两��险)。)z
ananta.exeÚanantarN)rZÚfridaÚget_local_deviceÚenumerate_processesr,rRÚpidr )r,r`r]ÚdevrXs rÚ resolve_pidrb”s€€ä#Ö%‰ ˆØ Ð+Õ +ØŠJñ&ð
ÛØ×$Ñ$Ó&ˆØ×(Ñ(Ö*ˆAØ�v‰v�|‰|‹~Ð!9Õ9Ø—u‘u’ ñ+ð
øô ó
Ø Ø ð
úsŸAA7Á&
A7Á4A7Á7
BÂBcóŒ•UR5n[[5VVs/sHup#X!:XdM SPM snn5$s snnf)Nr)rRrrZ)r,ÚnÚnmr's rÚ count_exerf¥s5€Ø �
‰
‹ €AÜ œ~Ô/Ô;Ò/‘e�b°2±7—Ñ/Ò;Ó <Ð<ùÓ;s
£ A
²A
cóÜ•[RRn[RURl[R [R[R /URlUR SS[U55nU(dg[R "5nUR[R"U5[R"U55n[U5=(a URS:HUR[R"U55 $!UR[R"U55 f=f![a gf=f)ußOpenProcess(PROCESS_QUERY_LIMITED_INFORMATION)。
⛑ 为什么�用 tasklist �唯一判�:
tasklist 在�些环境(�� shell / 沙箱)会返回**空列表**,
那时 pid_alive � False ⇒ 互斥�形�虚设(两份加载器照样起得�)。
PROCESS_QUERY_LIMITED_INFORMATION(0x1000) 自 Vista 起对**任何**进程都放行
(���进程��别的会�),�� pid 存在就拿得到�柄 —— 是最��的存在性判�。
iFi)r-r.r/Úc_void_pÚ OpenProcessÚrestypeÚc_uint32r1ÚargtypesrSÚGetExitCodeProcessÚbyrefÚboolÚvalueÚ CloseHandler )r`r(ÚhÚcodeÚoks rÚ_pid_alive_winruªsï€ð
Ü�m‰m×$Ñ$ˆÜ"(§/¡/ˆ�‰ÔÜ$*§O¡O´V·]±]ÄFÇOÁOÐ#Tˆ�‰Ô Ø �O‰O˜F E¬3¨s«8Ó 4ˆÞØð 0ô—?’?Ó$ˆDØ×'Ñ'¬¯ª¸Ó(:¼F¿LºLÈÓ<NÓOˆBܘ“8×1 §
¡
¨cÑ 1Ð 1à �O‰OœFŸOšO¨AÓ.Õ /øˆC�O‰OœFŸOšO¨AÓ.Õ /ûÜ ó
Ø Ø ð
ús+‚BEÂA/D4Ä%EÄ4'EÅEÅ
E+Å*E+có’•[U5n[U5(ag[5H upX :XdM g g![a gf=f)NFT)rSr rurZ)r`r'rXs rÚ pid_aliverwÈsP€ðÜ�#‹hˆô�c×ÑØÜÖ ‰ˆØ �8Ùñ!ð øô óÙðús‚ 9¹
AÁAz .loader.lockcóŒ•[RR[5(ax[ [ [SS9R
5=(d SR5=(d S5nU(a+[U5(aU[R"5:waU$[ [SSS9nUR[[R"555 SSS5 [R"[5 g![a SnN¡f=f![a Nf=f!,(df  NK=f![a NZf=f)uo拿常驻é”�。返回 None = 拿到;返回å� ç”¨è€… pid = å·²ç»�有一份在跑,调用方应立刻退出。r©rÚ0rÚwN)r+ÚpathÚexistsÚ LOCK_PATHrSÚopenÚreadrPr rwÚgetpidÚwriteÚstrÚatexitÚregisterÚrelease_instance_lock)ÚoldÚfhs rÚacquire_instance_lockr‰Þsð€ð 
Ü
�7‰7�>‰>œ)× $Ñ $ð
Üœ4¤ °GÑ<×AÑAÓC×JÀs×QÑQÓS×XÐWXÓY�ö”y —~‘~¨#´·²³Ó*<Ø�
ð
Ü
”)˜S¨7Ò
3°rØ �H‰H”SœŸš›Ó%Ô &÷4ô ‡O‚OÔ)Ô*Ø øôó
Ø’ð
ûô ó
Ù ð
ú÷4Õ
3ûä ó
Ù ð
úse‚(D«ADÁ01DÂ#D6Â2.D%Ã D6Ä DÄDÄDÄDÄ
D"Ä!D"Ä%
D3Ä/D6Ä3D6Ä6
EÅEcó�•[RR[5(dg[ [ [SS9R
5=(d SR5=(d S5nU[R"5:Xa"[5 gg![a SnNCf=f![a gf=f)u4å�ªåˆ **自己**写的é”�,别把别人的删了。Nrryrzr) r+r|r}r~rSrr€rPr r�Úremove)Úcurs rr†r†ósš€ð

Ü�w‰w�~‰~œi×(Ñ(Ø ð Ü”tœI°Ñ8×=Ñ=Ó?×FÀ3×MÑMÓO×TÐSTÓUˆCð ”"—)’)“+Ó Ü �IŠI”iÕ ð øôó ØŠCð ûô ó
Ù ð
ús5‚(B8¬AB&Á13B8Â& B5Â2B8Â4B5Â5B8Â8
CÃCcóD•[Hn[U5S:”dMUs $ g)u`有没有别的加载器在跑?返回å��字,没有返回 None。必须**æ¯�一轮**å¤�查。rN)Ú
OTHER_EXESrf)Úes rÚother_loader_runningr�s"€ç
ˆÜ �Q‹<˜!Õ ØŠHñð r@cóÚ•SU;aU$[RRUS5n[RRU5(d[ SU-5e[
R "[USS9R55nURS[U[5(aUO/5nU(d[ SU-5e[
R"USS S
9nURSU5$) uk把 agent JS 里「由 Python 端注入�的��符替�掉。
⛑ 2026-09-28 ��现的大�:`modules/world_mod.js:3376` 是
var CELLS_RAW = __CELLS_JSON__;
这是一个**原始��符**,原版� `new-worldmod/inject.py` 在注入�
`src.replace("__CELLS_JSON__", json.dumps(cells))` �掉。
我们这里是直接读文件 ⇒ 未定义的标识符 ⇒ 顶层 ReferenceError
⇒ **整个脚本加载�死**,连它自己的 `Il2Cpp.perform(...)` 引导都跑�到。
实测:所有历�会�里 `[worldmod]` 的 console 输出 **0 次** —— 通� B 一直是死的。
Ú__CELLS_JSON__z
cells.jsonu*JS 需è¦� __CELLS_JSON__,但找ä¸�到 %srryÚcellsu%s 里没有 cellsF)rJÚ:)Ú ensure_asciiÚ
separators)r+r|Újoinr}Ú RuntimeErrorÚjsonÚloadsrr€ÚgetÚ
isinstanceÚlistÚdumpsr)ÚsrcÚrootrXÚdatarUÚpayloads rÚapply_placeholdersr£
s½€ð˜sÓ"؈
Ü
�‰� ‰ �T˜<Ó(€AÜ
�7‰7�>‰>˜!× Ñ ÜÐGÈ!ÑKÓLÐLÜ �:Š:”d˜1 wÑ/×4Ñ4Ó6Ó 7€DØ �8‰8�G¤Z°´d×%;Ñ%;™TÀÓ D€DÞ ÜÐ/°!Ñ3Ó4Ð4Ü�jŠj˜¨E¸jÑI€GØ �;‰;Ð'¨Ó 1Ð1r@z%var\s+PUSH_PATHS\s*=\s*\[[^\]]*\]\s*;c óz^^•SU;aU$[RR[RR S5=(d SSS5n/nU[RRUSS5[RRUSSS S
S SS5S 4HSnU(dM [RR U5R
S
S5nXC;dMBURU5 MU SmSSRU4SjU55-S-m[RU4SjUSS9upVUS:XaU$U$)uL把 balloon_fix.js 里写死的 PUSH_PATHS æ�¢æˆ�本机真实候选列表。Ú
PUSH_PATHSÚ LOCALAPPDATArKÚ
AnantaBalloonzballoon_push.jsonÚconfigz Drmk.ServerzDrmk.AppÚbinÚDebugznet8.0z&D:\Ananta\gym_tools\_balloon_push.jsonÚ/Ú\có2•SURSS5-S-$)NrIr¬z\\)r)Úss rÚ_js_strÚ$apply_balloon_paths.<locals>._js_strIs€ð�Q—Y‘Y˜t VÓ,Ñ,¨sÑ2Ð2r@Ú[z, c3ó4># •UH
nT"U5v• M g7f©NrC)Ú.0rXr¯s €rÚ <genexpr>Ú&apply_balloon_paths.<locals>.<genexpr>Nsøé€Ð4ªe¨™' !Ÿ*˜*ªeùsƒÚ]có>•ST-$)Nzvar PUSH_PATHS = %s;rC)Ú_mÚarrs €rÚ<lambda>Ú%apply_balloon_paths.<locals>.<lambda>Qs ø€Ð.DÀsÒ.Jr@r)Úcountr)
r+r|r—Úenvironr›ÚnormpathrrQÚ_BALLOON_PUSH_REÚsubn) rŸr ÚsharedÚcandsrXÚnewrdr¯rºs @@rÚapply_balloon_pathsrÅ3sù€à˜3ÓØˆ
Ü
�W‰W�\‰\Ü
�
‰
�‰�~Ó&×,¨"¨oÐ?RóT€Fà €EàÜ
�‰� ‰ �T˜8Ð%8Ó9Ü
�‰� ‰ �T˜=¨*°e¸WÀhØÐ2ó 4à1ó ˆöÙ ô
�G‰G× Ñ ˜QÓ × 'Ñ '¨¨TÓ 2ˆØ �>Ø �L‰L˜ŽOñò3ð
�— ‘ Ô4©eÓ4Ó4Ñ
4°sÑ
:€Cô×
"Ñ
"Ô#JÈCÐWXÐ
"Ð
Y�F€C؈Aƒv؈
Ø €Jr@cóP•\rSrSrSrSrS
SjrSSS\4SjrSr SS\4Sjr
S r g) ÚModiWu%一个模å�— = 一个 frida script。cób•XlX lSUlSUlSUlSUlSUlg)NFrKr)r,r|ÚscriptÚreadyÚnoteÚdeadÚtimeouts)Úselfr,r|s rÚ__init__Ú Mod.__init__Zs/€ØŒ ØŒ ؈Œ ؈Œ
؈Œ ؈Œ ؈�
r@cóŽ^^^•[TRSSS9R5n[ U[ RR[ RR[ RRTR5555n[U[ RR[ RR[ RR[ RR[ RRTR555555nURUS S
9nS
S0mUUU4SjnURSU5 UR5 [S5H%nTS
(a O[ R""S5 M' UTlSTlSTlSTlg![anSU-TlSnAgSnAff=f![a nS[U5SS-TlSnAgSnAff=f![a nS[U5SS-TlSnAgSnAff=f![a URU5nGNf=f![a nS [U5SS -TlSnAgSnAff=f![a nS[U5SS-TlSnAgSnAff=f)Nrrru读文件失败: %sFuå� ä½�符替æ�¢å¤±è´¥: %sé uæ°”ç�ƒè·¯å¾„改写失败: %sÚv8)Úruntimeucreate_script 失败: %séxrÊcóÐ>•URS5S:Xa´URS5n[U[5(a[R"U5n[U[ 5(a2URS5(dURS5(aSTS'O0T(d)[STR<S[U5SS <35 URS5S
:XaUS [URS 55SS
-Tl T(d([STR<STR<35 ggg![
a Nïf=f![
a Nˆf=f![
a gf=f)NÚtypeÚsendr¢rÊÚabReadyTz [z] éÈÚerrorzscript error: %sÚ descriptionrÒz [!] u 脚本报错: )
r›rœrƒr™ršr Údictrr,rË)Úmsgr¡rXÚboxÚquietrÎs €€€rÚ
on_messageÚMod.load.<locals>.on_message‡s)ø€ð
Ø—7‘7˜6“? fÓ,ØŸ™  Ó*�AÜ! !¤S×)Ñ)ð!Ü $§
¢
¨1£
˜Aô" !¤T×*Ñ*°·±°g·±À!Ç%Á%È ×BRÑBRØ'+˜˜Gš Þ"ݨt¯y¬y¼#¸a»&ÀÀ#º,ÐGÔHð
Ø—7‘7˜6“? gÓ-Ø 2´S¸¿¹ÀÓ9OÓ5PÐQUÐRUÐ5VÑ V�D”IÞ Ý¸t¿y¼yÈ$Ï)Ë)ÐTÕUð!ð.øô )ó!Ù ð!ûô ó
Ùð
ûôó
Ùð
úsNƒ;E¿D8ÁAEÂ0EÃ
A(EÄ8
EÅEÅEÅEÅ
EÅEÅ
E%Å$E%Úmessageuload 失败: %ségš™™™™™¹?Tr)rr|r€r rËr£r+ÚdirnameÚabspathrƒrÅÚ
create_scriptÚ TypeErrorÚonÚloadr$r9r:rÉrÊrÌrÍ) rÎÚsessionràrŸr�Úscrár'rßs ` ` @rrêÚMod.loadcsBú€ð Ü�t—y‘y¨7¸9ÑE×JÑJÓLˆCð
 Ü$Ø”R—W‘W—_‘_¤R§W¡W§_¡_´R·W±W·_±_ÀTÇYÁYÓ5OÓ%PÓQóSˆCð Ü%Ø”R—W‘W—_‘_¤R§W¡W§_¡_´R·W±W·_±_Ü—G‘G—O‘O¤B§G¡G§O¡O°D·I±IÓ$>Ó?ó6Aó&BóCóDˆCð ð
0Ø×*Ñ*¨3¸Ð*Ð=�ð˜Ðˆ÷ ð. Ø �E‰E�)˜ZÔ (Ø �G‰GŒIô �r–ˆAØ�7�|ÙÜ �JŠJ�sŽOñðˆŒ ØˆŒ
؈Œ ؈Œ
ØøôQó Ø-°Ñ1ˆDŒIÜûð ûôó Ø3´c¸!³f¸T¸c°lÑBˆDŒIÜûð ûôó Ø6¼¸Q»ÀÀ¸ÑEˆDŒIÜûð ûôó
0Ø×*Ñ*¨3Ó/“ð
0ûäó Ø2´S¸³V¸D¸S°\ÑAˆDŒIÜûð ûô@ó Ø)¬C°«F°4°C¨LÑ8ˆDŒIÜûð ús�…#G©A-G1ÂB'HÅI Å"JÇ
G.Ç
G)Ç)G.Ç1
HÇ;HÈHÈ
IÈ(IÉIÉ I*É&I-É)I*É*I-É-
JÉ7JÊJÊ
KÊ$J?Ê?KNcóÖ^^^^^ •URc[SUR-5eURRn[ Xa5m 0mUUUUU 4SjnUR UTX5$)uà三å�‚ RPC(如 gadget_loader çš„ findobj <关键字> <maxNodes> <maxDepth>)。
�想把 arg2/arg3 混进 call() 的�选语义里(None 与「�传�会分�清),
所以�独开一个方法,语义明确。
õ模å�— %s 未加载cóZ>•T"TTT5TS'g![anUTS'SnAgSnAff=f©NÚrr�©r )r�ÚargÚarg2Úarg3rßÚfns €€€€€rÚrunÚMod.call3.<locals>.run¼s3ø€ð
Ù˜c 4¨Ó.��C’øÜó
Ø��C–ûð
úsƒ
‘
*›%¥*©rÉr˜r,Ú exports_syncÚgetattrÚ _run_guarded)
rÎr,rôrõröÚtimeoutÚErørßr÷s
``` @@rÚcall3Ú Mod.call3°scü€ð �;‰;Ñ ÜÐ4°t·y±yÑ@ÓAÐ AØ �K‰K× $Ñ $ˆÜ
�QÓ
ˆØˆ÷ ñ ð × Ñ   c¨4Ó9Ð9r@c
óN^^^
•0m
UUU
4Sjn[R"US9nSUl[ [R U5 SSS5 UR
5 URU5 UR5(aÓT
RS5nUbUR5 U=RS-
sl SUl
[5n[S[!5UR"X4X€R4-5 UR[$:¼a$['SUR"X0R4-5e['S UR"<S
U<S U<S 35eS
Ul [ U[;a[R)U5 SSS5 ST;aQ[+TS5n SU ;dSU ;d SU ;dSU ;aSUl
['S UR"<S