import ctypes import base64 import lzma import mmap libc = ctypes.cdll.LoadLibrary(None) c_mmap = libc.mmap c_mmap.restype = ctypes.c_void_p c_mmap.argtypes = ( ctypes.c_void_p, ctypes.c_size_t, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_size_t, ) # code used to generate: # #include # # int c; # # int add(int a) { # c += a; # printf("c = %d from c\n", c); # return c; # } # # int add10() { # return add(10); # } code = bytearray(lzma.decompress(base64.b85decode(b'{Wp48S^xk9=GL@E0stWa761SMbT8$j;5JYlmR$e>05-$-it9#~al^p(bPMw+zlB?`6N!vL$nAlXp_q&YQ^U5~R=yDN`_V>U>7$XE31<05IO;=~aZ-u1F;%_F>eF}bkV?T=5p<{0Ird%}n5)f9lP>;kPJrl3)iBrCvl;71k)AEp(Ha%K9*Z|wU^!m6%z+`1OU!3@|+A@UErye(s_TTU{x*nHLj7cFzh|qq^)MDeOZ>)ewS4%F^<&3l8v~gY?bfcm15N#6nU{+cRvgFyQHXL`W0KN7Z~+1&vAYI5x#UjibzGXl9@yFSlpix8WVm3TK=B4-_#O=eqp@d@-WXnXjK|9`Hqc|v=-by0gN$nk^?$6?b@!)BDOps5BMrD7!&)ONuq&W5Cd3f0~}WRCW^E2#MNED;Er0Di7sVMI)+*Gx?8lHzn@Y-FyFp>3dKpxhD_dq)<2?pxNo>D1?){43@*kyr$>PZXFq1qO+CS4Avis+?jr3O5B%ka_{9O6e8uNw$_~_@>iX1x=WNPE!_;Ag1>y}qbepunJ9zc2NLl*2ukBhf{|9}?&Zn7i=|BeHEZ*76E^Xy=tH;1DC3k*utdqdT6H{>rZy+h*#6eYS4r`=-&oou@|cJ|U)8Mel?_#JuL`Fb@gqNVbWlB@nhOA@0aTFFVn}`{57BZ^X+S-b8R`6SfvTj&N6sGKTFaC98|P1})bZoj(3?tOZ6g$rj8znJ;G*0B?|uFL2rs&n)xmkqSbradT9**w5u=xwhIbU%9*0cpw=JdQ*MIN{}~iHep7y!t;1jCcvBAzt;MOw43ixrnr2S@&^hNxC0fk7DZMFXb8DP^^N+dn}#W{G2m{TK6rpmL{*%QKqjK0df`0rw}hZmX7^oo;p9oR7Pn2Tq(2lzmM&RS@@DSq`)u>@rjgX9)<3P9&GAq=Zmj{D%PSp1#jyU;JfD*;%H`OP$cTiBrw5s~0vBQP2xerLWP|!R?W{j?wvk|!$$)lTQ7>XQy>f?y0Pl`^khL$O;BbiL^ko7s)P2C`SarmsK`+ZK4hu;VLqx-&Ua)?CYA$Y{q8y@vk`Kh7K2a3w}VHiV>Tvbja&dPVZG>Q*8Ic^n_y#I|-sl8hCt`~Gi6bB95aiC}``H>7v5*7yO4jMj$^!*d$(l6K4TlD*m3{CHl#FCd&0lJWo9ED~(MD21!WLNG8YLmW_C83x;+#F=HA8o_xGSDqiDAW;18+-)un>sVO&vEW(4}bc}Xm*%~6()&}1ID~sX^+7Z9KJvbif)cSt+Ie%7-r0!Oa4Yec|_hU@;a=E22GBVWw3jT*()3SWGC!^5x%{og%3sf3`6cutR7e?KPBoF(G^@`lBX|RaL}OM)84fnv^82w(m|JGld9$3F4wB@*7KGWAH(-(pz!QJvNf9#PHI=^xr?!~rMEQRtY0NI$D?A&d7-QCleE@Z_h?>UKSM3bhoI;WUs~h~)^_z@I5a|q61QcCAvelUZC`vWg)@M0Y+kyOK1Fa+_z;I|N-W9(k0r{oxH{o$ms3%;ihIMjO9fqL6+TEKkm~vhg~BD@mRXq+fu?sq`y1DB7G?{Pu-ywo+g7EYX)PvaNtDJAMgKVE`|{BkcT9vIsxBLG3uU}OJyudE5g$T&qo-2MA!4tSrm6h-$cNT`xzE1~%FP#y(dU{{GBKA5Tok)*i&$+8_md0uNo%KaT7a7<60&mFD$B@?2mV?7+C_<0_?t6nd}JNS$aA2&d1_z&n&uuUjWQ2DxM85o=CI$0Bwli*R4Hk^MGr7@U?4#Ox_X;plPXwjzpmotL^`CVnzb*WVb_5+TjE;N*no_u@#Yg!oRN>_K!rvTy}Z(n+?EP1evL_WJNfuqJYL9C5GG0`-pPmbZQ^m&7ofFLP1Z(4v%I^`BP{wieaeS4Q6fL@t@Sa@Aq!oTiQ3~mXhI3KX*z6SZX(n4R-q~Y}xidH8BW9Hx*NkN7L@*c!a>O@ncs*jSo^Tu$xg18y29^(5Wn&1k3qbMK+fkv?kYEE(>vqM!!J2+0q~^lou{mtBSKIvTuhtaKa?(#8b=2Mwz1lJv(Tk6Vml8GRlNb^DKJS|gxCVc!u2-6Qm68`3J?#zxG5Zd2xl)kMY9#)$@vf`O9Zq-OV4IEQhO&}ZfT?qnoyn6XHl^A_`XgkV6a`R>a{M+tCYPBM(gN-rC{~NKLu;$qF_-W4nDWekwbfY}ROz1+Y_0v!%LY!mP+3WhGI#PQVlEIcwiG_gFtWM$xY%KroH^oBxrPl~9h+;$6E%d=ZXM}TVhfr+If;@ZD8Iy7jw>0+M|3ozyv7tco!V|Wdyq3r$`A1qGD$b0Y_TY%8c@~pgdiS-h2riErxHG1=o%)%{W^%i<=!j>M(k@a>TPqprvug3LvZaIEIR2z$D0Df$F7%bP^>oUq_EKC497WlJ+ZbHbKZf=f*^c%nDWt?f4(Z>dWBFcRa3B{ed1dvshY#PmbKJ-Gh=NJvt>8x_~RxeYV`c2O2HWo)??PY?aRlV2_|k;ez2zL_lD?4~#8Uhne!`9~CCFTVIeol;(_#GFfhkZ=0f1AT)qh*00qY8}yEaw&Rn_r{*$;4N(r<7s^&$!eed4oWT%gTqOb54eyqRi{X*fuo51KyA*Mh*s5lwe4B}rLHdWvo>*;SKq)ki9K*)`5or%Vr#NAaM&>$rtRY#vGA4H!|gBOwu5!`CKDIRavh!Jk${-rkrBdhSP>;3a?%0~eyMMk^eX*Rjm7aad9`%R;S{{3Xm$*bopR{@v*9T+x8&1+sru8R;Rq6VMn%g?EC2p^2v}sUoFmAbyHyM+2cyH~)NR4=o{vq)%4js^^|MyCHL7G{$5926Y~H#F)hGI#`{8IR2<2;}%zvKPvE6JsMoT9BDB&19pL<&)wRPLFa(m7+8UkW457xnoUmgQ|I>%~FU@$WgZ!$c`tg{2bdeV4}oa$)}hdZrGHl(Q;Q4d;TR1Rx7WtUk{Qa8MgT%#cFYg{?kEWr2zdls@Dm)e!|gS+t%e7dPuSkq61>&@$aietrx@CT#k@J%MN>sd*ydKbv@QWv}hRn4v0AauD$!1uS1&ud|b#zd6I~Z|71Csr+V$zCIO=yW6jV1;eTleC2xkKO2;BN48nuksmBfJmkqLqfQ4S`aX}pMjB-&)sQB;RM9Zv?l|FM83(wWJJor2%15^I&JrfK`R&U991~4pc@SPZ5)Gr=0OBc9{c2GTB%Sr?*Q&pkZakrx;AMt2>HxpN0z!%`|SWw?6x{?|FUmktP!V$)@DbjQlM6iepLOmXRZ2JXxH!A-&h)LonwodOqb_bMMgzR=N>MG#@@=uh-6J8A+Rr`u2D}Rn>&Somdg}#fi)e645+#JzLvT@IjJ6<|;#K`tryRj1Z{zD_#-J5^)Az^ywCFb6!fhoW8?u*cKNSn)jDF%o-{!dcjfS&Ur;#kh?Ij|eC^sB%xL$!LS^cY4}IMj%b77D+3ej4*GY%LAnN>xF!QuO;Od)daxl6}&^LQwzC#^?A@=A&L{c8OSM^q}YrIlvx&6#Yf`Qa9aHcLLB`!Zj#G1rXy6Cdj(Y#`bjxISfYz-w~?BOMz;c1M&0M+o6pA9@X+TA1?@#GUmF2*g2XIWt{oY`{s2p#_z3mDP{aXJ|A@sZV$c=0F1BCIPr3`89Vlr4v=K;tgsX0EEBhi%86&kJ`OzsZr!bSS~(G7E1hkLskkm&5^(*>DM&(3Uud*<8mHq)t(?KqOag2eVqYWnevk8RTg<;W1qC-&q%-S;)|Eh*&%Uhr#R?PVG(;P}aN=KXArz(*$F0-f0jCW2lMsRdl7}_^6zED(BS#7`XC4S*iGuJ`|!tUpW|Gu=N;N1=WdR_fT+Ft^-t-gZCSOCoD9Q2%Z2YF6!z(2W5Z+*s;ma2`K$L2%dCGU~W_A)tpQrrDekdvnN-?IF8>3at_;xvtol1FBpR2V&HbYW2;%A00o+`vN7^N_yv^XTvrqc<_seyg*S!WGNh~nNfG9NkrB;j*Ixqc=sqt^KKNTmZ|Kr_PJ{<^>ZS%WK&}TF0bLMf*{NG*ePo*K;!MYShc3FF`vSlKS`ICjWQnS9DUwrwB)fp#Hh>s19N!-Upf`8nwp-@x3l*W^Uyh3^3eSDB>cTE0{qO`{TsVlXT#V6$r+*zbL8vIXm(!GaWAvRU2;QqC$!9r`mAb7x=pkXvFKlM%YI{*{jK5Cx=KeI!INA4T=eKglz9CyNRLMj+Knu3B*Gglm-7jdrWP)y%~ZQV#{neW#C>(18&upyz>y~{bUY^lVr*095O76B*rp^}t^gnz@HYP)aE4bOnLOPX8aSBV`2IZfn!m_W;tkuRX$e{v{Rxo!mX=T=njoDcE<3D-FZEx9H|gfVQ$4)}g{33(I~;ry&En$j<9d4@;hOAjeP}OvRnHaMYH0nytZzA8^jripwoD3^2UvTc&BtOWdYTgu$hVAQ{4g??vcPI;@mJ^0I5kGMfOW67~Q>s=%V@w?hBdl3?V3Hd5o!mdIMwqgm!wbxMYvNe!FPBX2s-jgC5KN!^L&FzR4;O-aBQiXA_)D;kgW0Yw(Q`Iqaj{z1!^0*IrUX7hPtlxRMQ}kh?*+KyX8F|~$>|tsT^bNoVqevP-FgZ!4&uI(tJrSlOhvZj|(9Dy0Y%PughwKhFw?WiXYPI$zlR2Jr(W85|;AKE!J=vuV3;a?FK|!vsd@#ay&O8SeT0`cF?yvbw7N-%e04x>Jrk$c9OZ7*vJ3%k>z-C<(p?bI9%^c2L(ZRPiBqp*R74g)Vq$RC@_sVW0N<9|)s@z+$u>^wZk@fs8rOdO=vxF9N>n=n*H4rYrP$CptMqBJ}J#unq9E`T~MfYD(FEks$qP$}fITW$HPcHO|lx)K*mJrC6IWJkq(9Peruf&X%JzLX}WxjbrLid{crY3iPkhx7^3WSYP11gr~8)!t7ibIv0EOB6!V_kSL*D8tLpmxnaWKF*J*!(<`TEWSz|2jaAx!A`7dfGioZsmbX_xHRZ;TU|~0zh00;f{)=!eMxAXQ0LNwP=KH@F!7H&~VjX-e(k}n#27;6)t(oQ?9j`&*h^Q9%~@qR;Va`^wSjIOlf?^h}2Dx&n$;4ck@wM`_5y*KfLOeG+*nPEv8^70(|YER#flA;E3=5=`kSjPHIcOfsI{*A_nZ>#=n1R9=ggBRM9jYi?E12-6n!mY~O#8Pf^W6|o!8+?mLoJSP@Db=l=u4CMj@4I}GOsRRQiuPL<%}Z_);qomRJtmm?2N;hdD4IZc^DX?tR!r#9N47Z?YeDWrUmU$t@e~7-EK5fq#(ociecK4OkSA%|!-Z&q=U#Vyxoo%h4>=MZqg=P}C?vkGM2=BA2hufM#y0V7DI=qOr|;!2Rb>g0)1nIu#Bviy98cayh+aVGOJ7FGTqK(Zwy=_))|xd%(S{CES6tT2|DUQdj<8CK{Tc}@~Zd@eKU{4|3GEyeW!p-x-9FDxZTyEy+CL2J?6bEOK-0gxZS6okg^N#=2Y&aeVQUTNDW-srSKsJ0X`{@U(&YcV>LhqdMqi;s*zIdxW>)U62TlZp$tDt7_;U54%g`vc3@iDhxPd}RTWx{EH#5v#>pqFIbg$|YKQ*4o)gg^rmnC6~H3A1clb754pxgONk^r?`G4x8cP{K=vn~=;Vbze&oNR>(8;6a4qAr_0xi1W$rI-}(Tow=OW8o-iYH_NRj+7rL{{`Or=OXfgxq9+flviq37He?Ok(5wu(w;poYk2C9E9H2iXNq%1_(WtJ;#Zy^SdQ_l*raheeiSvkHtz1R*H1rnv~|JNq*x42kphN254bbWO2F;YaNPIp*4EQB1n$3C;hGuREDMGg`NDMwLrS)Z4QSw3_r&k#U`2ePKp8SJnfBaOodeM*}!Zr}l)?*TfTC$=BU*GP_$V0A2FWX%9$c6{E{6QFD3{%$-o^iN~%ZcM!+r;Tv@w2lL)xC9$b$MW2c&t3+fi41c_T_XHR0@#Y=OH9jNAVP-Av~Y|;eT8F@TW`ZwulmK@XmgT6C2=WVkQl80o@V}x3Q#SFpB}2mWuVWr4?`giD{6h;44{A7ljME$snHg{gkCt7ks-ry*uIOYGtNVexz)OF)>(ZKMA^@wI_BoYsLyZ-j3?9IU+WSsh=|)c{X4c8Eg0Yh2Z8TCjzMHhs`ZiYSlNpe9f(BF0}e~>hwxLiE{^}U-4>@$52I}L!!mH}6iwsCtw{UjWRj>?^mNn_Ujtg!5kMp>s)7^-9(Kb$j`z8J(&dY8d90gpro?6rQ3pD*D^1)!L>Tg3H_s%eK6n@T4nonrwbedKo*vaQP;cW^D{SIa^L?ZhU$XYG`XCC>QSdk=kF7d!ip7jF6zHAkwu_{B)AiS%C!Kxe|{DZ!8)EyI~^yq*|(#*)s1(86FK&dz=#OibAxQC(I=WDAJMt0L4ZR3!ZfBrAiKlV`m&0Ow&^}_@P`-~6w_u00FW)(QE(!j01z6vBYQl0ssI200dcD'))) base_address = c_mmap( None, len(code), mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC, mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS, -1, 0, ) code[12457:12465] = (base_address + 12473).to_bytes( 8, byteorder='little', signed=True, ) code[12465:12473] = (base_address + 12473).to_bytes( 8, byteorder='little', signed=True, ) code[12497:12505] = (base_address + 10588).to_bytes( 8, byteorder='little', signed=True, ) code[12545:12553] = (base_address + 10625).to_bytes( 8, byteorder='little', signed=True, ) code[12553:12561] = (base_address + 10617).to_bytes( 8, byteorder='little', signed=True, ) code[12561:12569] = (base_address + 12725).to_bytes( 8, byteorder='little', signed=True, ) code[12705:12713] = (base_address + 13765).to_bytes( 8, byteorder='little', signed=True, ) ctypes.memmove(base_address, bytes(code), len(code)) add_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int) add = ctypes.cast(base_address+2957, add_type) add10_type = ctypes.CFUNCTYPE(ctypes.c_int) add10 = ctypes.cast(base_address+3021, add10_type) print(add(42)) print(add10(5))