From 52b3b11a1a75938f84b2d8f0d74d977aafca0607 Mon Sep 17 00:00:00 2001 From: zx Date: Fri, 13 Sep 2024 18:07:00 -0400 Subject: [PATCH] chore: use insert_dylib on more platforms --- README.md | 2 +- cyan/tbhtypes/executable.py | 26 ++++++++++++++++---------- cyan/tbhutils.py | 9 +++++---- cyan/tools/Darwin/arm64/insert_dylib | Bin 0 -> 51872 bytes cyan/tools/Darwin/x86_64/insert_dylib | Bin 0 -> 26764 bytes cyan/tools/Linux/x86_64/insert_dylib | Bin 0 -> 19016 bytes 6 files changed, 22 insertions(+), 15 deletions(-) create mode 100755 cyan/tools/Darwin/arm64/insert_dylib create mode 100755 cyan/tools/Darwin/x86_64/insert_dylib create mode 100755 cyan/tools/Linux/x86_64/insert_dylib diff --git a/README.md b/README.md index 05a805e..fac54d6 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ also obviously install python, version 3.9 or greater is required
  • install pipx
  • install OR update cyan: pipx install --force https://github.com/asdfzxcvbn/pyzule-rw/archive/main.zip
  • add cyan to PATH: pipx ensurepath
  • -
  • if you want to inject dylibs and ARE NOT ON iOS: pipx inject cyan lief
  • +
  • if you want to inject dylibs ON AARCH64 LINUX: pipx inject cyan lief
  • if you want to change app icons (iOS NOT supported): pipx inject cyan Pillow
  • diff --git a/cyan/tbhtypes/executable.py b/cyan/tbhtypes/executable.py index 1de3643..a7ad879 100644 --- a/cyan/tbhtypes/executable.py +++ b/cyan/tbhtypes/executable.py @@ -18,6 +18,7 @@ class Executable: ldid = f"{specific}/ldid" lipo = f"{specific}/lipo" otool = f"{specific}/otool" + idylib = f"{specific}/insert_dylib" starters = ("\t/Library/", "\t@rpath", "\t@executable_path") common = { @@ -42,10 +43,10 @@ class Executable: self.bn = os.path.basename(path) self.inj: Optional = None # type: ignore - if self.specific.endswith("iOS"): - self.inj_func = self.ios_inject + if os.path.isfile(self.idylib): + self.inj_func = self.idyl_inject else: - self.inj_func = self.insert_cmd + self.inj_func = self.lief_inj def is_encrypted(self) -> bool: proc = subprocess.run( @@ -177,7 +178,7 @@ class Executable: stderr=subprocess.DEVNULL ) - def insert_cmd(self, cmd: str) -> None: + def lief_inj(self, cmd: str) -> None: if self.inj is None: # type: ignore try: lief.logging.disable() # type: ignore @@ -186,17 +187,22 @@ class Executable: self.inj = lief.parse(self.path) # type: ignore - self.inj.add(lief.MachO.DylibCommand.weak_lib(cmd)) # type: ignore + try: + self.inj.add(lief.MachO.DylibCommand.weak_lib(cmd)) # type: ignore + except AttributeError: + sys.exit("[!] couldn't add LC (lief), did you use a valid app?") - def ios_inject(self, cmd: str) -> None: - subprocess.run( + def idyl_inject(self, cmd: str) -> None: + proc = subprocess.run( [ - f"{self.specific}/insert_dylib", - "--weak", "--inplace", "--no-strip-codesig", "--all-yes", + self.idylib, "--weak", "--inplace", "--strip-codesig", "--all-yes", cmd, self.path - ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL + ], capture_output=True, text=True ) + if proc.returncode != 0: + sys.exit(f"[!] couldn't add LC (insert_dylib), error:\n{proc.stderr}") + def fix_dependencies(self, tweaks: dict[str, str], need: set[str]) -> None: self.remove_signature() diff --git a/cyan/tbhutils.py b/cyan/tbhutils.py index 1b76a2e..0b142a0 100644 --- a/cyan/tbhutils.py +++ b/cyan/tbhutils.py @@ -106,11 +106,12 @@ def get_tools_dir() -> tuple[str, str]: # thank god i dont have to use importlib, # it's the WORST standard library package prior to 3.12 install_dir = os.path.dirname(__file__) + specific_dir = f"{install_dir}/tools/{system}/{mach}" - return ( - install_dir, - f"{install_dir}/tools/{system}/{mach}" - ) + if not os.path.isdir(specific_dir): + sys.exit(f"[!] cyan is not supported on: {system} {mach}") + + return (install_dir, specific_dir) def delete_if_exists(path: str, bn: str) -> bool: diff --git a/cyan/tools/Darwin/arm64/insert_dylib b/cyan/tools/Darwin/arm64/insert_dylib new file mode 100755 index 0000000000000000000000000000000000000000..b716afc1d9eb8729318228954bd30834c730e94f GIT binary patch literal 51872 zcmeHQ4Rljgwmvs0k`|Gce~_PB5N!bgN0frjkWx@Vgi?z9lcr5dV$-BeQcDG&b)rwD zu7Lm}C^{5yo+-?mRY%lhW*n-0GV16^ar~dr7G(^e^Xk)?Nfhk+_PHnNZA9OD*jcmQ zTIa5HbN1fnoPGBG&OX0s;MFfa`RYQ(6o$uuHw&-n0>1fOEEd0ggP$nvN!7P7Q*-8$ z%d~vr$*<&-#_E$a2#dw%uPOB&*HGVs_b4!QuTe9 zr|G+2=p$aQkA2O)GN0e;bgxh9?}=a4EKT2J0tpZC`lp9(WLPXU?pmkYW^ua9J)G~U z@8Q{+KATWNe5ww;e(KjaaX)NlytQKEgWvRzysq%Zj zQD01yr|2RbiKj1!2?++N#bUGit=)oD`(pK)eNj<_c)h;vni^%Xl=`}(_v`+)-zoe} zIFzD*@Yg>UOPQy#(&J9ZQtfNMThliEw-1%B`FxHaN58&x( z%+ONOqt`W#v3lP3En2)}B6Vm*`R4}kG`|!+$5;+hvS~Qpt*wk*N+o{F*apb^fh;6m z_fR|Z>ibET&B@N^8Jn9b1b-1;6)%ndsWm?DRF|`Ks;$mt15eMzc*&0c3>^OIwO`L3 zbPxOL`J-vGCw&hx6)&~Rtx_)JwARWfaLvmMa^=J*Q+ zc8F4wV*2!lj1?0d?aSiW{|+{p>yHr~?F(5y7Vqe1j_-#Km9b7%-#0jp)gSACo|BMk zI?_)^(ax!^u3=|47Bs<*V2jc6MpuCB>C<$!KuOxOFEA#y-#8`~GOmlg(1#tOG+_hL z(Lp*JKt~6mjbXxvz&h>&e2Rq8e#bDqT?2ycuz_ql4x0}k|M&oNB;otdh=;xH@H0`b znS6i_&4%>TA=t%vv}01z8$z&E%eQDe@I1zSoYw^3gpUk9D)5m7(Gf>kOKy7g+Cvoaj>01&q0!pU#Vz z6gHi=mp6%Hx)J$2K2Qed>A@!Qr@uLFfbH%3S+FC(f@Dt=SelfUndq;GX{J)$q9Cq@ znIk5p_Pbk&dpmX34+8h}AY;0aS*Wb6(}Dh=F_O(?=6H`-Zl!)U zG@XU7d~6kr4TlOW;dZ0xz-2;rJL;3H12P&f6pQb4b?qei*^P6Wx>^~JnKPc>G$mrD z%b3x|@k~dYH?TOT`)F}N@z)p_g1#CO+ZPy&aWgpfXkbw6r^Z2$FN3_8kB7gS*p85K z8Di8Nng8~lqWNz=?M3`nGy>a%{KdnM6wU97a5?ow5Bd9=ToL72mO1j25x5LcBGCc) zk!U|9g6oUHybkh+kM_%tgjxrNO{{)f$T%<-3S=SvvSNo@GsA}inc+~NFx=Ey6ec^y zd0Fv(*xP7KYg3f^V}#2N;F7T6yV%?TUm6Pv!<)(8zObt=>@_M8n#V$r6CE`|wnd5b zT6@OAu$$WJVv%SU@c5Ex?Lkg-^h?MZ&~5|T{X2`K8|#bGSu@ApyaKWRcZ`ERth#-j zpwn4(OPQdrVAbk!LE9l;E9e?losTjJTys&Mu+3ja;|JsM6O3Ev*$X_9Je$}lI<-fHMx4c*H{dyo?y zT@D%i#r^i+XanLCYaU-;*Gvxns4vaCTHoJEbE?3jJ_oV2qM}Fkw#(b>5>HWU7PV#S06TK5xe0)6t+=iGV*@W|Bh@;04 zTl>ZMLY@hE#7Fldwe;e+rgpJj8L8bp(7y-zck9}vwG4c8w>fgs@^##!2U+~&LG-^; zzm59tXMKPrcL$c_0*bM)2 zhOkIG(h&Mh+jlJE`wj%`4%$m4`kw6Oar@yF$$jB_C_{CRBc(VxiMFF!%$}y0=X4)) z5Odq7rdRyiqK{EbXz|`|>K*@ie4tI*M?FY>Z-H-H;CF*I_mB-l!;eU)V05@QFz0PP zrnR|=+Pnw)??IaZ(I)bUjt0z;rUIqyHM)Qru5bJG!H|D z?ngI@Bkg1YK}LR8QM-x0v>_k+8z{h9_^Wn36Dtvk8}->6_8;+%jcO;pg49C^P7VC zkYbJY4#j7BZ|@MoUK3wbV^0J-7NhSLqd#xd#yaKEevA0%jp$S0m6OFHy@8uGt@p+O z*+cW>n+!f&4_mK?4+X*p>SLNG!AA=)_ObtB*#EsuWoNTUb}z*pjg5pIPm=Cy(B3s@ zcSedG;1Pe^4$NB>QP>cjEwII$q~BNKFidB-W_I+-;E6tLheN~!?K2M`25^RqWA4}X zceAl?22E%F-sm45*R%5@xZ~K-ei>}M48DvP;~a9L>D+p9JoYyExeZtk;_bW5@x6hi zu_LgxeJb{Qu;)S0(W&_ntgW<%Ze|}&52~=8_Ru&36(Q~hhOpmW3E!sSrM*AJ++G9D zCjo6w?IB;c!`JOtm$F${Afxaz0_3hH>t0sLon{}W}BgU=)WAk4~A9x$jTNZOrinAN-=|ecb@jd^5 z-ou~HXX6O}VI1oS?s&S-XQ1g$2KPJ>1^Zc?4U6(&51n&>Usecb$;vZb!}ReK^4*+= z`=$uymZK(dR&LVnY)(^uy`8t3#;IH!-o+_)C}T0S@S zN4xvMH~N&eJB`}hXdoX8R)tTl+*8!_r^Ebg*l5JqgG_%`#~&YPGF`b6#8k4JIJ>uC z+%}q zw#5BGbl9Gelt+7kgP2>>)9R0HhF=v5^X6u4ehBjc?#@PV4E90)e(a?m4XnYv#hTb& zV9@eq*G}Mv@iHPWTwPoljnq8CfpNfYs{M1M`;wF!(r!&SW{p{3}@d@O-k-& zqP4b$;r?NH%w%Q3P{AupRLbX-h}d024@14A9CI{Q9L&mEDsk^+Xc{9 z0DZ=+uy(((oYUCrBOMy1K3stNp9Q%8>F&eKa3VHd!X3~8^r1elNB;^OwEoQuA85rG zWc!cd{^A%g@WQ8uLIp!{zk|0Gukrk`=6(fMhewfL7~?eFLj{?dUyu_`_cx)y5bV1U zqllrVz_KvyA85akhnNTf7rHZT!u?qK_gOIalTF(WAok}gnKAtB#L-Lx#;{@b8%>Z+ zR0?BMR#h@iLa{srdj9&5&! zJlsy!CG)Uq8VlGdv zg^6{T?<0{L4N?jAhQx9u~G&(L_K&9R8ZF}EJg#oC^WJB=pX zgO9zOMOZG2C|NA-SY(br`UGnmJDOzJH)PShJ!_t`bw+SJ>Xosy;B4rpa`;2Uh-n1Y z`abN6e9Wc&5g#Ncnd1SR0WfwQ4--X8H;tokPKKIkS{E^M8IwFZB3 z*Sw%(MiBa&bALP|h;_7@*3tBI;DGiBhx9&z#`gs2xZk0BsJ&&zwvq6&g?u1iA~>&S-8Lo)>h%E?_W&>f`&t9fy4bF*l)a zJLW|~ec4r9pYY?^gkP|az6+xJ|0K4sgZ3be`;GKnRC9JLFS!qCf?nEFY4fYle-d}s z2HO8FiIH6=PzJVMMfYjRz04&ulRDZySHT=U2kqU%^+6ZXlG|{{j=cS#_aiO&g)w+1%3?7^^4zU#RCjDV+cEG ztzDb2X`3;a`2MCy*p#}@B0E#}SxK3&rvtH5a>^VTeHQWdBNlP|2)=FB&IAs~iFRy8 zdYna^$8lcM?`dt_7?TYY2M&~>yDR4puy4m4;&8M0y@vW@xwo5k=ZbxSa~6y1_XHKQ z%yH)r%<)qwZ&v#8JweGF7I)sl;>zvmyQvQd`{8Kgj^DG$9WTKqw1fGu`abN*$*1%2 zo#sWy9E{a;bL3Arzm>S5*9~89(azVDN8fW0@3;ji+P&il=p$y11)a6`U3UKM-znO6 z9;uIP<``w{rad&-6Cr!b(N;OyEyWy0b0zFaEz9jgzM~X);LPS&hp}>=czmNh{mqdd zlRfLu&N|q$>RaqVS;}{;685ZuJug9aGi1GOSC%_fg|0qmQj**6jPrIVdl$6#j$ z#UJpGJAo(o(~Y?IrMZFdr9E>g^2%13<9GiZ`x26m(Xe+yPUSb#IzfFgQoBneT|_%Z zLMQ5>OoL-+&pNM&Itd+)fh0+B&5>J<)JGaHZWi3$Z#OV%$Vo?etQq7>**-(id9yZ;6J8ydw+vWo zKNaU)$4?A19Y2{fGsnPY@U;VLxfA0WdxtEs&TVDvn&cW1HD(;h!MZ;jcba^j`#t&q zWgVE05K{^KPQOHBTFehP8&?Csu#`8$V zdFuD`j7>hrK`-6uKT4Pmg|4CI2>MLJ6nR8*Ob4C=)BY$Af4Hxh`=0%(YZ&?RN8BOt zwNbYYm0rN&zk!_Q^3n?s59lYF`xA5c)5xQ`4~cX)QtNHz_|K6#fM*E%4C;#v^o6N= zE#JyEY5gz}`vB?#(nEcK{pDb)N9z*d%;zuE$DGLbJlF?pWu4u9*d*#5#@bJJchput z>UY$?1$ri9oDqErvBKLAU~f-4s;=d6FbVCSHePsO5^R`={a{Xi7T-ZS1GLVWt3^5T z55I*N>_p7y*6XcIcL!B2%F>ETE>gZ`Y zI#Wk?7Ic?Cs-v5A^i~~RrK1aV^fVovsiQmR==AI8W*xm%M_1|SLLEI#M`!Bj&U~GI z9o?*>x9aFB9bKrSr|IZS9o=cx>DSTCf_~g=$Rw;guRq*GY4c3R@h`+rU*g)|w$X2b zhW`yT#t5hBZ{8*gx)bzFL4N{zzM$#v4VMf0Bhd64J<{_bX!=bS(H)@g6!d$bw+Q-O z(2ofEEzk!9{W|D~py_Y@jtKfy(8mP*GU#?ezXR-aw9yZv^rTBmxvs(Y5o78c-_iF4;!md?L^ zQGW5VqIs&zW3{RDQ#Y&Irj~nZ+_oudk-gG$t6g>aXS3y2uNyzQoTXYUiQlcMKKuGg z=vCbwzo?P%t>v6PUexMW{SLCorh3XbS?+Y%C#yaW+PB$#&h>7!*6DKb!nGc6g$fU; z1^_8@*lhxnDZ0iAL_Mp&#tVDT)y~)L{!T3dz@;m1D$bwN6S!_Dx_zm1u6Jl4{qLMv z%75Of`mLodyK3{;eeTQrsGfs33Zp%=kMX9z^%q*Bg4ErM$j2^c%-UUm)CB!)xj9I--@VKtvxCuP`v0&!~hTS zDQW@AIo&mO)#|RRwbsqX4?+_G#+JD&+@4yuT4`PHESsgm-VGUSKB@{(e0F=K>T*`t zDLk}}x4S(x>m91SvdUkl`l_sD_H#5r4li7sKi9H+UjB`ixhogWpOX}6Trq{4*K@1W zhIrEkB_EE7mhBsyKL0s1Pw>%Dr6{FAn81RU_DxY2-)i^PdYyi4NL^<|*xOV;!XA)8 zIKh{}ypvdgM?mYTvSVnY5YG|#qGzmXIq=ga0*n;Q5)*8y)m!H9p&PojT5UE|B>j}9 zj-O!5&S3dA@<@m=#&|W%KD>!@)^*nKsAQ6xVNCYGT5&?;T zL_i`S5s(N-1SA3y0f~S_Kq4R!kO)WwBmxoviGV~vA|Mfv2uK7Z0ulj<KAFfNbeWvE|ESeQv4e{yuDwG z^aYXrL8R>>{aB z@vLNQetkdF63vq=v&CX5b5!{J6&9P-TkCYQC0@3bq&~m3tb+0^>uaoDTS92Fd%aaj z#_8s?r^@eiQxRL8%Z8dYrIu0%>`Tl-C&pLhb-MlK#H--TtS*$O|q9rHOfhAXTh+Gn>{a1|Sf^V?w;m8(}c z>#cE@S^d29yijlpnG9&wAHa=R$O~*?y&=2p0c>Cj}SR8m1)ad-)nOYp)~3<`$%fw2qlUW|7F-hZY|Dzj*75ECnmwpwV@p{0r@%*3Sn zwWZ8*j#-YcliHG~k+dK}8=p@TD@qqH4CVokA#+-hBF^M|C>Rt=6qrNkLhVo8x2oB68PN!^Rit7 zq6gB`{!rMwWMSWTCLS7>ojG*SL*=DMn-;X+G5hmjxzC^2QMlvKxO*-=_4ea;-8(%v zrtX;sM(4fzi&cAuUwUonOUIuZU>R|8f9IcXD=vT3wEV8pgI9jOt0nN>h=0H1XTMnC zIdZbRCGE|&whF`I6@9uk9olr;-S0fpaKn9*ANxn=pBR4S>5HEE-a{YwmjCO>6G!j= z{ccnLr}Bnhv+oP*qQBoYcho<+{p>3rU;V^&W8HuJ;hXDjdeGiEx%ihkjc>0Sb=#SL Lnf}z8KOg;XRX$$K literal 0 HcmV?d00001 diff --git a/cyan/tools/Darwin/x86_64/insert_dylib b/cyan/tools/Darwin/x86_64/insert_dylib new file mode 100755 index 0000000000000000000000000000000000000000..a8cbf48e6c25f36c1e9fece668bf67d4ff386790 GIT binary patch literal 26764 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 literal 0 HcmV?d00001