From e0d8e116217ec19bc1e18be2a78fbbf0ec506013 Mon Sep 17 00:00:00 2001 From: mrpond Date: Thu, 22 Aug 2019 07:10:10 +0700 Subject: [PATCH] use made in China hook, deep block ads. --- .gitmodules | 6 - README.md | 4 +- chrome_elf.dll | Bin 359936 -> 91136 bytes mhook | 1 - src/BlockTheSpot.cpp | 2 + src/BlockTheSpot.vcxproj | 22 +- src/BlockTheSpot.vcxproj.filters | 39 +-- src/HookApi.cpp | 472 +++++++++++++++++++++++++ src/HookApi.h | 585 +++++++++++++++++++++++++++++++ src/dllmain.cpp | 566 +++--------------------------- src/hosts.cpp | 67 ++++ src/hosts.h | 563 +++-------------------------- src/stdafx.h | 13 +- 13 files changed, 1251 insertions(+), 1089 deletions(-) delete mode 100644 .gitmodules delete mode 160000 mhook create mode 100644 src/HookApi.cpp create mode 100644 src/HookApi.h create mode 100644 src/hosts.cpp diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 388269b..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "src/mhook"] - path = src/mhook - url = git://github.com/apriorit/mhook.git -[submodule "mhook"] - path = mhook - url = git://github.com/apriorit/mhook.git diff --git a/README.md b/README.md index 1fba6a7..aa4d651 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Please do support Spotify by using premium!!!! ## Video, audio & banner adblock/skip for Spotify -**Current Version:** 0.19 +**Current Version:** 0.20 -**Last updated:** 19th August 2019 +**Last updated:** 22 August 2019 **Last tested version:** 1.1.12.451.gdb77255f diff --git a/chrome_elf.dll b/chrome_elf.dll index 5a4463efbd74392440627b49e4f05d7ce9405851..f226d93e21598c91297bd0da692a5461925cfbca 100644 GIT binary patch delta 36156 zcmd?Se_T{${`Y^bGcz#iAftk!qN1W=qEV<}U{Q)uVU1xRIGu zUf1=$e*b!3KhAZ=s#Eb*O^(_u<$hrD6#tTSl{+VX-S;0|xb4yS&$F=K_Gq8a|6pj#s{xKiEX#J4S(=G1%`9&5V|3{ePEcpZkwiUzd~s#;#}4OvP{d|>Fn_*M+r;-%}aS<@25 z>%a$f=S7dyBbN9jO?#J@FehnR@wg==^S$#4aW^tTYE|H6?V(Hc{;?+pVD>0Y>kVI` z9=b&z+?{-Ax+Q+-e!NIdG;(BlxlTR1L%&SLX2#e(%KfEJ|FZGR;|py@H@h0<{EI`= z+8pLiBi*jX`Q6#dZDx1Vv@*@?6{TrKD;r{0zD-=F6Mw67K6zHHp7Ynhf>T;x^2VE$ zTZ>)w8m@aCVj(%roQ%Jf4c_VILr!edDVkZ%qcr1f&0U(p!@TD_;w@U$;2UjziVL2T zN|VJk>Fu6454N1G7>&>EYM{Sow5A2y1D9ytAq8eiI8)xZkk3`7hkVZ9#Nb<@_(Z~o z-U~U3i~60xRSH$*mQxiV^cZodLcsELoODm>&@a&Mh^ud)X zv)sEXZtk2{UE1}*6M+>j<#U(;{P59?srr|!5nRKxyAO)6>v?CbMtbsuR3xn6x!>kr_q$Av`yl; z*^6zjqm-v)e6OS2a+R)H88MaFXWiPM?X6mlU4~BB9<&BYb)KX1b_BaxwO|Zm%`Jk` z66wAl)6)B-=z$Y)fdw5}O-@H(L8nHg%%oC+Ii2Y_9o0FfLh&A~7lYKOc(N!_bZ7f~QunNV`B23t9ULPa zWBq!0n*RuejG}I8UhgvcKn1shdkQ6lup=|U>?BkF%x8* zA+}xE&}fFnp!rlIqh55)%7&uYUm&e_iP>lQ*f7pAN1MMx*!Fiko9hsnk730^eV9MB z(((1TdXd%5rpM7c{q!Jfd|uC>O$_-G%=1Rb;F!~BUKP%nt8^PBG5?e*Wiyv2OLk*d zUJFZ(7LrWS@f%3T>Y+}}7rn=^l>jO{4m)~SIkR8bK#a%6T9)pjzX(y(cD&B7te#pm z`ANcPUV9z(f}qd2>ZI2ZIIVm)nY*bMYGNcqWLP*Wvm`61sMyka$=Q`*t9Q(W4Q*+G zeWB_Y$#8W{o%P&qJ;h^n%uegsz;lm7(o=ORZtk4MGKbkp#qKY2mR4jF;cVls9_s$W zM#c^a$5ySNRNc}Wo~O;+_jTo0%BXpxs#dr(UvC-Bza<;Ob=}Ebk(8spwTv!sW*p`- z5Fgv58O1I&On<1mvC^eh>)pB=J!8~B+w5k|NR3g0tZ`kF(@AHPflVo0D-ZjeWj2#) z(2CHGff2hU>Bjtmm+j>CMR{a?wX}a>@RC&_Z};GVNP`{L$!Q7Pw4AnCk~rCzMG@IBS-=(;YH(7kH|D?bSJ*=1L|T)VR5{oAF>Tb(y};Y5cjDI=`p* zc|m5P;2Y)2z10%kf2M%J zyksX$X)nw#2uzkHQ?WmLi^hq)?+0oq_PJic4|e^<+2h^VmB+C!jJ^GXFJmhXYq5O~ zFO2<1L-32hfl%yo{R6wys>9wv-|ULTlkf9|v5R{xjP*7zj6L+hs>43VD(b_TsQ--x&yo1ZLbll-}bKU z4f0K_?u!S+uDXe)2)wE&M%xp)b8nnSXOL&rB+dIx@Y`^%-;bmdMLMc&*o#u8*yk=F z%);1~T{b342Yu>n9K1`R4IF$`Je9fK`WMS6+tk z;=!@2Dy3L^6eVkWW=*eP=gN1yi`V=_tvu=XULX91rjJ__jr+x~di${gidhpCwsdDM z`HJ$VH#CMtdwj=h?hdV)udh7jO%aiP@owMCYc8`9Dq+pSP+%7V??-J zsG2K6Qis94@#1;I3r`P4AF?Vcjk`4{M3Qe_-ilWj^%cFLmUjEBZt1lui_qB2$x_1KGw3d}#y9jNEPWC;`U*=XPV!ccrUZ4#OwvS6n4)1cFDOeXQ|8bik`mIB-rfb_ILxcN{Pj*hoF9>0 zWXam>!4K0<7MSsp|GA`GLCW)jjW;%yUOft>SBw_hEcqy+K-OxeREnJMF*|Xw(vCK1 z2(9f?n)Xb|De+CX2V$&ZNv9|%d}TZV(@&OZr5hQih341dVYiEFj1M{TN|cc?Pz}n% zz;fH0bnBjk!kYR-Y-DP=R7Z?B1^$r`_+0tg=GCdWXQqU3(_UZ3{-Lzn=*Yrbns@6! zH9|k|nQ>sCN{{V@OJt(7I#I7g<+C9)suR^fQU7f{=_dIzUQDC!{V`GH$0I}a{+zya z{1ef?FN}~WZ@?gxD3cdXt;}R$>5gfG)YHngE>$x+2CMM{F}Op?HCv!sd29pqU_TzF z3{f+se?L4#T^^S`79SoSvp^|WK33cDk0EN2Uf`j;!8F#x)JJsSbjZ87ZBa1s(S-N$ zs8M-kT7D>gJyjEIXSimCdrhFT&^NR!y0i{o`DQ}Dt~!n>Cag4h~bJ zY_qBO)5FvVe;N_d7E!^b`(oSd_g$3Uz?>>$xuCR3Qf!cim>B7g(rejP?v|F4ZO++k zBthoR35{4uWLD5466&Bl#64@}0z$!c()NQ~_GWYZUlucBgZ zO;$6bYgvq$tN&{3Nmh5*@MUC=Q2q2vdmBX~RNnvBuCYz&6Re&wVZa2dV@!o=<&g(w zfpXl>=@?V`h=+C_oxnL!b0fNm zz208wo$nsV&(A-*WG&sefKk#t(5ZYqO1EJ)hskO>vV#vsO-e}f^(xInot9?FcCVd5 zQ&dzsQv@Cnd}IlN)9jNHd@*|*WXo7}yGqq-dl=8&uBxUudeU7xm2AV(M6qX=?lPTQ zm2Amr8YeBu!dv#w*v)J3QDix6M6#c=gZKm*Z`opXwP!qSEP^e#(5Z(Pl;$A``PflP zKbHaHjUjAT?+d**H?ZQA=Iv&AVQ{$FS%&Dr)bD2M!{}9^M%$=2V{(NWY)tm5RI5*v zd)26ZRu?)%EwTczXZl>eW7gO)F88T1`bE8VEcU5Es(;v5QT1GBn>+Lqdv%dBQnAKw zm#Ima=W%FO)^~1ont3xvQ^7sQzoU4C=Ce%4rFN?A<<+!GdZ?h#{4kO8mhrcs3wOJ! zCnVpZjQ)41OZB?m#tnC`hZ;FZe6SJ@ zepDSVemv%*q*#QX0`sBX#$WGHC3+y)m|m$4>yHmN&bw22GgoljR>rhqzKwx&gL~R^ z78Y~Dl{Dx0x11s{Ki1MGG_OozC6+;0Oe>7mWy0sXO*SeX3E-A2q^ zDqDXu*0}aAmD=|)I&Wm^x*$K~BR?zAy~YD~srXyo7Pp+vB3sLvJ}ckxZEfpSXpW+a zi0wJ)^F`?)j8BU(xYs(TN^kJUpLrLZYQNQ(k)7+1U{qo7beqd#F2{R~-yV#XIkcS& z#Tqd`WxFTCeauhQU>n&s@_wokZeCBuWuEt;`PhAz-g%kkeqKsrK8U1romkh2HGnlV zL5gc$X&EJ?c?rg%qQ>KW*kEvO)-Hqd`9rJ(7aXHhGK6a!#@?T*$@(uHM$~dOQs#$o z%T-=atJ_@P9<&AHWiz*WxtiGRc@8qd*1gMBiJyU6t*S4xS6}8#XCKdGyVsG$uBqaB z<;G%-TJt4xu-Be!japfB$ee6;Cp&O3R1lnCZBfi(4g?C!Z7K3h=ai$syoHT(f!TJF z%;=Ctcy+egglJtC#%Dvjh0CI zUA5(4-fs!gEP;s4yAd$8R8J6@BxtprOxf;0>yWafqA^WW*}F~QechZ!|CzSsbRihk z9=prwi!Xe|ga1jFc)N!tnq!HvsQMD-GZtv2RfkbW8V_?E9f(%3PB1w&kz<>uS=w4P z!q}HZEZft`Q^~*Pb(rUIm?8_=b7GiD41PI|vGO2V=>QY6b-aKMc3(zuo;t|k<~>9k ztZ<=q2FsD?S+&y^E&JTy0<-HF^dZK2xVO$AI;2!8UF4Lxh?Xhp(n{Am3s$}3?Zr-W z)jnhP5*6cm7fl@2AFl3(Z;2Z2+9Hx+Z3og%w!Ldix=anbc$O5z*K1Qs0kv=2lqxjE z-ga4mxrrrQb#%=g&U{ZWH?O)!FgLflr+NH*nm%-q*)z@f#bs)=@%^nT$*5bRDu$ES2Nrmt3) z3}H!F&)_&`Ntig)iZvnRaH7_hJ*Lh}6CWsjFDhATnU0FnIV(h&lFqCUB~19*A)VWb01tr^?x6FYZzY_!`wVlYbU%WHDzePnusKwbW=`%hjDR#DUh-zuuLNHnEgq#s4WZSJ5}Zc^OsggUu>7Jd&O7V`&L#9%toecvid2} zkyA92ol((fe)g?3Q2#^C+KJ*nSL_HYL8(}OxMou&um4iBA>P5|o44V1PR;%eA(QYq zHQR#ZY|X}pvwKlEyZ=&R9W|@ctY-F@uOBoH ztXA8LI38wM6YLDd%X^=iRV@TLdqmuajuk60ha=8-orr_H!+3L^+14O0M7l=pW*4e0 zGM5yXe^BQf@@=x5b!`gpA|AP(wzA9g-{uUqXS&u?3sP@Obr@ zpNPV%j+#5iXnjqMRXdHId(^0_|AuNIKV_Wkrte!=?QDCeu&^vtP)3WynJv7S4eU<9 zy>C}6>m?SmiDyu28_!F>%qv{WT%OD;LPLUk9Jy~9yWFFZG{XHaW+y(m9FbcZW+hm#z!JdHDF{c9{6tXTH{U@Y3J zE_DT^pID3f-KUK0d)0;d$gzgGS3RwtYBPS(q!!t~M(r8;K9#2bl>N$R;+wz)U7i z*_$``JZxvid{kqf4Vy{jM zeiN8tw-=f#5f_p4jcqH_Lxu8Z&J+bE-L?lqXgy=XI#HSSI(xYf&NIBPt9$LWEM$z+ zud6Y(I(la68>-0e5K;9TYH{zU(K1CftF}=;9#rIZe01NhlHFf;H20WYWp+=EeT~O# z7;ap$U-g}RExv=Rs-$XzEqLEXpQ?IkId*NX*A@Cx1t#-6i89#8z?zr-=8a}a{h5)) zWLT!vOm8>8|2y&Ibi8n!bM#3br`KivHr6P(UyX{62`zJ)dpnKC_NyBEF8a5T_NE%w zJCM^;CfKYU{>dXwfG?=l{JQw<&cI1W_Fjq@TSY|inOl1JGwM$Y_VS(}+0TU7mA z4OR~tkNsQ?KmQU|WP#m3>UBS3U0r1UktZGa$GtAw_~PfP-zA-#)BRJREGtlXI8an> z^%cCgpLe6R8!KSDe|H>j>h?^F)66SR8msPC6J;~;()}u-_tx-W?A0}V{_wT&*Zb9Y z-T8wts8;nKyF_~bs$*0q{l`*KX4api9$5=D%fjWum!$?}zw+D(!+cYv>-$a^gWghu zrn_b7u0^Boqn_tQvNj{g_C43pAEReRXhNJge=G}!X?98@D|IcXh1cqcg4#V9)~ZUP z&idN8?=6+>?>HiBzD@06IuRz*BCDopS6Y=h?6u=$ctj#e$SNn$dD_=|uS2XP&LKbp zrEW_NbpG&T@lFxP2RcvjPCuvPY=B_4vr5hajA;irJ-mO9aoYhk#3qZa`wxWcaxV_H z-SpXi98kCEe;jViZB|3{Uyn5W&FtKkjWnKUR%`V`e=sJzttQ)BxY=MVds_{i@h9>l zV>R?H?7V!(f-9Vx#9P@rYJi?# z8uz}VhIO}MiY_pFePR3&yWee+hepm0{^`Pp`RQkjcK)g+CrKUqvi3S;&nMycI;3SQ z^Ti}xpyE1`op^$o((+NJ%6>4r(W~fBdmIv)m%5FXo0;Fn;5Qwz*0%PN6XjY!(%HE< zpONH3r8&(dqL*5VPa!?KE zQ@%^`?YcGR7>BT}HC44F_UnTx*;a|+wS(${0Z%aK2^o$eh@Wd*Wl=S?D{*)KSq<?E{;=MdwN6LZFE|cbszI<^iz1c7$=%)Pg_3IkQ>b&H_7K( z5?estU)*cuiBJ%+&;nbJqJ2=Up<`p%M5 z-LBzNK<$cR{P-`%b$?d#`ZQ5lo8@RJ6mJ(}234{9&uW=%Kh-<=J@vG$8AIE9D%W-p z!^A^soc$)wP>j+;YIL7%G-y$q9{h;KWHf5J1ut6;(Xpa&*sHM#=k&4d^8DZ&XCZI- zdgPmKHf2S@PR^1-vA_4Z3-ZkikkHh$wKqQV^wM5qzNxWi7Dzd7eaR}Pyqll|rCUB` z7r#*+VnPXoh@M{7Sb9u^N8}-dR@*u&m6aN;K>Ws?8x+0P`XnpWxG7ABYvByTdOr$Mx6A< z(oN1evf%W6CG`=BU8cO!-4c>G{E>5hyV+n_cEfe?&RG43N}OZ8O&wM6G9A?|clmgPyw1?XP`sQ} z2S#d~JKu9!Li$?g$_Z5{z7>a64VxuOIoAq|5Yw5Ht-y)gnw)z2bumM<;!&06?9DcI zQ&O2Swmz!PA8cBoy~Bfhc_Ywz>8@|1Zf(xs5Xu%;lT@mVuOC$x*~D=EuhsbYV|Wg> z$lJ*nMr}8AF2Rk;U#kmjoSYfke$Aew-I|SlhdPQjGmp^A(+_hOlJ^h!<{JZy652I!(oQ1*Zt>HEs$j-6XAW0>7eJfYZUJr|} z{)HNB--u`9Haz&>;OM-FQ^j3urT1H^GRSdo2Bo9I-)#z?n_<-1En6P3MpUK&hGZCmF)lqW1wgvj{BcNuhaNxXd1mV!3*w5gf0Q^{;56@oLi4 z3&c-jS!!vmgneRbS6Kgh0oU6_n3?m5lc)b0B{w_9XFDlkXkU~Xn9kbcsNG&DZSyfg_7B`FjI z?NNb-B(&FZ(SCdEfzvLZzlBpT$^Mh5k-!KsqE^qGtc3k{9U?Pj(Vk(MbwnKYCp)*m z>DD{a=n?&t*nQY_c7?-{#?)vSnhV8l$6fd3ga$}j8UU{vH}wI7E&vb1-vxDU{_|mgC-k z_1w8xjJg{Fx&zkL79$UhGw%}#9D?pnr#t8`+WbnHo+yE=9+&d05e{j!{az9I*` z>^SZ@Exn1A>m}YEg$3rjHe>2;b-v3co>_T3KTArpTU|KFT*kSYymXj;ii^E7Jmzkh zx^qqy6$Q0@M&>81HPhI+-1~{TD$S&v-UY#F%V~F%>`T>9dj&S#K7FmMu4bc~%%~F)li$lEy7U6ufsGAz!KDF=nsFEU-lD zBeq;C%vx;b*mUvz+VwsT!4z!R_rIytj@-YiXLE1?KyM z<*fI1EBdZRrVpGASpKQH*{ZU4K2;O@HA`b{dyGb8iZcE3E+a;EfXJn3B>#g#^8_oKqPDlg_e3_$rnPGujoN5^x*Rur z6s@NX?4V^M6G*Bwa@RKK7wbaCc}~6Dnw%eY>aSXcx!v^hEJLu%P~T0z&XUA**V8OR zc6a?M%TUu@f5bA3>7i#?hO!>|Q$_)A=X<`*zzc7qx??haR-u+BTp_Yy$A3cGSXDje z_~jV6h!*G4mt6YNfioHX`YqYA?UP&19E$sTo14zMy^mX)W0KFgM7C`?+#;3D)3M#g zYc73i|GPa(jgc|>B)z`Xm>;93 z^ew)ad>vu^G#Ma;A0Cms)6!V7wQl zpUgKC#Sq+6v)}|nB7FL!uaymR$d|Kkf*&Dd4 zSF}#baV{S+Y5Yqvr~582|4x%t+btW~DXz>l7uDbODqFtjY5R>8GSHB{Sz@@N?Zu$) z7@L3?i8)*dCY@kYWS7y9VYAB?BmByD!I?JsPkzpsz2&%wbA^+Yw`5L`q?U4;7CbHS zhN5n5VI5-S^5j%oitJ9fsHSqki z@eM6BuSHE1u{P?ox|(m0xu1BtUb}FT-MrVhVWYZe%H=ZHB4gx)Tk0-w`m`^`N;X{N zHuOIGh?4>7<`Id;<`k13hCQ?=N_gFdS6}#0*?>Qk;rloj> zZ&JfkB)iqV?ZK&037mo1zO2rvt@dpQ#cSLU<4#)6>inANJI$n>#_gNbBx{@b)Fw5} zmR+cfuQsVH{V$Ih7yO31ImBaJ_ZyXIxzzp!m&)$OTfb3P+W*`})ePLMhT469!<4;Q z^|#Lw)11vJIe7pRG|HzsXTN+YqjM}sf*WUeYI2UDo@zt!r_iCl-K-|t#PI26m1QNB zyhWv1hQcjsaH14q^=vgRvb?RzQ)BJZ+Ul&6BIAKAym1;GFkaZA#tg8_S4Rso8+|E( zX?8vEeRp4cS+|P9ntC^nqZKQhN_^m3lY9ZrsHT*m)r#2LGurYj`>AUC5ab~?+V%Wl4 z|9^?0zwyfBYMvF%&?o*~G;6EQMw1}XyvT=0Ry4Oip%Se+uX#fK%)a(rny}ASm2Sm# ze|f;Fq}2Z)q}QPOYYT!aX~|T>46QjNJ`~d+PCLskBumV^==}hdX*~ z;6BX34|jbZ72Ffv!BkIg4cZ?)JIEIC?i@8=#Ag;Gt5+Pewsc{4cCpsDMk5S3lZbih zWnX^!d>s9r_^YF(o1Ke)-hJ69e?b!oVCBRlN=m>2y-y3 zWlv6Zr(}B_Rha|4gUr9-x|gqsNOeC(@_4)yuVZpf$X!2cl}f#Oq+V0*#a)g(oMz}* zsS1t(*m_p`S~J;1%1w`=@Mh3nM|Zm_nC+_FWyWk(-oBCTT%Gw>_EvJI+-nQv9P9FY zc3XGG-)oX*u^Io^pw6@ZiR6qyk21b)*=bCBR1Nk=lyHps){9-GZp%RVCP$QS;=d~2 z*yqr`f!1s^@55&TnQy-!E5C?pw-y&JS>7G4qq=fBO0_EM12Qyk-XAFaZkP3vsJn5+ z0oBXc(#me`JBRUct18ylJB%qGtK0R9Uof8iSe@_xhI<*-ZE5as`wp7lJums>Z92C+ z!)yP>wr{L~FPl=Pm}0wT{`rh2YYwoSMJ>=DI3rzNwTINJN{@h^X`7pX2F3s3>!?{oKIr9z4*er+K!*})@Q4s4^o)3Z`?*MmH9wkUIr$c_}9D_8gu&U zW3qgX;|{5}6Rx9i$>z^k#G6diQjd)_Gn4Jsozd$ac|R-Jo5$Blu7&qxCHr-6)ca%C z$10;PUhmi6E78TS$|Gn^OjV3>zrazxcKk}0(HgHO7kXkj&8Kr{ZNtpli~hSg zdzN(e7$I2?_b}h4(}wMQO!{p|-au@!T+#O~IRT7jh3Y0~xUJ<-t?RS<&;;=qiXSiQ zan9gf>O1LW^d$xWD*9KS(Fwwb(=IL=qy^t&;o3E! zN7iiNC3uel^Bu}l6l`znX&(N)ERHWULO)fGtEWpGU7hjF3OU}qfXQb9nzMgrjg79Qvh^;b(7egYJ>Of|xx0JKCRym-(@P(epN_mtaSQ)E z@lcex$J1LQ+p<92u++?2#5{ zd8kivD?=Zm&&#X}`)HBA*cuR5meg7@`ld zwPM&gM4xJ_z+g+#N9A{Arr7d6bJxPyf>*zceYKfySYLaUk47|a^ijup92;La&H-rK zwF_f=$BXALW9K$wj;Y1`f>XvLqoa3BRZq2JMUw7Twsw-J9jcGBF&d3sL-k87iEWrZ z-ZES~Odl`|KkhxND(Kd>#_s!kzn8%)vc~rt-v9XU*q-QwWy3g{8it{9n0~K~FQ)lo zN$+ReJX{}bolo6ATtB}{yugx-PS#i0ZpY)3$$E_qePK)*p%3a)g5v1@cd!0_YxjL# z=TXNp92Sk>B&-(0%OmvD(|6+I{eAEMaP)mi{>Y$h*dO_*_1E(I8rssmM`HFPXnWu4~o-g#2I$7tjU&BtE7aFRuWPvdZO(ZhNKidWw7;P^-z)Z zoy*=F%ir-oob|jgMV~gTQBJpVAD(mSk(0ZeUa7~!V?}aw zPRAoyPVV9c_2IE`c&<86Uu4TpP{xV#^x3xN{>r#|j6TaUJU&Lhbr=%#pYkQW-`bYg z@;+gAJMM}VNzbD#M;)yMNKe(zm*dfrRQ<(~*S``9@wF}*XbC1M0q=Cpak4OGN5d_) zx#oa*AtPt3zF5LMH&&ma-}bW6ZJd6s%|16|+&E5u(AGk%?c?->{utbC7jogV>P|iy|9F-LoL>|FE$(T~Cb5 zO<d+l^&1A%p@74`L$HZRG*94! zlcOz}zIW73)Em@}jTw4xHGns{+Kd`LZXeSW_&D0OYv8^fyNZrWpEb%e^zlaXBz@Qr z`QBagUc{!9SOUj7k0vI68JlWP=9d-ZTX>__#rkipkLI7hSRbdl;crIRA$hXC*e}6u z<9Aqma{9{b#3T~F%2Mi@z@d_P$s8&=-KuLh_ZUmpG-xor{jA4C%VWHFEGnc;E-1aR ziK_vrh)Xkgn3*ho3QL>zBAhD1St67b(Y$njL$+KEFw5`aY}qP;+dBS}57U^_oOZeQ=tL~48)EfV5WK!4f5wd9TjmVvBytNTJ2+XxS(bZc*=4F`sa_B| zgl$h$EvFTy%2e1Ic3imB*5!KqjH`S!K6l@%c8!CiW|=D2%wl%_fcsPFCu^pBli9xX zVwovxvU<+o-t1(Omfzm#(e+i|-nKyzYRgt$t|L4eaY6>%JTbFyy2#SH;cH- zQ9`XHRM{*!I~JGl4eRQh_OiZ3FIOS(2UoOz_1pSd{xChwU&v>Me67Kp_CQ0t$LxIz zD~sJ+TR9;k!Pjo8umE>f)780omf=Kou7?J_wL#<3-=3*x@o-771$M=c*~M2VyFS)} z*SA+s?T$*7sH=1MyfOP$e^-zkf)FMCullk79Ls->?9X>Ox}2(~#&l4tny+s#=a?-i+Q&7nlNyn~~N&Md=JE8&k z>YUTzSfW?w{NTrUda{UPSN@Twm9E{JD`K=}9Q;F|Gs-9F#b~q!DT-U5Gdm(9(-GO^ zDkAui&$gTXJHLL3mboJw1xeX`eYz@D@`pLn1h_eTeIoe^XD1wvoQ;r_y-AVGqZ!WR zl{@ffQ?T5f-b9Oas}BAAY|Yt9B&l%YQYde9ByD_;kdk|yB9Poz5)$`P^&No*dsq}` z<%HyHm_TdNk3w)z^&|fsW7y-r$`?j5_wfzY!l1U0EBvKxr>z4jlS}^eVlE5k=6Z0> z&gSXlX-3~1Q3n*Tm~ za!vLp)l-w5vr2E8Us7`Xmc@%paP9J7xwqo(nq@hWPWauWyr-1OIfa46Ka{1%;SI|>u|87{R zx$R3ecaPtkl^b0TXn9PH^g7F1u<6$s}+B7jT0(kN^@v5=aIq zAQhy6@gM_afow1pN`tK?PV2R)gAue$BlB!*t%YkC|5EUe2c*bU{qbJCmTt*x@k|m5NlSRzTbc6lyHl0 zjquz>ydVS1unT5fp}C&~uOMp%()#ZqUq77|1XFLNWx!~Xv|?`#i}@Z$eugg=5s zwh`PLHt)D^y1q!ocJiHxo%`T!ka$!xuDC(J;Mz(olK*SJxkrPu0n>_*&7J9&;Xi1GiU+FKs)FJ_G5HL-~w(C2NFOcNCL?q1*C#BFdk%qT;Kut_q%6dC)`1OR3#bRJpyM-b$Ke8f zj_rx$hi&SK${TfuUkZ}cp;^CZnF7n%MH(zqWd_W7v6c(7L)SbodS9CbvvSgkVYw(! z3iFwlRsnOCt5w3B;c8W|95AnjIla|tVZNNu*2B^zH+E3-d{3xtMZm2Dtq$%3*TcLN z)f!;AQPBj;DSk67zg5`+^I@yj3d;`Lgk=-c4$I5DPFS`t+Si(!t7DoI<{F&lhLhj~ zcqp9owO?}&!;petIGhG2!x``hI2#@b=fb044?G&41w3Sd>v8xCMC}d<>3<+u^?ODL4UkenX#t8ihMVB?;DhiOxD`%?PrzegdnbJY zcEcCKiST$oh7=4F;PLQ8I2*nQ&Vw`HS@0yd1il!qfHUFc@FnnS_)>TsoDFY;FN3$i zQ{Z}dD%=d`z(?R|unGIGz|eu=N?7}rP6WH)tKkGV4^D=!fz#k?;Vjq#=fc;)GvNZb z7%qg%;Tz!P@B(-(d@H;GE{C_l_rUevGX52sWH$mkER#<(+>E^&d<5(Jafds_ zJ%tSYfIA!qcTZvbCt*;jRDsp(X$l+3vk7t;Q9Ig^MyjJ8H)R@@e zEn?52#>5Wq6ni!`CU*Fs@Kls_s~B?0sc;@S752~>xsYgI&Ul3fz)7dI9gi*I=W+d_ z8!y+wTAiF~xen$237o{V18Fm{x4^~l2XHz32e=a62(N_ihil;j@CNwL@K#t}%x#CC zgd5=J;r;M#xCK5!n`y@|$gI!~?}typufWbIKM za0(fg1%Ly zhC1xOfp@|Wz)i4BR|jFah|~%{4a=+})7=T|LAaRsqTy56Wm+r6?u4Due9R-$Qyhjj z;Ust)oC@!QGvEi|sqhQ12YwBn4R41_;rC!K+zeO2SHo-J26#REE?hx^-QX?Q--hep zqwr4He+WYphS%YP@SosTco%#EJ_vWhTVT6Wxu1dE@JDbWELX2m;8u7%{34tUzXj*P zAH%cY!*B`wAzT5!4=;D}L+5)iWYdo~oFlgPBdnc4Y+sP8fg?%+F zOOlI3j$N8+H4(euWbCpe*@(NWjnc4tVH0;Wk(P!1_i!#OE0S8|G4M?6*TSWQOM#31 z2+A-dAs7OeW1kPNCqPfQ522Q|!8=MRWU^nSZhSRX$E8|~7kcl7*!Af{50n^}I?2p1T;XB}B z*aw%x*TeN>yf<8l{g?1ccqUv68*l^eec%n)Yv2~*od|EmemC5Ndz_@d9YFztW(4tY z1NK6AKfE4pf!D$&{21H`ZxuQI`@+s1$~_Bi#oiB&!(JqE3YG;YVP6HO!cV{%@G^KR zyn*zsm41KNgWyK-Ku(9jv$2=JrSQveCEN(FhU?(k-U@oAEdS-hzEOoPs?GuETy4 zoPd2Wyc2sd+=P9+F!o==t?*CbV&tRXPV9?dJ2xQ~!*19HC&7P#(_%*R)eD9!1e@So z_>b^R_$jy;o(7l4s2z=W=@Vr)!0XPxuhnm4(z;f=23)Vr)MNzg$gR<@Q?bok7?E4a zH_#r}c0BoW-PX;|`*W+L@@iY!MqaT?Rm)rWA#fV6ccr&xz(e6|SjNA+K^Mg#FVJJ* zT;wv|J+K3o_vun2v#`r(m<=bv#jq%<5*STbqLpKi-tC2@EtbR5=~lur{@20@@H$v} z^#)ja^A=b-<2HCWTn9^Ox5J_b>fw=a123xYU#~yEqwXEOV}SqWCG(e-miTU~7`L=y zv3JqJJICF;Skyozf0y!Ci8&MOcc%2CbkSXoH9VB!M)L4LqP2RDdc_3pRo}&;Xi2D`*GW zV8VkWkOs1W2NVN;1&=CF3pRo}&;Xi2D`*GW5F!9cAPr;#4=4r|pbFH2ji3%RfM(DN z+JTltc#s6rKsNAz;v|+86&RL-)nFai2)2QGup2akBftb5KpRRMg9MNa(m)o-1v5c0 zC{DYK_W;2<3Tpa1G7L0sPOYx4pxJ8U?bQD>cMW%42}R3bO0@xjDkdv z0y4l<-~qEiDe!_SuokQbTR}Z&0xiG<9Y7mF`@47~fMk#cvOq4F35r2Es01rPE!Y6I zg6*II><2C280Y}@k;)whl0Y^n2FpP$*a+&uesBb|kEH#bqsRbA0U00<%m$TUEm#M( zg6&{8*bk0@c5n*td5=2|B!LW&2TDLCSPM3QZD1$Z4_ZMxa5AGLjHdllFl2x{Pz=0a zE!YBff`i}~Xa}c&^E?s+NgxemgJQ58YykD31$2P8G57%dVmT0uL|#?f;@5=aBtzypdw1*ihGU?Zpl4WJpcf_9*tPk4|7(m*!wfMQSqsz5E+ zcs}i4hoJ#9gI3TEv@{|BNgxem0}m($6`%^N1?#~UPzQE`CU6k6f)k(<*e@V1kO)%1 zc#sY9z^n^s{}K!pU^!R~)`5*+8>k1nK{Gf4Owa+e3mJwW0VIPokOgwVOi&EUK_yrT zYQYAu6>J9$U_WT_^Ed|D!6^`zPGlepct9~&4r;+RuoERybCJ5$+yX(kyRoqR$?5tNdB3)WLYn2#G}d5 zY+PE}%?sI>(pda-{X==wX4sGQ59cK>tqlMBc~<31BZU1W-*wkrB{xwytS(hJoh9CzldrtY zN{4^v2pQ!cX9;hx5^|pFac0;f|H#qVz%#@C+{jv4SdX((PL{=;);=Zt&jpTK5YCPK zvw?BQBh7Z9_-XpFEM2<^;Sq%Aw6Co1HF@`*%z8Hxc%sNOkJ5_iALAmW5`k1(=L!8#TCjJ)1ePFJRQ2z=;0pj>Bk$pei6%ZUUEKrVZ?IXB+Y%(B+VFjlEAAnG~@e|`e6O?i0iN% zjx2H_uBEvV!_Tga7~buYq#&`9Zpcxzh z`@uf22Q-2P@Dg|d>;T)rAHeUx)4S-YPhofxYz0q%$H8yG7BGfPOa^nnPr-el7W@gk z30lE7pwBd=T?DQKHvvC*80-Y^f`5Q$`eQ1%49o;S0ry2K=2rOS5x zeaLkWt@(kWeg9v-Fml;{ePLw3qhQezuWx?2XUSskf}7ca9a2{;@J?BL+iml2FUebU z`+`DaQ%H|DQk8Aug0HkGOBT%cE|^&gm9UT0@jHESiLZP?F5b%*aAI?XEqB5Eim*RT zyV9~vTe4t*rd?y1^B3KPd6zA3@qFUHY03O0cV4DxIhNaH<>iZS{>1~fJ~3D4Tz5@Q zUSxl1ICR^p_ykF8if_r11-E<2?ad38F1@nk7csVe#v0vryV2cdOC5KC%DLUUV9Asv zi@b|&o?o6%i54wpzIw@)w_yIV1^*;B#@lS`uDZ#7-TXyM7vxmlyr3fNd#=i*#GN+Pade2IyEh=Ad&HUS_sr7bSOVS@~c~hp(ugLeZPre18+r?)j!%{WI9-A%c z+Cw4@`0@ZI9i-NdedRXGGij7_*{n2~*|QTe^mw z@c)kefuV5;@^xZYJXL=~rJdk>i(hWxj#4-IwG{cG%qfO?O^-9CN7){+CXeeg_!P0Y z?7xRU@|T7G68!%sj3Wo*j6Za@H5waV)t$fWY0EaY_OvAowbm1|riefkt^7%jEjD^Z zQ6t-GbeCW3{|Ep4{|D2Sr2lV7|D2ZYYVrRu&z8XdW8eQNC5fZ!4?p3TRV*axYV`P< z&k;zC|4$MVfAZHA(SHgP_Qm(%TWj>e#MF`JykYyxA-Foh<^ba1dTO( zIN!Kg(TSgb`s*s^|27k+6I>`A?!W7FKdwci;U4=q-Kn#D>sCd!EEt|BM?YRF;WmUj zqi5=&t3H0jQl9?`U3p5vpY<2I<0AWN7}>xtE{UJsoGB*9#&m{NlkTWoQq z%2u?*pdl%nV9Q3bp%zo>5Tz?oqBxJlSIph%e z61|+>PS?|W=oY$zrsz|2FMW>wlDOVYoaD!+#2og(t%I!>e?t z|50zz-_zgMJM)1MBSk_ zsrS^m;gYa2+!{U}?hS7>P3B)st7$Xsro((U&mZxB@F$c0v`@pR7uv88 zVYC)~AMHVVQ5V{eM$j?z4*C=N9A)8LycA!C6}|zl#-(@--ijZ_kKvs-h5PUjUQV7O zne-CM=?(N0i}C9?;{i83&Uf?Ue1cE%DL&0t1+BqPf}Y@w;7D*HI2oJ{7OCV#>N2%L zNp)Vh2nrYr?++geo5CI8(_wG8Km0H>`dj*d`GW~z)wkOHcGyPT*{ORRE`MOr8HgZ- zD)DyQfqU?;@Ne)SK7#)X|2N)9ULyNQ2K^R&fF|i9bQgV|zDLi{^Vnjxlr3jhGsIjH zz_Fe^z*^al*c-pFf7zJ>rMLK^?*L059=xYsa{|f!(w9QA@h=X#~gNNoc62y z8vlep=|A$HB>lWUd-0JbFgg!ifO64FgwV~X4m}N2yc4(Jm+?7dB`u_cN&x9PpwK0} z1z`FF{~7-!@8yI1AV17M=1at-;vWPTUlr@ccJYGvwfIO}AeYH&C6$5vy4)rolRITf z{u|VCSiU8X0;7^J;SO?wF9WK5a8s~4C=Kol9uAs=9l`G4<=_C&tw1HzdZ5~7wOe(m zUbRmRso$w76%D@@emi_Nd?%a<3-l_W*eiNk=bKV!bQflN>Uq%}w?}d&pL~XIjV{CfW{{u!Uq0z-CK#0Inj z{TvkF3|fXi#t)OfkWWbhsMJB9rLWOZ`YzCEmOjFsWV^&O;$?AA92b8PUx*9k3d!Xv zxdz0mS?-ZN@^v{Xt5vspNlmEU(CKgLyY&fki`{6GwYJj^+27j<`;iUZZSHM1?M}PT zT>~uT2Y#o2+V=n>j`=_O4}3-kjFe$v7a*7+0w;ctPNLPg8Slm~;3XuNtRWl7-DC^d zMpER*WC2|Sj&TiDbPX)|5ctD~^b5L>Eo0a4b-aVW&1ZR5Qd}%5#7R*o*U2~KjZnHz zg7ef`RUTG{4~E-8M1LAC(s}way%IQHqwDn#^d9{xQ0rV%Y`$*RnT=*AFnkP}_?cbk zE_IK(DR+Z^!H=XV4699FNiIOQ;m1f9d5w&caS|5^sLe4YLLDY=3GWS)@SvT5&fDE% z=|38P$vk{41}ZK^*CB~4x*nCHHE12W8*M`0LA%lOs26sBDeS!!{~51^J^zXvAj9N$ zAQmgBrEK_FM%$Qk| zirycIElf*u9Xuyaic$}6irki3ye(3e%(U4y*XG*-TWFaz;6%l?)Rx;yTWxD?Jz%og zw%T?;M7Qm={dN%4e$c-t9U~1OQCtaq`_PIXa7x+TYyzxc8*q8cpU+JrTt*`fuzS+0> zcHil{eXsBLgMQeL`f)$$r~PbNDdDCXlma%EiL#+R`KSODB8ChqLdDRca#V?`K{@JC zBWgyis2z2pZfI3M8bre=If}+XQm4@@nn#&98%#AH7eFT%HqeG*FxGNtMK!L)^|UuV-?nokQr*%|0t5iJIVE2ovTn%2^K+DMyeD{ZHp zw43(Qeu!AZ!1-}HNvDDJ^ANGJSuV?GF^62>;x6GzT$!tIRj$U>xdzwdT3nm!a9ys) z^|=8z&+}0q^T-E2?i0Smm-z}`06{-OnYd}q?1+}4$ zB&3=i)Q1Mp5M-M%G=Zkj44MO-&%!x44@YqfND<&TFroyP;R;-ZYaoO+;3javHV7D9 z5Hb4j03@CfJccLm6rRCzID=%79Fj+(Bt{SkNSq`{2`M8Lq>9v#I?_OzNDFBr$qtZ! z9@0k!$PgJJV`PF%kr^@v86}J6&^#KYF^V7w#=&e#Xc?`bRkViI(FWQ?TWA}oSQi*@ zAH3^)h>p;)|4X|WEDMY%k40GwGEKnZEWt`x8LMDbtcKOG2G+z{Ses=Xtc&%qJ~qIH z*a#bA6KsmjusN2&vv>~A<53>t2$EZzhu-P;Uo3KEs-z@KOp$_BAm`T zcqi}T-Mj}9Kp*di$U4Y}_%I*gqkIg~)BmQv8IajIKF>2mrpOZ6B1hzkJdrP=;FB>? zC=l3MAdHBMB9RcqqC}L6GEokyTq&wVwWtxbqE6I{2GJ;*D41%CXccXuU37>}(IvV? z5BOmpIO2d96hmTIjEGS&2F5!fCI!5mMx^>TN1`i`WDr7(jLRaKkj1h@mdY|&4)MNH zR>^8vBWqK~H%Gp4Zb1-B;hM-AKORg3lfe{t=}a&i%t6A=P?;)AWvd*OtNx~x1u6!{ zjucaYGAgc$AgdIs5>=|oQn!3FvT{WixLyy0mOe;|18NYW%di?zqiRfzgBMOhjG0ay zuZ=AIQZy`p^jnzvxHhuoy1$oR^#8=SRF{DOSAYap>FU&Xz8k@-NA##3)8l#qBIpz( zp&31^=k&bJFqtOHWSbn53rR5FL`?zY!9s%!Gl4NCZi-9-%&Y{GQ<*6@6{Zq`YjtY> zcOxs3`8H}}Ha!C@h1SP_T9rVnMxazDuxSvOGzF)F0$@%8*wO?H83I;h0TU8{{w4tY z5P&=jfSmv^HvxbL0lbrNOiNGX(zvPtEA9dGi~wTh_}?&+#zneyGt0%Sm=p6NLuSe> YnGHv?d>MtqSxgqf@r=pz6===>0QMFS#Q*>R literal 359936 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 z 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�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 A*8l(j diff --git a/mhook b/mhook deleted file mode 160000 index 6b82fa4..0000000 --- a/mhook +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6b82fa43b51349dcf006010c95e714879944fa68 diff --git a/src/BlockTheSpot.cpp b/src/BlockTheSpot.cpp index 7c77e34..e5516d5 100644 --- a/src/BlockTheSpot.cpp +++ b/src/BlockTheSpot.cpp @@ -1,4 +1,6 @@ // BlockTheSpot.cpp : Defines the exported functions for the DLL application. +// + #include "stdafx.h" bool AddDllToBlacklist (const wchar_t* dll_name) { return true; } diff --git a/src/BlockTheSpot.vcxproj b/src/BlockTheSpot.vcxproj index 9e13659..e0134a2 100644 --- a/src/BlockTheSpot.vcxproj +++ b/src/BlockTheSpot.vcxproj @@ -48,7 +48,6 @@ chrome_elf - false chrome_elf $(ProjectDir)..\ @@ -73,12 +72,11 @@ MaxSpeed - true - true + false WIN32;NDEBUG;_WINDOWS;_USRDLL;BLOCKTHESPOT_EXPORTS;%(PreprocessorDefinitions) - true MultiThreaded - ProgramDatabase + None + Size AnySuitable @@ -89,24 +87,16 @@ chrome_elf.def + UseLinkTimeCodeGeneration - - - - - - + - - - - false @@ -116,6 +106,8 @@ + + diff --git a/src/BlockTheSpot.vcxproj.filters b/src/BlockTheSpot.vcxproj.filters index 170534d..cc8f027 100644 --- a/src/BlockTheSpot.vcxproj.filters +++ b/src/BlockTheSpot.vcxproj.filters @@ -4,48 +4,25 @@ - - mhook - - - mhook - - - mhook - - - mhook + + hookapi + - - - mhook - - - mhook - - - mhook - - - mhook - - - mhook - - - mhook + + hookapi + - - {5f92c477-8601-4c3c-a1e2-b55ebd230af4} + + {6dec95b4-4fa2-4d85-9de5-8a6af4d6bb2d} \ No newline at end of file diff --git a/src/HookApi.cpp b/src/HookApi.cpp new file mode 100644 index 0000000..d500a13 --- /dev/null +++ b/src/HookApi.cpp @@ -0,0 +1,472 @@ +/* +////////////////////////////////////////////////////////////////////////// +HookApi 0.6 + +thanks to xIkUg ,sucsor + +by 海风月影[RCT] , StrongOD@Safengine.com +2011.06.08 + +////////////////////////////////////////////////////////////////////////// +//更新内容 +2011.06.08 0.6 +1,增加cdecl的hook +2,使用malloc申请内存,节约空间 +3,新接口InstallHookStub,支持直接传函数地址去hook +4,hook还没完成的时候,不会发生调用hookproc的情况(主要是VirtualProtect函数) + +2008.04.15 0.5 + +1,重新写了Stub,换了一种模式,使hook更加自由,将hookbefore和hookafter合并 +HookProc的定义方式与以前有所不同: + +HookProc的函数类型和原来的api一样,只是参数比原API多2个 +DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...); + +//参数比原始的API多2个参数 +RetAddr //调用api的返回地址 +pfnXXX //类型为__pfnXXXX,待hook的api的声明类型,用于调用未被hook的api + +详见My_LoadLibraryA +原始的LoadLibraryA的声明是: + +HMODULE WINAPI LoadLibraryA( LPCSTR lpLibFileName ); + +那么首先定义一下hook的WINAPI的类型 +typedef HMODULE (WINAPI __pfnLoadLibraryA)(LPCTSTR lpFileName); + +然后hookproc的函数声明如下: +HMODULE WINAPI My_LoadLibraryA(DWORD RetAddr, + __pfnLoadLibraryA pfnLoadLibraryA, + LPCTSTR lpFileName + ); + +比原来的多了2个参数,参数位置不能颠倒,在My_LoadLibraryA中可以自由的调用未被hook的pfnLoadLibraryA +也可以调用系统的LoadLibraryA,不过要自己在hookproc中处理好重入问题 + +另外,也可以在My_LoadLibraryA中使用UnInstallHookApi()函数来卸载hook,用法如下: +将第二个参数__pfnLoadLibraryA pfnLoadLibraryA强制转换成PHOOKENVIRONMENT类型,使用UnInstallHookApi来卸载 + +例如: +UnInstallHookApi((PHOOKENVIRONMENT)pfnLoadLibraryA); + + +至于以前版本的HookBefore和HookAfter,完全可以在自己的HookProc里面灵活使用了 + + +2,支持卸载hook +InstallHookApi()调用后会返回一个PHOOKENVIRONMENT类型的指针 +需要卸载的时候可以使用UnInstallHookApi(PHOOKENVIRONMENT pHookEnv)来卸载 + +在HookProc中也可以使用UnInstallHookApi来卸载,参数传入HookProc中的第二个参数 + +注意:当HookProc中使用UnInstallHookApi卸载完后就不能用第二个参数来调用API了~~,切记! + +2008.04.15 0.41 +1,前面的deroko的LdeX86 有BUG,678b803412 会算错 + 换了一个LDX32,代码更少,更容易理解 + +2,修复了VirtualProtect的一个小BUG + + +0.4以前 +改动太大了,前面的就不写了 +*/ + + +#include "stdafx.h" +#include "HookApi.h" + +//#pragma comment(linker, "/SECTION:HookStub,R") + +//#define ALLOCATE_HookStub ALLOCATE(HookStub) + +//#pragma code_seg("HookStub") +#pragma optimize("gsy",on) +/*ALLOCATE_HookStub*/ HOOKENVIRONMENT pEnv={0}; +NAKED void StubShell_stdcall() +{ + __asm + { + push dword ptr [esp]; + push dword ptr [esp]; + call _next; +_next: + xchg dword ptr [esp], eax; + lea eax, [eax - 0x20]; + mov dword ptr [esp + 0xC], eax; + pop eax; + _emit 0xE9; + _emit 'g'; + _emit 'o'; + _emit 'o'; + _emit 'd'; + } +} + +NAKED void StubShell_cdecl() +{ + __asm + { + push dword ptr [esp]; + call _next; +_next: + xchg dword ptr [esp], eax; + lea eax, [eax - 0x1D]; + mov dword ptr [esp + 0x8], eax; + pop eax; + _emit 0x68; + _emit 'b'; + _emit 'a'; + _emit 'd'; + _emit 'd'; + _emit 0xE9; + _emit 'g'; + _emit 'o'; + _emit 'o'; + _emit 'd'; + } +} +#pragma optimize("",off) +//#pragma code_seg() + +NAKED void cdeclret_stub() +{ + __asm retn 4; +} +DWORD MyInterlockedExchange32(PDWORD Target, DWORD Value) +{ + DWORD retvalue; + __asm + { + mov ecx, Target; + mov eax, Value; + xchg dword ptr[ecx], eax; + mov retvalue, eax; + } + return retvalue; +} +WORD MyInterlockedExchange16(PWORD Target, WORD Value) +{ + WORD retvalue; + __asm + { + mov ecx, Target; + mov ax, Value; + xchg word ptr[ecx], ax; + mov retvalue, ax; + } + return retvalue; +} +void MyCopyBytes(void * pTarget, BYTE *pBuf, int size) +{ + /* + 优化 memcpy 字节 + 先把stub的前2个字节改成 EB FE,构造一个死循环,然后memcpy剩下字节,再把前2个字节改回去 + */ + WORD w1; + w1 = *(WORD*)pBuf; + MyInterlockedExchange16((PWORD)pTarget, 0xFEEB); + memcpy((char*)pTarget + 2, (char*)pBuf + 2, size - 2); + MyInterlockedExchange16((PWORD)pTarget, w1); +} + +DWORD __stdcall GetOpCodeSize(BYTE* iptr0) +{ + BYTE* iptr = iptr0; + + DWORD f = 0; + +prefix: + BYTE b = *iptr++; + + f |= table_1[b]; + + if (f&C_FUCKINGTEST) + if (((*iptr)&0x38)==0x00) // ttt + f=C_MODRM+C_DATAW0; // TEST + else + f=C_MODRM; // NOT,NEG,MUL,IMUL,DIV,IDIV + + if (f&C_TABLE_0F) + { + b = *iptr++; + f = table_0F[b]; + } + + if (f==C_ERROR) + { + //printf("error in %02X\n",b); + return C_ERROR; + } + + if (f&C_PREFIX) + { + f&=~C_PREFIX; + goto prefix; + } + + if (f&C_DATAW0) if (b&0x01) f|=C_DATA66; else f|=C_DATA1; + + if (f&C_MODRM) + { + b = *iptr++; + BYTE mod = b & 0xC0; + BYTE rm = b & 0x07; + if (mod!=0xC0) + { + if (f&C_67) // modrm16 + { + if ((mod==0x00)&&(rm==0x06)) f|=C_MEM2; + if (mod==0x40) f|=C_MEM1; + if (mod==0x80) f|=C_MEM2; + } + else // modrm32 + { + if (mod==0x40) f|=C_MEM1; + if (mod==0x80) f|=C_MEM4; + if (rm==0x04) rm = (*iptr++) & 0x07; // rm<-sib.base + if ((rm==0x05)&&(mod==0x00)) f|=C_MEM4; + } + } + } // C_MODRM + + if (f&C_MEM67) if (f&C_67) f|=C_MEM2; else f|=C_MEM4; + if (f&C_DATA66) if (f&C_66) f|=C_DATA2; else f|=C_DATA4; + + if (f&C_MEM1) iptr++; + if (f&C_MEM2) iptr+=2; + if (f&C_MEM4) iptr+=4; + + if (f&C_DATA1) iptr++; + if (f&C_DATA2) iptr+=2; + if (f&C_DATA4) iptr+=4; + + return iptr - iptr0; +} + +HANDLE g_hStupHeap = NULL; + +PHOOKENVIRONMENT __stdcall InstallHookStub(PVOID StubAddress, PVOID HookProc, int type) +{ + int ReplaceCodeSize; + DWORD oldpro; + DWORD SizeOfStub; + + DWORD SizeOfStubShell = 0; + DWORD AddrOfStubShell = 0; + + DWORD dwHookStubAddress; + DWORD RetSize =0; + + PHOOKENVIRONMENT pHookEnv; + + BYTE JMPGate[5] = {0xE9, 0x00, 0x00, 0x00, 0x00}; + + if (HookProc == NULL) + { + return NULL; + } + + if (StubAddress == NULL) return NULL; + + if (*(BYTE*)StubAddress == 0xE9 || *(BYTE*)StubAddress == 0xE8) return NULL; + + if(type == e_stdcall) + { + SizeOfStubShell = 0x1B; + AddrOfStubShell = (DWORD)StubShell_stdcall; + } + else if (type == e_cdecl) + { + SizeOfStubShell = 0x1D; + AddrOfStubShell = (DWORD)StubShell_cdecl; + } + +#ifdef _DEBUG + AddrOfStubShell = AddrOfStubShell + 5 + *(DWORD*)(AddrOfStubShell + 1); +#endif + + ReplaceCodeSize = GetOpCodeSize((BYTE*)StubAddress); + + while (ReplaceCodeSize < 5) + { + ReplaceCodeSize += GetOpCodeSize((BYTE*)((DWORD)StubAddress + (DWORD)ReplaceCodeSize)); + } + + if (ReplaceCodeSize > 16) return NULL; + + SizeOfStub = SizeOfStubShell + sizeof(HOOKENVIRONMENT); + + if(g_hStupHeap == NULL) + { + g_hStupHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); + if(g_hStupHeap == NULL) + { + return NULL; + } + } + + pHookEnv = (PHOOKENVIRONMENT)HeapAlloc(g_hStupHeap, 0, sizeof(HOOKENVIRONMENT)); + + memcpy(pHookEnv, (PVOID)&pEnv, sizeof(HOOKENVIRONMENT)); + memset((void*)pHookEnv->savebytes, 0x90, sizeof(pHookEnv->savebytes)); + memcpy((void*)pHookEnv->hookstub, (PVOID)AddrOfStubShell, SizeOfStubShell); + memcpy(pHookEnv->savebytes, StubAddress, ReplaceCodeSize); + + pHookEnv->OrgApiAddr = StubAddress; + pHookEnv->SizeOfReplaceCode = ReplaceCodeSize; + + pHookEnv->jmptoapi[0] = 0xE9; + *(DWORD*)(&pHookEnv->jmptoapi[1]) = (DWORD)StubAddress + ReplaceCodeSize - ((DWORD)pHookEnv->jmptoapi + 5); + + dwHookStubAddress = (DWORD)pHookEnv->hookstub; + + pHookEnv->jmptostub[0] = 0xE9; + *(DWORD*)(&pHookEnv->jmptostub[1]) = (DWORD)pHookEnv->savebytes - ((DWORD)pHookEnv->jmptostub + 5); + //*(DWORD*)(&pHookEnv->jmptostub[1]) = (DWORD)(dwHookStubAddress) - ((DWORD)pHookEnv->jmptostub + 5); + + *(DWORD*)(&JMPGate[1]) = ((DWORD)pHookEnv->jmptostub) - ((DWORD)StubAddress + 5); + + //写入变量,这里要先写变量,否则如果hook VirtualProtect,下面的api调用会出问题 + if(type == e_stdcall) + { + *(DWORD*)(dwHookStubAddress + SizeOfStubShell - 4) = (DWORD)HookProc - (dwHookStubAddress + SizeOfStubShell); + } + else if(type == e_cdecl) + { + *(DWORD*)(dwHookStubAddress + SizeOfStubShell - 4) = (DWORD)HookProc - (dwHookStubAddress + SizeOfStubShell); + *(DWORD*)(dwHookStubAddress + SizeOfStubShell - 9) = (DWORD)cdeclret_stub; + } + + //patch api + if (VirtualProtect(StubAddress, ReplaceCodeSize, PAGE_EXECUTE_READWRITE, &oldpro)) + { + //memcpy(StubAddress, JMPGate, sizeof(JMPGate)); + MyCopyBytes((void*)StubAddress, (BYTE*)JMPGate, sizeof(JMPGate)); + VirtualProtect(StubAddress, ReplaceCodeSize, oldpro, &oldpro); + MyInterlockedExchange32((PDWORD)(&pHookEnv->jmptostub[1]), (DWORD)(dwHookStubAddress) - ((DWORD)pHookEnv->jmptostub + 5)); + } + else + { + //失败了,无法hook + HeapFree(g_hStupHeap, 0, (void*)pHookEnv); + return NULL; + } + return pHookEnv; +} + +PHOOKENVIRONMENT __stdcall InstallHookApi(PCHAR DllName, PCHAR ApiName, PVOID HookProc, int type) +{ + return InstallHookStub((PVOID)GetProcAddress(LoadLibraryA(DllName), ApiName), HookProc, type); +} + +BOOL __stdcall UnInstallHookApi(PHOOKENVIRONMENT pHookEnv) +{ + DWORD oldpro; + + //如果内存不存在了,则退出 + if(HeapSize(g_hStupHeap, 0, (void*)pHookEnv) <= 0) + return FALSE; + + if(IsBadReadPtr((const void*)pHookEnv, sizeof(HOOKENVIRONMENT))) + return FALSE; + + if(!VirtualProtect(pHookEnv->OrgApiAddr, pHookEnv->SizeOfReplaceCode, PAGE_EXECUTE_READWRITE, &oldpro)) + return FALSE; + + //memcpy(pHookEnv->OrgApiAddr, pHookEnv->savebytes, pHookEnv->SizeOfReplaceCode); + MyCopyBytes((void*)pHookEnv->OrgApiAddr, (BYTE*)pHookEnv->savebytes, pHookEnv->SizeOfReplaceCode); + + VirtualProtect(pHookEnv->OrgApiAddr, pHookEnv->SizeOfReplaceCode, oldpro, &oldpro); + + HeapFree(g_hStupHeap, 0, (void*)pHookEnv); + return TRUE; +} + + +//定义下面这行可以作为演示使用 +//#define TEST_MAIN + + +#ifdef TEST_MAIN + +BOOL IsMe = FALSE; + +//先定义一下要hook的WINAPI +typedef HMODULE (WINAPI __pfnLoadLibraryA)(LPCSTR lpFileName); + +/* +HookProc的参数声明方式类型等和原来的api一样,只是参数比原API多2个 +DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...); + +//参数比原始的API多2个参数 +RetAddr //调用api的返回地址 +pfnXXX //类型为__pfnXXXX,待hook的api的声明类型,用于调用未被hook的api + +详见My_LoadLibraryA +原始的LoadLibraryA的声明是: + +HMODULE WINAPI LoadLibraryA( LPCSTR lpLibFileName ); + +那么首先定义一下hook的WINAPI的类型 +typedef HMODULE (WINAPI __pfnLoadLibraryA)(LPCTSTR lpFileName); + +然后hookproc的函数声明如下: +HMODULE WINAPI My_LoadLibraryA(DWORD RetAddr, + __pfnLoadLibraryA pfnLoadLibraryA, + LPCTSTR lpFileName + ); + +比原来的多了2个参数,参数位置不能颠倒,在My_LoadLibraryA中可以自由的调用未被hook的pfnLoadLibraryA +也可以调用系统的LoadLibraryA,不过要自己在hookproc中处理好重入问题 + +另外,也可以在My_LoadLibraryA中使用UnInstallHookApi()函数来卸载hook,用法如下: +将第二个参数__pfnLoadLibraryA pfnLoadLibraryA强制转换成PHOOKENVIRONMENT类型,使用UnInstallHookApi来卸载 + +例如: +UnInstallHookApi((PHOOKENVIRONMENT)pfnLoadLibraryA); + + +至于以前版本的HookBefore和HookAfter,完全可以在自己的HookProc里面灵活使用了 + +*/ + +HMODULE WINAPI My_LoadLibraryA(DWORD RetAddr, + __pfnLoadLibraryA pfnLoadLibraryA, + LPCSTR lpFileName + ) +{ + HMODULE hLib; + + //需要自己处理重入和线程安全问题 + if (!IsMe) + { + IsMe = TRUE; + MessageBoxA(NULL, lpFileName, "test", MB_ICONINFORMATION); + hLib = LoadLibraryA(lpFileName);//这里调用的是系统的,已经被hook过的 + IsMe = FALSE; + //这里是卸载Hook,这里卸载完就不能用pfnLoadLibraryA来调用了 + UnInstallHookApi((PHOOKENVIRONMENT)pfnLoadLibraryA); + return hLib; + } + return pfnLoadLibraryA(lpFileName);//这里调用非hook的 +} + + +int main() +{ + PHOOKENVIRONMENT pHookEnv; + + pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA); + //pHookEnv = InstallHookApi("Kernel32.dll", "Beep", My_LoadLibraryA); + LoadLibraryA("InjectDll.dll"); + MessageBoxA(NULL,"Safe Here!!!","Very Good!!",MB_ICONINFORMATION); + UnInstallHookApi(pHookEnv);//由于HookProc中卸载过了,所以这里的卸载就无效了 + MessageBoxA(NULL,"UnInstall Success!!!","Good!!",MB_ICONINFORMATION); + return 0; +} + +#endif + + \ No newline at end of file diff --git a/src/HookApi.h b/src/HookApi.h new file mode 100644 index 0000000..654f394 --- /dev/null +++ b/src/HookApi.h @@ -0,0 +1,585 @@ +#ifndef _HOOKAPI_H +#define _HOOKAPI_H + + +typedef struct _HOOKENVIRONMENT +{ + //前两项的位置不能改变! + unsigned char savebytes[16]; + unsigned char jmptoapi[5]; + unsigned char hookstub[0x30]; + unsigned char jmptostub[5]; + void* OrgApiAddr; + unsigned long SizeOfReplaceCode; + unsigned long oldpro; +}HOOKENVIRONMENT,*PHOOKENVIRONMENT; + +enum hooktype{ + e_stdcall, + e_cdecl, +}; + +#ifdef __cplusplus +extern "C" +{ +#endif + +DWORD __stdcall GetOpCodeSize(BYTE* startaddress); +PHOOKENVIRONMENT __stdcall InstallHookStub(PVOID StubAddress, PVOID HookProc, int type = e_stdcall); +PHOOKENVIRONMENT __stdcall InstallHookApi(PCHAR DllName, PCHAR ApiName, PVOID HookProc, int type = e_stdcall); +BOOL __stdcall UnInstallHookApi(PHOOKENVIRONMENT pHookEnv); + +#ifdef __cplusplus +}; +#endif + +#define NAKED __declspec(naked) + +#define ALLOCATE(x1) __declspec(allocate(#x1)) + +#define ReloCationForADDR(x1, dwHookStubAddress) ((DWORD(&x1) + dwHookStubAddress)) +#define ReloCationForDWORD(x1, dwHookStubAddress) (*(LPDWORD(DWORD(&x1) + dwHookStubAddress))) +#define ReloCationForTCHAR(x1, dwHookStubAddress) (LPCTSTR(DWORD(&x1) + dwHookStubAddress)) +#define ReloCationForLP(x1, dwHookStubAddress) (__##x1(ReloCationForDWORD(x1, dwHookStubAddress))) + +////////////////////////////////////////////////////////////////////////// +//另一个LDX32 + +#define C_ERROR 0xFFFFFFFF +#define C_PREFIX 0x00000001 +#define C_66 0x00000002 +#define C_67 0x00000004 +#define C_DATA66 0x00000008 +#define C_DATA1 0x00000010 +#define C_DATA2 0x00000020 +#define C_DATA4 0x00000040 +#define C_MEM67 0x00000080 +#define C_MEM1 0x00000100 +#define C_MEM2 0x00000200 +#define C_MEM4 0x00000400 +#define C_MODRM 0x00000800 +#define C_DATAW0 0x00001000 +#define C_FUCKINGTEST 0x00002000 +#define C_TABLE_0F 0x00004000 + +static int table_1[256] = +{ + /* 00 */ C_MODRM + /* 01 */, C_MODRM + /* 02 */, C_MODRM + /* 03 */, C_MODRM + /* 04 */, C_DATAW0 + /* 05 */, C_DATAW0 + /* 06 */, 0 + /* 07 */, 0 + /* 08 */, C_MODRM + /* 09 */, C_MODRM + /* 0A */, C_MODRM + /* 0B */, C_MODRM + /* 0C */, C_DATAW0 + /* 0D */, C_DATAW0 + /* 0E */, 0 + /* 0F */, C_TABLE_0F + /* 10 */, C_MODRM + /* 11 */, C_MODRM + /* 12 */, C_MODRM + /* 13 */, C_MODRM + /* 14 */, C_DATAW0 + /* 15 */, C_DATAW0 + /* 16 */, 0 + /* 17 */, 0 + /* 18 */, C_MODRM + /* 19 */, C_MODRM + /* 1A */, C_MODRM + /* 1B */, C_MODRM + /* 1C */, C_DATAW0 + /* 1D */, C_DATAW0 + /* 1E */, 0 + /* 1F */, 0 + /* 20 */, C_MODRM + /* 21 */, C_MODRM + /* 22 */, C_MODRM + /* 23 */, C_MODRM + /* 24 */, C_DATAW0 + /* 25 */, C_DATAW0 + /* 26 */, C_PREFIX + /* 27 */, 0 + /* 28 */, C_MODRM + /* 29 */, C_MODRM + /* 2A */, C_MODRM + /* 2B */, C_MODRM + /* 2C */, C_DATAW0 + /* 2D */, C_DATAW0 + /* 2E */, C_PREFIX + /* 2F */, 0 + /* 30 */, C_MODRM + /* 31 */, C_MODRM + /* 32 */, C_MODRM + /* 33 */, C_MODRM + /* 34 */, C_DATAW0 + /* 35 */, C_DATAW0 + /* 36 */, C_PREFIX + /* 37 */, 0 + /* 38 */, C_MODRM + /* 39 */, C_MODRM + /* 3A */, C_MODRM + /* 3B */, C_MODRM + /* 3C */, C_DATAW0 + /* 3D */, C_DATAW0 + /* 3E */, C_PREFIX + /* 3F */, 0 + /* 40 */, 0 + /* 41 */, 0 + /* 42 */, 0 + /* 43 */, 0 + /* 44 */, 0 + /* 45 */, 0 + /* 46 */, 0 + /* 47 */, 0 + /* 48 */, 0 + /* 49 */, 0 + /* 4A */, 0 + /* 4B */, 0 + /* 4C */, 0 + /* 4D */, 0 + /* 4E */, 0 + /* 4F */, 0 + /* 50 */, 0 + /* 51 */, 0 + /* 52 */, 0 + /* 53 */, 0 + /* 54 */, 0 + /* 55 */, 0 + /* 56 */, 0 + /* 57 */, 0 + /* 58 */, 0 + /* 59 */, 0 + /* 5A */, 0 + /* 5B */, 0 + /* 5C */, 0 + /* 5D */, 0 + /* 5E */, 0 + /* 5F */, 0 + /* 60 */, 0 + /* 61 */, 0 + /* 62 */, C_MODRM + /* 63 */, C_MODRM + /* 64 */, C_PREFIX + /* 65 */, C_PREFIX + /* 66 */, C_PREFIX+C_66 + /* 67 */, C_PREFIX+C_67 + /* 68 */, C_DATA66 + /* 69 */, C_MODRM+C_DATA66 + /* 6A */, C_DATA1 + /* 6B */, C_MODRM+C_DATA1 + /* 6C */, 0 + /* 6D */, 0 + /* 6E */, 0 + /* 6F */, 0 + /* 70 */, C_DATA1 + /* 71 */, C_DATA1 + /* 72 */, C_DATA1 + /* 73 */, C_DATA1 + /* 74 */, C_DATA1 + /* 75 */, C_DATA1 + /* 76 */, C_DATA1 + /* 77 */, C_DATA1 + /* 78 */, C_DATA1 + /* 79 */, C_DATA1 + /* 7A */, C_DATA1 + /* 7B */, C_DATA1 + /* 7C */, C_DATA1 + /* 7D */, C_DATA1 + /* 7E */, C_DATA1 + /* 7F */, C_DATA1 + /* 80 */, C_MODRM+C_DATA1 + /* 81 */, C_MODRM+C_DATA66 + /* 82 */, C_MODRM+C_DATA1 + /* 83 */, C_MODRM+C_DATA1 + /* 84 */, C_MODRM + /* 85 */, C_MODRM + /* 86 */, C_MODRM + /* 87 */, C_MODRM + /* 88 */, C_MODRM + /* 89 */, C_MODRM + /* 8A */, C_MODRM + /* 8B */, C_MODRM + /* 8C */, C_MODRM + /* 8D */, C_MODRM + /* 8E */, C_MODRM + /* 8F */, C_MODRM + /* 90 */, 0 + /* 91 */, 0 + /* 92 */, 0 + /* 93 */, 0 + /* 94 */, 0 + /* 95 */, 0 + /* 96 */, 0 + /* 97 */, 0 + /* 98 */, 0 + /* 99 */, 0 + /* 9A */, C_DATA66+C_MEM2 + /* 9B */, 0 + /* 9C */, 0 + /* 9D */, 0 + /* 9E */, 0 + /* 9F */, 0 + /* A0 */, C_MEM67 + /* A1 */, C_MEM67 + /* A2 */, C_MEM67 + /* A3 */, C_MEM67 + /* A4 */, 0 + /* A5 */, 0 + /* A6 */, 0 + /* A7 */, 0 + /* A8 */, C_DATA1 + /* A9 */, C_DATA66 + /* AA */, 0 + /* AB */, 0 + /* AC */, 0 + /* AD */, 0 + /* AE */, 0 + /* AF */, 0 + /* B0 */, C_DATA1 + /* B1 */, C_DATA1 + /* B2 */, C_DATA1 + /* B3 */, C_DATA1 + /* B4 */, C_DATA1 + /* B5 */, C_DATA1 + /* B6 */, C_DATA1 + /* B7 */, C_DATA1 + /* B8 */, C_DATA66 + /* B9 */, C_DATA66 + /* BA */, C_DATA66 + /* BB */, C_DATA66 + /* BC */, C_DATA66 + /* BD */, C_DATA66 + /* BE */, C_DATA66 + /* BF */, C_DATA66 + /* C0 */, C_MODRM+C_DATA1 + /* C1 */, C_MODRM+C_DATA1 + /* C2 */, C_DATA2 + /* C3 */, 0 + /* C4 */, C_MODRM + /* C5 */, C_MODRM + /* C6 */, C_MODRM+C_DATA66 + /* C7 */, C_MODRM+C_DATA66 + /* C8 */, C_DATA2+C_DATA1 + /* C9 */, 0 + /* CA */, C_DATA2 + /* CB */, 0 + /* CC */, 0 + /* CD */, C_DATA1+C_DATA4 + /* CE */, 0 + /* CF */, 0 + /* D0 */, C_MODRM + /* D1 */, C_MODRM + /* D2 */, C_MODRM + /* D3 */, C_MODRM + /* D4 */, 0 + /* D5 */, 0 + /* D6 */, 0 + /* D7 */, 0 + /* D8 */, C_MODRM + /* D9 */, C_MODRM + /* DA */, C_MODRM + /* DB */, C_MODRM + /* DC */, C_MODRM + /* DD */, C_MODRM + /* DE */, C_MODRM + /* DF */, C_MODRM + /* E0 */, C_DATA1 + /* E1 */, C_DATA1 + /* E2 */, C_DATA1 + /* E3 */, C_DATA1 + /* E4 */, C_DATA1 + /* E5 */, C_DATA1 + /* E6 */, C_DATA1 + /* E7 */, C_DATA1 + /* E8 */, C_DATA66 + /* E9 */, C_DATA66 + /* EA */, C_DATA66+C_MEM2 + /* EB */, C_DATA1 + /* EC */, 0 + /* ED */, 0 + /* EE */, 0 + /* EF */, 0 + /* F0 */, C_PREFIX + /* F1 */, 0 // 0xF1 + /* F2 */, C_PREFIX + /* F3 */, C_PREFIX + /* F4 */, 0 + /* F5 */, 0 + /* F6 */, C_FUCKINGTEST + /* F7 */, C_FUCKINGTEST + /* F8 */, 0 + /* F9 */, 0 + /* FA */, 0 + /* FB */, 0 + /* FC */, 0 + /* FD */, 0 + /* FE */, C_MODRM + /* FF */, C_MODRM +}; // table_1 + +static int table_0F[256] = +{ + /* 00 */ C_MODRM + /* 01 */, C_MODRM + /* 02 */, C_MODRM + /* 03 */, C_MODRM + /* 04 */, -1 + /* 05 */, -1 + /* 06 */, 0 + /* 07 */, -1 + /* 08 */, 0 + /* 09 */, 0 + /* 0A */, 0 + /* 0B */, 0 + /* 0C */, -1 + /* 0D */, -1 + /* 0E */, -1 + /* 0F */, -1 + /* 10 */, -1 + /* 11 */, -1 + /* 12 */, -1 + /* 13 */, -1 + /* 14 */, -1 + /* 15 */, -1 + /* 16 */, -1 + /* 17 */, -1 + /* 18 */, -1 + /* 19 */, -1 + /* 1A */, -1 + /* 1B */, -1 + /* 1C */, -1 + /* 1D */, -1 + /* 1E */, -1 + /* 1F */, -1 + /* 20 */, -1 + /* 21 */, -1 + /* 22 */, -1 + /* 23 */, -1 + /* 24 */, -1 + /* 25 */, -1 + /* 26 */, -1 + /* 27 */, -1 + /* 28 */, -1 + /* 29 */, -1 + /* 2A */, -1 + /* 2B */, -1 + /* 2C */, -1 + /* 2D */, -1 + /* 2E */, -1 + /* 2F */, -1 + /* 30 */, -1 + /* 31 */, -1 + /* 32 */, -1 + /* 33 */, -1 + /* 34 */, -1 + /* 35 */, -1 + /* 36 */, -1 + /* 37 */, -1 + /* 38 */, -1 + /* 39 */, -1 + /* 3A */, -1 + /* 3B */, -1 + /* 3C */, -1 + /* 3D */, -1 + /* 3E */, -1 + /* 3F */, -1 + /* 40 */, -1 + /* 41 */, -1 + /* 42 */, -1 + /* 43 */, -1 + /* 44 */, -1 + /* 45 */, -1 + /* 46 */, -1 + /* 47 */, -1 + /* 48 */, -1 + /* 49 */, -1 + /* 4A */, -1 + /* 4B */, -1 + /* 4C */, -1 + /* 4D */, -1 + /* 4E */, -1 + /* 4F */, -1 + /* 50 */, -1 + /* 51 */, -1 + /* 52 */, -1 + /* 53 */, -1 + /* 54 */, -1 + /* 55 */, -1 + /* 56 */, -1 + /* 57 */, -1 + /* 58 */, -1 + /* 59 */, -1 + /* 5A */, -1 + /* 5B */, -1 + /* 5C */, -1 + /* 5D */, -1 + /* 5E */, -1 + /* 5F */, -1 + /* 60 */, -1 + /* 61 */, -1 + /* 62 */, -1 + /* 63 */, -1 + /* 64 */, -1 + /* 65 */, -1 + /* 66 */, -1 + /* 67 */, -1 + /* 68 */, -1 + /* 69 */, -1 + /* 6A */, -1 + /* 6B */, -1 + /* 6C */, -1 + /* 6D */, -1 + /* 6E */, -1 + /* 6F */, -1 + /* 70 */, -1 + /* 71 */, -1 + /* 72 */, -1 + /* 73 */, -1 + /* 74 */, -1 + /* 75 */, -1 + /* 76 */, -1 + /* 77 */, -1 + /* 78 */, -1 + /* 79 */, -1 + /* 7A */, -1 + /* 7B */, -1 + /* 7C */, -1 + /* 7D */, -1 + /* 7E */, -1 + /* 7F */, -1 + /* 80 */, C_DATA66 + /* 81 */, C_DATA66 + /* 82 */, C_DATA66 + /* 83 */, C_DATA66 + /* 84 */, C_DATA66 + /* 85 */, C_DATA66 + /* 86 */, C_DATA66 + /* 87 */, C_DATA66 + /* 88 */, C_DATA66 + /* 89 */, C_DATA66 + /* 8A */, C_DATA66 + /* 8B */, C_DATA66 + /* 8C */, C_DATA66 + /* 8D */, C_DATA66 + /* 8E */, C_DATA66 + /* 8F */, C_DATA66 + /* 90 */, C_MODRM + /* 91 */, C_MODRM + /* 92 */, C_MODRM + /* 93 */, C_MODRM + /* 94 */, C_MODRM + /* 95 */, C_MODRM + /* 96 */, C_MODRM + /* 97 */, C_MODRM + /* 98 */, C_MODRM + /* 99 */, C_MODRM + /* 9A */, C_MODRM + /* 9B */, C_MODRM + /* 9C */, C_MODRM + /* 9D */, C_MODRM + /* 9E */, C_MODRM + /* 9F */, C_MODRM + /* A0 */, 0 + /* A1 */, 0 + /* A2 */, 0 + /* A3 */, C_MODRM + /* A4 */, C_MODRM+C_DATA1 + /* A5 */, C_MODRM + /* A6 */, -1 + /* A7 */, -1 + /* A8 */, 0 + /* A9 */, 0 + /* AA */, 0 + /* AB */, C_MODRM + /* AC */, C_MODRM+C_DATA1 + /* AD */, C_MODRM + /* AE */, -1 + /* AF */, C_MODRM + /* B0 */, C_MODRM + /* B1 */, C_MODRM + /* B2 */, C_MODRM + /* B3 */, C_MODRM + /* B4 */, C_MODRM + /* B5 */, C_MODRM + /* B6 */, C_MODRM + /* B7 */, C_MODRM + /* B8 */, -1 + /* B9 */, -1 + /* BA */, C_MODRM+C_DATA1 + /* BB */, C_MODRM + /* BC */, C_MODRM + /* BD */, C_MODRM + /* BE */, C_MODRM + /* BF */, C_MODRM + /* C0 */, C_MODRM + /* C1 */, C_MODRM + /* C2 */, -1 + /* C3 */, -1 + /* C4 */, -1 + /* C5 */, -1 + /* C6 */, -1 + /* C7 */, -1 + /* C8 */, 0 + /* C9 */, 0 + /* CA */, 0 + /* CB */, 0 + /* CC */, 0 + /* CD */, 0 + /* CE */, 0 + /* CF */, 0 + /* D0 */, -1 + /* D1 */, -1 + /* D2 */, -1 + /* D3 */, -1 + /* D4 */, -1 + /* D5 */, -1 + /* D6 */, -1 + /* D7 */, -1 + /* D8 */, -1 + /* D9 */, -1 + /* DA */, -1 + /* DB */, -1 + /* DC */, -1 + /* DD */, -1 + /* DE */, -1 + /* DF */, -1 + /* E0 */, -1 + /* E1 */, -1 + /* E2 */, -1 + /* E3 */, -1 + /* E4 */, -1 + /* E5 */, -1 + /* E6 */, -1 + /* E7 */, -1 + /* E8 */, -1 + /* E9 */, -1 + /* EA */, -1 + /* EB */, -1 + /* EC */, -1 + /* ED */, -1 + /* EE */, -1 + /* EF */, -1 + /* F0 */, -1 + /* F1 */, -1 + /* F2 */, -1 + /* F3 */, -1 + /* F4 */, -1 + /* F5 */, -1 + /* F6 */, -1 + /* F7 */, -1 + /* F8 */, -1 + /* F9 */, -1 + /* FA */, -1 + /* FB */, -1 + /* FC */, -1 + /* FD */, -1 + /* FE */, -1 + /* FF */, -1 +}; // table_0F + +#endif \ No newline at end of file diff --git a/src/dllmain.cpp b/src/dllmain.cpp index 8a7acd9..b1ec485 100644 --- a/src/dllmain.cpp +++ b/src/dllmain.cpp @@ -1,49 +1,11 @@ // dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" - -typedef int (WSAAPI* _getaddrinfo)( - _In_opt_ PCSTR pNodeName, - _In_opt_ PCSTR pServiceName, - _In_opt_ const ADDRINFOA *pHints, - _Out_ PADDRINFOA *ppResult - ); - -typedef int (WSAAPI* _WSASend)( - _In_ SOCKET s, - _In_ LPWSABUF lpBuffers, - _In_ DWORD dwBufferCount, - _Out_ LPDWORD lpNumberOfBytesSent, - _In_ DWORD dwFlags, - _In_ LPWSAOVERLAPPED lpOverlapped, - _In_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine -); - -static _getaddrinfo getaddrinfo_orig; -static _WSASend WSASend_orig; - -int WSAAPI getaddrinfo_hook( - _In_opt_ PCSTR pNodeName, - _In_opt_ PCSTR pServiceName, - _In_opt_ const ADDRINFOA *pHints, - _Out_ PADDRINFOA *ppResult) -{ - if (pNodeName) - { - for (size_t i = 0; i < sizeof(HostNames) / sizeof(HostNames[0]); i++) - { - if (!_strcmpi(pNodeName, HostNames[i])) - return WSANO_RECOVERY; - } - } - return getaddrinfo_orig(pNodeName, pServiceName, pHints, ppResult); -} - -LPVOID Search(char* pPattern, size_t patternSize, uint8_t* scanStart, size_t scanSize) +LPVOID Search (char* pPattern, size_t patternSize, uint8_t* scanStart, size_t scanSize) { __try { - auto res = std::search( + auto res = std::search ( scanStart, scanStart + scanSize, pPattern, pPattern + patternSize, [](uint8_t val1, uint8_t val2) { return (val1 == val2); } ); @@ -55,8 +17,24 @@ LPVOID Search(char* pPattern, size_t patternSize, uint8_t* scanStart, size_t sca } } +LPVOID FindFunction (char* hModule, DWORD hModuleSize, char* midFuncPtn, int lenMidFuncPtn, int seekBackCount, char* startFuncPtn, int lenStartFuncPtn) +{ + LPVOID pfnAddr = Search (midFuncPtn, lenMidFuncPtn, (uint8_t*)hModule, hModuleSize); + if (!pfnAddr) return NULL; + char* pfnStart = NULL; + char* pfnCurrent = (char*)pfnAddr - seekBackCount; + while ((pfnCurrent = (char*)Search (startFuncPtn, lenStartFuncPtn, (uint8_t*)pfnCurrent, hModule + hModuleSize - pfnCurrent)) && + pfnCurrent < pfnAddr) + { + pfnStart = pfnCurrent; + pfnCurrent++; + } + + return pfnStart; +} + // https://www.unknowncheats.me/forum/1064672-post23.html -bool DataCompare(BYTE* pData, BYTE* bSig, char* szMask) +bool DataCompare (BYTE* pData, BYTE* bSig, char* szMask) { for (; *szMask; ++szMask, ++pData, ++bSig) { @@ -66,14 +44,14 @@ bool DataCompare(BYTE* pData, BYTE* bSig, char* szMask) return (*szMask) == NULL; } -BYTE* FindPattern(BYTE* dwAddress, DWORD dwSize, BYTE* pbSig, char* szMask) +BYTE* FindPattern (BYTE* dwAddress, DWORD dwSize, BYTE* pbSig, char* szMask) { - DWORD length = strlen(szMask); + DWORD length = strlen (szMask); for (DWORD i = NULL; i < dwSize - length; i++) { __try { - if (DataCompare(dwAddress + i, pbSig, szMask)) + if (DataCompare (dwAddress + i, pbSig, szMask)) return dwAddress + i; } __except (EXCEPTION_EXECUTE_HANDLER) { @@ -83,490 +61,54 @@ BYTE* FindPattern(BYTE* dwAddress, DWORD dwSize, BYTE* pbSig, char* szMask) return 0; } -#define HOST_STR "Host: " - -int WSAAPI WSASend_hook( - _In_ SOCKET s, - _In_ LPWSABUF lpBuffers, - _In_ DWORD dwBufferCount, - _Out_ LPDWORD lpNumberOfBytesSent, - _In_ DWORD dwFlags, - _In_ LPWSAOVERLAPPED lpOverlapped, - _In_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine -) -{ - if (lpBuffers) - { - for (DWORD x = 0; x < dwBufferCount; x++) - { - LPVOID res = Search(HOST_STR, sizeof(HOST_STR) - 1, (uint8_t*)lpBuffers[x].buf, lpBuffers[x].len); - - if (res) - { - size_t max_len = (uint8_t*)lpBuffers[x].buf + lpBuffers[x].len - (uint8_t*) res; - - for (size_t i = 0; i < sizeof(HostNames) / sizeof(HostNames[0]); i++) - { - size_t l = strlen(HostNames[i]); - if (l < max_len && !_strnicmp((char*)res + sizeof(HOST_STR) - 1, HostNames[i], l)) - return WSAENETUNREACH; - } - } - } - } - - return WSASend_orig(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); -} - -//void __stdcall LoadAPI(LPVOID* destination, LPCSTR apiName) -//{ -// if (*destination) -// return; -// -// wchar_t path[MAX_PATH]; -// //wchar_t windows[MAX_PATH]; -// //GetSystemDirectoryW(windows, MAX_PATH); -// //wsprintf(path, L"%s\\netutils.dll", windows); -// wsprintf(path, L".\\chrome_elf_.dll"); -// HMODULE hModule = GetModuleHandle(path); -// if (!hModule && !(hModule = LoadLibrary(path))) -// return; -// *destination = GetProcAddress(hModule, apiName); -//} -// -//#define API_EXPORT_ORIG(N) \ -// static LPVOID _##N = NULL; \ -// char S_##N[] = "" # N; \ -// extern "C" __declspec(dllexport) __declspec(naked) void N ## () \ -// { \ -// __asm pushad \ -// __asm push offset S_##N \ -// __asm push offset _##N \ -// __asm call LoadAPI \ -// __asm popad \ -// __asm jmp [_##N] \ -// } - -//API_EXPORT_ORIG(AddDllToBlacklist) -//API_EXPORT_ORIG(ClearReportsBetween_ExportThunk) -//API_EXPORT_ORIG(CrashForException_ExportThunk) -//API_EXPORT_ORIG(DisableHook) -//API_EXPORT_ORIG(DrainLog) -//API_EXPORT_ORIG(DumpHungProcessWithPtype_ExportThunk) -//API_EXPORT_ORIG(DumpProcessWithoutCrash) -//API_EXPORT_ORIG(GetApplyHookResult) -//API_EXPORT_ORIG(GetBlockedModulesCount) -//API_EXPORT_ORIG(GetCrashReports_ExportThunk) -//API_EXPORT_ORIG(GetCrashpadDatabasePath_ExportThunk) -//API_EXPORT_ORIG(GetHandleVerifier) -//API_EXPORT_ORIG(GetInstallDetailsPayload) -//API_EXPORT_ORIG(GetUniqueBlockedModulesCount) -//API_EXPORT_ORIG(GetUserDataDirectoryThunk) -//API_EXPORT_ORIG(InjectDumpForHungInput_ExportThunk) -//API_EXPORT_ORIG(IsBlacklistInitialized) -//API_EXPORT_ORIG(IsCrashReportingEnabledImpl) -//API_EXPORT_ORIG(RegisterLogNotification) -//API_EXPORT_ORIG(RequestSingleCrashUpload_ExportThunk) -//API_EXPORT_ORIG(SetCrashKeyValueImpl) -//API_EXPORT_ORIG(SetMetricsClientId) -//API_EXPORT_ORIG(SetUploadConsent_ExportThunk) -//API_EXPORT_ORIG(SignalChromeElf) -//API_EXPORT_ORIG(SignalInitializeCrashReporting) -//API_EXPORT_ORIG(SuccessfullyBlocked) - -//#define API_COPY(M, N) \ -// _##N = GetProcAddress(M, #N); - -typedef char (__fastcall* _is_skippable)( - char* This, - void* -); - -typedef int(__fastcall* _can_focus)( - char* This, - void* -); - -typedef int(__fastcall* _now_playing)( - char* This, - void*, - void* Unk -); - - -static _is_skippable is_skippable_orig; -static _can_focus can_focus_orig; -static _now_playing now_playing_orig; - -static DWORD dwCurrentTrackUriOffset = 0x0; -static LPVOID pfnSkippableStart = NULL; -static char lastPlayingUri[2048] = {0}; -static bool skipTrack = false; - -__declspec(naked) void is_skippable_hook() -{ - __asm { - mov eax, 1 - ret - } -} - -_declspec(naked) void can_focus_hook() -{ - __asm { - xor eax, eax - ret - } -} - -DWORD WINAPI SkipTrack(LPVOID) -{ - int cnt = 0; - while (skipTrack && cnt++ < 2) - { - Sleep(250); - if (skipTrack) - { - keybd_event(VK_MEDIA_NEXT_TRACK, 0x0, KEYEVENTF_EXTENDEDKEY, NULL); - keybd_event(VK_MEDIA_NEXT_TRACK, 0x0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL); - break; - } - } - return 0; -} - -int __fastcall now_playing_hook(char* This, void* Edx, void* Track) -{ - char* szCurrentTrackUri = (char*)*(void**)((char*)Track + dwCurrentTrackUriOffset); - - __try - { - if (strncmp(szCurrentTrackUri, lastPlayingUri, 2048)) - { - strncpy_s(lastPlayingUri, szCurrentTrackUri, 2048); - - // If the now playing track is an ad or interruption, immediately skip using old method (simulating a "skip" media button press) - if (!strncmp(szCurrentTrackUri, "spotify:ad:", 11) || !strncmp(szCurrentTrackUri, "spotify:interruption:", 21)) - { - skipTrack = true; - CreateThread(NULL, 0, SkipTrack, NULL, 0, NULL); - } - else - { - skipTrack = false; - } - } - } __except (EXCEPTION_EXECUTE_HANDLER) { - } - - return now_playing_orig(This, Edx, Track); -} - -LPVOID FindFunction(char* hModule, DWORD hModuleSize, char* midFuncPtn, int lenMidFuncPtn, int seekBackCount, char* startFuncPtn, int lenStartFuncPtn) -{ - LPVOID pfnAddr = Search(midFuncPtn, lenMidFuncPtn, (uint8_t*) hModule, hModuleSize); - if (!pfnAddr) return NULL; - char* pfnStart = NULL; - char* pfnCurrent = (char*) pfnAddr - seekBackCount; - while ((pfnCurrent = (char*) Search(startFuncPtn, lenStartFuncPtn, (uint8_t*)pfnCurrent, hModule + hModuleSize - pfnCurrent)) && - pfnCurrent < pfnAddr) - { - pfnStart = pfnCurrent; - pfnCurrent++; - } - - return pfnStart; -} - -static char* ZeroString = "0\0"; - -void Patch(HMODULE hModule, MODULEINFO mInfo) -{ - DWORD d; - VirtualProtect(hModule, mInfo.SizeOfImage, PAGE_EXECUTE_READWRITE, &d); - LPVOID hEndOfModule = (uint8_t*)hModule + mInfo.SizeOfImage; - - // Hook skippable function (make all tracks skippable) - pfnSkippableStart = FindFunction((char*)hModule, mInfo.SizeOfImage, "\x74\x04\xc6\x45\xbf\x01\xf6\xc3\x02\x74\x0b", 11, 1024, - "\x55\x8b\xec\x6a\xff", 5); - - // fix for 1.0.91.183 - if (!pfnSkippableStart) - pfnSkippableStart = FindFunction((char*)hModule, mInfo.SizeOfImage, "\x8D\x46\x1C\xC7\x45\xB8\x01\x00\x00\x00\x50\x8D\x45\xC0\x50\xE8", 16, 1024, - "\x55\x8b\xec\x6a\xff", 5); - - if (pfnSkippableStart) - { - is_skippable_orig = (_is_skippable)pfnSkippableStart; - Mhook_SetHook((PVOID*)&is_skippable_orig, is_skippable_hook); - } - - // Hook now playing function (determine what current track is playing) - LPVOID szNowPlaying = Search("now_playing_uri\0", 16, (uint8_t*)hModule, mInfo.SizeOfImage); - if (szNowPlaying) { - char szNowPlayingPattern[7]; - strcpy_s(szNowPlayingPattern, "\x6a\x0f\x68\x00\x00\x00\x00"); - memcpy(szNowPlayingPattern + 3, &szNowPlaying, sizeof(LPVOID)); - - LPVOID pfnNowPlaying = FindFunction((char*)hModule, mInfo.SizeOfImage, szNowPlayingPattern, 7, 1024, - "\x55\x8b\xec\x6a\xff", 5); - - if (pfnNowPlaying) - { - LPVOID pfnUriPtn = Search("\x6a\xff\x8d\x87", 4, (uint8_t*)pfnNowPlaying, (char*)hEndOfModule - (char*)pfnNowPlaying); - - // fix for 1.0.91.183 - if (!pfnUriPtn) - pfnUriPtn = Search("\x74\x1a\x8d\x86", 4, (uint8_t*)pfnNowPlaying, (char*)hEndOfModule - (char*)pfnNowPlaying); - - if (pfnUriPtn) - { - dwCurrentTrackUriOffset = *(DWORD*)((char*)pfnUriPtn + 4); - now_playing_orig = (_now_playing)pfnNowPlaying; - Mhook_SetHook((PVOID*)&now_playing_orig, now_playing_hook); - } - } - } - - // Hook focus function (disable focus for ads) - LPVOID pfnRequireFocus = (uint8_t*)hModule; - while ((pfnRequireFocus = Search("\x8d\x46\x40\x50\x8d\x45\xc0\x50\xe8", 9, (uint8_t*)pfnRequireFocus, (char*)hEndOfModule - (char*)pfnRequireFocus))) - { - if (*((char*)pfnRequireFocus - 5) == 0x68 && - !strcmp((char*)*(LPVOID*)((char*)pfnRequireFocus - 4), "require_focus")) - { - // Find the start of the function - LPVOID pfnRequireFocusStart = NULL; - LPVOID pfnRequireFocusCurrent = (char*)pfnRequireFocus - 500; - while ((pfnRequireFocusCurrent = Search("\x55\x8b\xec\x6a\xff", 5, (uint8_t*)pfnRequireFocusCurrent, (char*)hEndOfModule - (char*)pfnRequireFocusCurrent)) && - pfnRequireFocusCurrent < pfnRequireFocus) - { - pfnRequireFocusStart = pfnRequireFocusCurrent; - pfnRequireFocusCurrent = (char*)pfnRequireFocusCurrent + 1; - } - if (pfnRequireFocusStart) - { - can_focus_orig = (_can_focus)pfnRequireFocusStart; - Mhook_SetHook((PVOID*)&can_focus_orig, can_focus_hook); - break; - } - } - pfnRequireFocus = (char*)pfnRequireFocus + 1; - } - - uint8_t* cur = (uint8_t*)hModule; - uint8_t* end = cur + mInfo.SizeOfImage; - - while (cur < end) - { - MEMORY_BASIC_INFORMATION mbi; - VirtualQuery(cur, &mbi, sizeof(mbi)); - if (mbi.Protect & PAGE_EXECUTE_READ || - mbi.Protect & PAGE_EXECUTE_READWRITE || - mbi.Protect & PAGE_READWRITE || - mbi.Protect & PAGE_READONLY || - mbi.Protect & PAGE_EXECUTE_WRITECOPY) - { - // Patch 5 second minimum wait to skip video ads - LPVOID skipStuckSeconds = (LPVOID)FindPattern((uint8_t*)mbi.BaseAddress, mbi.RegionSize, (BYTE*) "\x83\xc4\x08\x6a\x00\x68\xe8\x03\x00\x00\xff\x70\x04\xff\x30\xe8\x00\x00\x00\x00\x8d\x4d\xc0", "xxxxxxxxxxxxxxxx????xxx"); - int oneThousandMsOffset = 6; - - // fix for 1.0.91.183 - if (!skipStuckSeconds) - { - skipStuckSeconds = (LPVOID)FindPattern((uint8_t*)mbi.BaseAddress, mbi.RegionSize, (BYTE*) "\xb9\xe8\x03\x00\x00\xf7\xe9\x83\xc4\x1c", "xxxxxxxxxx"); - oneThousandMsOffset = 1; - } - if (skipStuckSeconds) - { - DWORD oldProtect; - VirtualProtect((char*)skipStuckSeconds + oneThousandMsOffset, 4, PAGE_EXECUTE_READWRITE, &oldProtect); - *(DWORD*)((char*)skipStuckSeconds + oneThousandMsOffset) = 0; - VirtualProtect((char*)skipStuckSeconds + oneThousandMsOffset, 4, oldProtect, &oldProtect); - break; - } - } - cur = (uint8_t*)mbi.BaseAddress + mbi.RegionSize; - } -} - -void PatchNet() -{ - HMODULE hModule = GetModuleHandle(L"ws2_32.dll"); - if (!hModule) - hModule = LoadLibrary(L"ws2_32.dll"); - - if (hModule) - { - getaddrinfo_orig = (_getaddrinfo)GetProcAddress(hModule, "getaddrinfo"); - if (getaddrinfo_orig) - Mhook_SetHook((PVOID*)&getaddrinfo_orig, getaddrinfo_hook); - WSASend_orig = (_WSASend)GetProcAddress(hModule, "WSASend"); - if (WSASend_orig) - Mhook_SetHook((PVOID*)&WSASend_orig, WSASend_hook); - } -} - -void PatchAdMain(HMODULE hModule, MODULEINFO mInfo) -{ - // fix for 1.0.91.183 - LPVOID adMissingIdAddr = FindPattern((uint8_t*)hModule, mInfo.SizeOfImage, (BYTE*) "\x84\xC0\x0F\x85\x00\x00\x00\x00\x6A\x0D\x68", "xxxx????xxx"); - int adMissingNopOffset = 2; - int adMissingNopCount = 6; - - // fallback old version - if (!adMissingIdAddr) { - adMissingIdAddr = FindPattern((uint8_t*)hModule, mInfo.SizeOfImage, (BYTE*) "\x84\xc0\x75\x00\x6a\x0d\x68", "xxx?xxx"); - adMissingNopOffset = 2, adMissingNopCount = 2; - } - if (adMissingIdAddr) - { - DWORD oldProtect; - VirtualProtect((char*)adMissingIdAddr + adMissingNopOffset, adMissingNopCount, PAGE_EXECUTE_READWRITE, &oldProtect); - memset((char*)adMissingIdAddr + adMissingNopOffset, 0x90, adMissingNopCount); - VirtualProtect((char*)adMissingIdAddr + adMissingNopOffset, adMissingNopCount, oldProtect, &oldProtect); - } -} - -void WriteAll(HMODULE hModule, MODULEINFO mInfo) -{ - uint8_t* cur = (uint8_t*)hModule; - uint8_t* end = cur + mInfo.SizeOfImage; - - while (cur < end) - { - MEMORY_BASIC_INFORMATION mbi; - VirtualQuery(cur, &mbi, sizeof(mbi)); - if (!(mbi.Protect & PAGE_GUARD)) { - DWORD dwOldProtect; - if (!VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect) && - mbi.Type & MEM_MAPPED) - VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_WRITECOPY, &dwOldProtect); - } - cur = (uint8_t*)mbi.BaseAddress + mbi.RegionSize; - } -} - -typedef struct -{ - DWORD dwMajor; - DWORD dwMinor; - DWORD dwBuild; - DWORD dwRevision; -} version_t; - -typedef struct { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[16]; - WORD Padding1; - VS_FIXEDFILEINFO Value; - WORD Padding2; - WORD Children; -} VS_VERSIONINFO; - -BOOL GetFileVersionInfo(version_t* v) +DWORD WINAPI MainThread (LPVOID) { - BOOL ok = FALSE; - WCHAR moduleFilePath[MAX_PATH]; - DWORD verHandle; - GetModuleFileName(GetModuleHandle(NULL), moduleFilePath, MAX_PATH); - DWORD verSize = GetFileVersionInfoSize(moduleFilePath, &verHandle); - if (verSize) - { - LPVOID verBuffer; - UINT size; - LPVOID verData = new char[verSize]; - if (GetFileVersionInfo(moduleFilePath, verHandle, verSize, verData) && - VerQueryValueA(verData, "\\", &verBuffer, &size) && - size) - { - VS_VERSIONINFO *verInfo = (VS_VERSIONINFO *) verData; - if (verInfo->Value.dwSignature == 0xfeef04bd) - { - v->dwMajor = verInfo->Value.dwFileVersionMS >> 16 & 0xffff; - v->dwMinor = verInfo->Value.dwFileVersionMS & 0xffff; - v->dwBuild = verInfo->Value.dwFileVersionLS >> 16 & 0xffff; - v->dwRevision = verInfo->Value.dwFileVersionLS & 0xffff; - ok = TRUE; - } - } - delete (char*) verData; - } - return ok; -} + HMODULE hModule = GetModuleHandle (NULL); + MODULEINFO mInfo = { 0 }; + if (GetModuleInformation (GetCurrentProcess (), hModule, &mInfo, sizeof (MODULEINFO))) { -DWORD WINAPI MainThread(LPVOID) -{ - // Block known ad hosts via function hooks - __try { - PatchNet(); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } + LPVOID skipPod = FindPattern ((uint8_t*)hModule, mInfo.SizeOfImage, (BYTE*) "\xFF\x07\x0F\x85\x00\x00\x00\x00\xE8", "xxxx????x"); - HMODULE hModule = GetModuleHandle(NULL); - MODULEINFO mInfo = { 0 }; - if (GetModuleInformation(GetCurrentProcess(), hModule, &mInfo, sizeof(MODULEINFO))) { - // Attempt to make entire module writable - __try { - WriteAll(hModule, mInfo); - } - __except (EXCEPTION_EXECUTE_HANDLER) + if (skipPod) { - } + DWORD oldProtect; + VirtualProtect ((char*)skipPod + 2, 1, PAGE_EXECUTE_READWRITE, &oldProtect); + memset ((char*)skipPod + 2, 0x90, 1); + VirtualProtect ((char*)skipPod + 2, 1, oldProtect, &oldProtect); - // Perform fallback patches (just in-case the main method fails) - // Only allow for version 1.1.0.xx and below - version_t v; - if (GetFileVersionInfo(&v) && v.dwMajor <= 1 && v.dwMinor <= 1 && v.dwBuild <= 0) - { - __try { - Patch(hModule, mInfo); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } + VirtualProtect ((char*)skipPod + 3, 1, PAGE_EXECUTE_READWRITE, &oldProtect); + memset ((char*)skipPod + 3, 0xE9, 1); + VirtualProtect ((char*)skipPod + 3, 1, oldProtect, &oldProtect); } - // Perform main ad patch - __try { - PatchAdMain(hModule, mInfo); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } } return 0; } -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) +BOOL APIENTRY DllMain (HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved +) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hModule); - // Only patch the main process and none of the renderers/workers - if (!wcsstr (GetCommandLine (), L"--type=")) - switch (MessageBox ( - NULL, - (LPCWSTR)L"I'll buy premium if had money!", - (LPCWSTR)L"Warning", - MB_YESNO | MB_ICONWARNING)) { - case IDYES: - CreateThread (NULL, NULL, MainThread, NULL, 0, NULL); - break; - default: - exit (0); - break; - } + DisableThreadLibraryCalls (hModule); + // Only patch the main process and none of the other + if (!wcsstr (GetCommandLine (), L"--type=")) { + //skip processing ads but ads still downloaded + CreateThread (NULL, NULL, MainThread, NULL, 0, NULL); + } + if (wcsstr (GetCommandLine (), L"--url=")) { + exit (0); + } + // block the ads banner by hostname + InstallHookApi ("ws2_32.dll", "getaddrinfo", getaddrinfohook); + // real ads block + InstallHookApi ("Winhttp.dll", "WinHttpOpenRequest", winhttpopenrequesthook); + // for future + //InstallHookApi ("ws2_32.dll", "connect", connecthook); break; - } return TRUE; } diff --git a/src/hosts.cpp b/src/hosts.cpp new file mode 100644 index 0000000..25e4f30 --- /dev/null +++ b/src/hosts.cpp @@ -0,0 +1,67 @@ +#include "stdafx.h" +#include "hosts.h" + +int WINAPI winhttpopenrequesthook (DWORD RetAddr, + pfnwinhttpopenrequest fnwinhttpopenrequest, + HINTERNET hConnect, + LPCWSTR pwszVerb, + LPCWSTR pwszObjectName, + LPCWSTR pwszVersion, + LPCWSTR pwszReferrer, + LPCWSTR* ppwszAcceptTypes, + DWORD dwFlags) +{ + //wcscmp (pwszVerb, L"POST") == 0 + if (wcscmp (pwszObjectName, L"/ad-logic/flashpoint") == 0) + return NULL; + if (wcscmp (pwszObjectName, L"/ads") == 0) + return NULL; + //if (wcscmp (pwszObjectName, L"/ads/v1/ads/leaderboard") == 0) + //return NULL; + + return fnwinhttpopenrequest (hConnect, + pwszVerb, + pwszObjectName, + pwszVersion, + pwszReferrer, + ppwszAcceptTypes, + dwFlags); +} + +int WINAPI connecthook (DWORD RetAddr, + pfnconnect fnconnect, + SOCKET s, + const struct sockaddr* name, + int namelen) +{ + return fnconnect (s, name, namelen); + + //for future whitelist or blacklist ip + //struct sockaddr_in* sa = (struct sockaddr_in*)name; + //if (sa->sin_family != AF_INET) // check only IPv4 + //return fnconnect (s, name, namelen); + + + //char* allowip = "151.101.8.246"; // Image + //char ipstr[INET_ADDRSTRLEN]; + //inet_ntop (sa->sin_family, &(sa->sin_addr), ipstr, INET_ADDRSTRLEN); + //if (_stricmp (ipstr, allowip) == 0) { + //return SOCKET_ERROR; + //} + +} + +int WINAPI getaddrinfohook (DWORD RetAddr, + pfngetaddrinfo fngetaddrinfo, + const char* nodename, + const char* servname, + const struct addrinfo* hints, + struct addrinfo** res) +{ + for (size_t i = 0; i < sizeof (blockhost) / sizeof (blockhost[0]); i++) + { + if (strstr (nodename, blockhost[i]) != NULL) + return WSANO_RECOVERY; + } + return fngetaddrinfo (nodename, servname, hints, res); +} diff --git a/src/hosts.h b/src/hosts.h index 609c5b1..e58e491 100644 --- a/src/hosts.h +++ b/src/hosts.h @@ -1,7 +1,48 @@ -#pragma once +#ifndef _HOSTS_H +#define _HOSTS_H -static const char* HostNames[] = { -// new website +typedef SOCKET (__stdcall* pfnconnect)(SOCKET s, + const struct sockaddr* name, + int namelen); + +typedef int (__stdcall* pfngetaddrinfo)(const char* nodename, + const char* servname, + const struct addrinfo* hints, + struct addrinfo** res); + +typedef int (__stdcall* pfnwinhttpopenrequest)(HINTERNET hConnect, + LPCWSTR pwszVerb, + LPCWSTR pwszObjectName, + LPCWSTR pwszVersion, + LPCWSTR pwszReferrer, + LPCWSTR* ppwszAcceptTypes, + DWORD dwFlags); + +int WINAPI winhttpopenrequesthook (DWORD RetAddr, + pfnwinhttpopenrequest fnwinhttpopenrequest, + HINTERNET hConnect, + LPCWSTR pwszVerb, + LPCWSTR pwszObjectName, + LPCWSTR pwszVersion, + LPCWSTR pwszReferrer, + LPCWSTR* ppwszAcceptTypes, + DWORD dwFlags +); + +int WINAPI connecthook (DWORD RetAddr, + pfnconnect fnconnect, + SOCKET s, + const struct sockaddr* name, + int namelen); + +int WINAPI getaddrinfohook (DWORD RetAddr, + pfngetaddrinfo fngetaddrinfo, + const char* nodename, + const char* servname, + const struct addrinfo* hints, + struct addrinfo** res); + +static const char* blockhost[] = { // fork this if you found more... I'll check if had time. "google.ac", "google.ad", @@ -454,518 +495,8 @@ static const char* HostNames[] = { "beacons4.gvt2.com", "beacons5.gvt2.com", "beacons5.gvt3.com", - "clients2.google.com" + "clients2.google.com", + "crashdump.spotify.com" }; -/* - "1435575.fls.doubleclick.net", - "2542116.fls.doubleclick.net", - "2mdn.net", - "3642305.fls.doubleclick.net", - "3765329.fls.doubleclick.net", - "3ad.doubleclick.net", - "4.afs.googleadservices.com", - "4053494.fls.doubleclick.net", - "4236808.fls.doubleclick.net", - "4360661.fls.doubleclick.net", - "4488352.fls.doubleclick.net", - "4514783.fls.doubleclick.net", - "4684100.fls.doubleclick.net", - "5362399.fls.doubleclick.net", - "ad-ace.doubleclick.net", - "ad-apac.doubleclick.net", - "ad-emea.doubleclick.net", - "ad-g.doubleclick.net", - "ad-yt-bfp.doubleclick.net", - "ad.3au.doubleclick.net", - "ad.ae.doubleclick.net", - "ad.ar.doubleclick.net", - "ad.at.doubleclick.net", - "ad.au.doubleclick.net", - "ad.be.doubleclick.net", - "ad.bg.doubleclick.net", - "ad.br.doubleclick.net", - "ad.ca.doubleclick.net", - "ad.ch.doubleclick.net", - "ad.cl.doubleclick.net", - "ad.cn.doubleclick.net", - "ad.de.doubleclick.net", - "ad.dk.doubleclick.net", - "ad.doubleclick.net", - "ad.es.doubleclick.net", - "ad.fi.doubleclick.net", - "ad.fr.doubleclick.net", - "ad.gr.doubleclick.net", - "ad.hk.doubleclick.net", - "ad.hr.doubleclick.net", - "ad.hu.doubleclick.net", - "ad.ie.doubleclick.net", - "ad.in.doubleclick.net", - "ad.it.doubleclick.net", - "ad.jp.doubleclick.net", - "ad.kr.doubleclick.net", - "ad.mo.doubleclick.net", - "ad.my.doubleclick.net", - "ad.n2434.doubleclick.net", - "ad.nl.doubleclick.net", - "ad.no.doubleclick.net", - "ad.nz.doubleclick.net", - "ad.pl.doubleclick.net", - "ad.pt.doubleclick.net", - "ad.ro.doubleclick.net", - "ad.rs.doubleclick.net", - "ad.ru.doubleclick.net", - "ad.se.doubleclick.net", - "ad.sg.doubleclick.net", - "ad.si.doubleclick.net", - "ad.terra.doubleclick.net", - "ad.th.doubleclick.net", - "ad.tw.doubleclick.net", - "ad.uk.doubleclick.net", - "ad.us.doubleclick.net", - "ad.ve.doubleclick.net", - "ad.za.doubleclick.net", - "ad2.doubleclick.net", - "adclick.g.doublecklick.net", - "adclick.g.doubleclick.net", - "adeventtracker.spotify.com", - "adnxs.com", - "ads-fa.spotify.com", - "ads.cc-dt.com", - "ads.pubmatic.com", - "ads.yahoo.com", - "adservices.google.com", - "adwords.google.lloymlincs.com", - "affiliate.2mdn.net", - "affiliate.googleusercontent.com", - "agkn.com", - "aktrack.pubmatic.com", - "amn.doubleclick.net", - "analytic-google.com", - "analytics-api-samples.googlecode.com", - "analytics.google.com", - "analytics.spotify.com", - "anon.doubleclick.speedera.net", - "aud.pubmatic.com", - "audio-ec.spotify.com", - "audio-fa.spotify.com", - "audio-sp-ash.spotify.com", - "audio-sp-tyo.spotify.com", - "audio-sp.spotify.com", - "audio2.spotify.com", - "b.scorecardresearch.com", - "bid.g.doubleclick.net", - "bid.pubmatic.com", - "bounceexchange.com", - "bs.serving-sys.com", - "buttons.googlesyndication.com", - "cc-dt.com", - "clickserve.cc-dt.com", - "clientmetrics-pa.googleapis.com", - "cloudfront.net", - "cm.g.doubleclick.net", - "content.bitsontherun.com", - "core.insightexpressai.com", - "crashdump.spotify.com", - "creative.cc-dt.com", - "creatives.doubleclick.net", - "d2gi7ultltnc2u.cloudfront.net", - "d3rt1990lpmkn.cloudfront.net", - "desktop.spotify.com", - "dfp.doubleclick.net", - "domains.googlesyndication.com", - "doubleclick.com", - "doubleclick.de", - "doubleclick.ne.jp", - "doubleclick.net", - "dp.g.doubleclick.net", - "ds.serving-sys.com", - "ebaycn.doubleclick.net", - "ebaytw.doubleclick.net", - "exnjadgda1.doubleclick.net", - "exnjadgda2.doubleclick.net", - "exnjadgds1.doubleclick.net", - "exnjmdgda1.doubleclick.net", - "exnjmdgds1.doubleclick.net", - "fastclick.net", - "feedads.g.doubleclick.net", - "feedads.googleadservices.com", - "fgoogle.com", - "fls.au.doubleclick.net", - "fls.doubleclick.net", - "fls.uk.doubleclick.net", - "gads.pubmatic.com", - "gan.doubleclick.net", - "gcdn.2mdn.net", - "gd1.doubleclick.net", - "gd10.doubleclick.net", - "gd11.doubleclick.net", - "gd12.doubleclick.net", - "gd13.doubleclick.net", - "gd14.doubleclick.net", - "gd15.doubleclick.net", - "gd16.doubleclick.net", - "gd17.doubleclick.net", - "gd18.doubleclick.net", - "gd19.doubleclick.net", - "gd2.doubleclick.net", - "gd20.doubleclick.net", - "gd21.doubleclick.net", - "gd22.doubleclick.net", - "gd23.doubleclick.net", - "gd24.doubleclick.net", - "gd25.doubleclick.net", - "gd26.doubleclick.net", - "gd27.doubleclick.net", - "gd28.doubleclick.net", - "gd29.doubleclick.net", - "gd3.doubleclick.net", - "gd30.doubleclick.net", - "gd31.doubleclick.net", - "gd4.doubleclick.net", - "gd5.doubleclick.net", - "gd7.doubleclick.net", - "gd8.doubleclick.net", - "gd9.doubleclick.net", - "google-analytics.com", - "googleads.g.doubleclick.net", - "googleads2.g.doubleclick.net", - "googleads4.g.doubleclick.net", - "googleadservices.com", - "googlepositions.com", - "googlesyndication.com", - "googletagservices.com", - "gtssl2-ocsp.geotrust.com", - "gvt1.com", - "haso.pubmatic.com", - "heads-fab.spotify.com", - "image2.pubmatic.com", - "ir.doubleclick.net", - "iv.doubleclick.net", - "js.moatads.com", - "ln.doubleclick.net", - "log.spotify.com", - "m.2mdn.net", - "m.de.2mdn.net", - "m.doubleclick.net", - "m.fr.2mdn.net", - "m.uk.2mdn.net", - "m1.2mdn.net", - "m1.ae.2mdn.net", - "m1.au.2mdn.net", - "m1.be.2mdn.net", - "m1.br.2mdn.net", - "m1.ca.2mdn.net", - "m1.cn.2mdn.net", - "m1.de.2mdn.net", - "m1.dk.2mdn.net", - "m1.doubleclick.net", - "m1.emea.2mdn.net", - "m1.emea.2mdn.net.edgesuite.net", - "m1.es.2mdn.net", - "m1.fi.2mdn.net", - "m1.fr.2mdn.net", - "m1.it.2mdn.net", - "m1.jp.2mdn.net", - "m1.nl.2mdn.net", - "m1.no.2mdn.net", - "m1.nz.2mdn.net", - "m1.pl.2mdn.net", - "m1.se.2mdn.net", - "m1.sg.2mdn.net", - "m1.uk.2mdn.net", - "m1.ve.2mdn.net", - "m1.za.2mdn.net", - "m2.ae.2mdn.net", - "m2.au.2mdn.net", - "m2.be.2mdn.net", - "m2.br.2mdn.net", - "m2.ca.2mdn.net", - "m2.cn.2mdn.net", - "m2.cn.doubleclick.net", - "m2.de.2mdn.net", - "m2.dk.2mdn.net", - "m2.doubleclick.net", - "m2.es.2mdn.net", - "m2.fi.2mdn.net", - "m2.fr.2mdn.net", - "m2.it.2mdn.net", - "m2.jp.2mdn.net", - "m2.nl.2mdn.net", - "m2.no.2mdn.net", - "m2.nz.2mdn.net", - "m2.pl.2mdn.net", - "m2.se.2mdn.net", - "m2.sg.2mdn.net", - "m2.uk.2mdn.net", - "m2.ve.2mdn.net", - "m2.za.2mdn.net", - "m3.2mdn.net", - "m3.ae.2mdn.net", - "m3.au.2mdn.net", - "m3.be.2mdn.net", - "m3.br.2mdn.net", - "m3.ca.2mdn.net", - "m3.cn.2mdn.net", - "m3.de.2mdn.net", - "m3.dk.2mdn.net", - "m3.doubleclick.net", - "m3.es.2mdn.net", - "m3.fi.2mdn.net", - "m3.fr.2mdn.net", - "m3.it.2mdn.net", - "m3.jp.2mdn.net", - "m3.nl.2mdn.net", - "m3.no.2mdn.net", - "m3.nz.2mdn.net", - "m3.pl.2mdn.net", - "m3.se.2mdn.net", - "m3.sg.2mdn.net", - "m3.uk.2mdn.net", - "m3.ve.2mdn.net", - "m3.za.2mdn.net", - "m4.ae.2mdn.net", - "m4.afs.googleadservices.com", - "m4.au.2mdn.net", - "m4.be.2mdn.net", - "m4.br.2mdn.net", - "m4.ca.2mdn.net", - "m4.cn.2mdn.net", - "m4.de.2mdn.net", - "m4.dk.2mdn.net", - "m4.doubleclick.net", - "m4.es.2mdn.net", - "m4.fi.2mdn.net", - "m4.fr.2mdn.net", - "m4.it.2mdn.net", - "m4.jp.2mdn.net", - "m4.nl.2mdn.net", - "m4.no.2mdn.net", - "m4.nz.2mdn.net", - "m4.pl.2mdn.net", - "m4.se.2mdn.net", - "m4.sg.2mdn.net", - "m4.uk.2mdn.net", - "m4.ve.2mdn.net", - "m4.za.2mdn.net", - "m5.ae.2mdn.net", - "m5.au.2mdn.net", - "m5.be.2mdn.net", - "m5.br.2mdn.net", - "m5.ca.2mdn.net", - "m5.cn.2mdn.net", - "m5.de.2mdn.net", - "m5.dk.2mdn.net", - "m5.doubleclick.net", - "m5.es.2mdn.net", - "m5.fi.2mdn.net", - "m5.fr.2mdn.net", - "m5.it.2mdn.net", - "m5.jp.2mdn.net", - "m5.nl.2mdn.net", - "m5.no.2mdn.net", - "m5.nz.2mdn.net", - "m5.pl.2mdn.net", - "m5.se.2mdn.net", - "m5.sg.2mdn.net", - "m5.uk.2mdn.net", - "m5.ve.2mdn.net", - "m5.za.2mdn.net", - "m6.ae.2mdn.net", - "m6.au.2mdn.net", - "m6.be.2mdn.net", - "m6.br.2mdn.net", - "m6.ca.2mdn.net", - "m6.cn.2mdn.net", - "m6.de.2mdn.net", - "m6.dk.2mdn.net", - "m6.doubleclick.net", - "m6.es.2mdn.net", - "m6.fi.2mdn.net", - "m6.fr.2mdn.net", - "m6.it.2mdn.net", - "m6.jp.2mdn.net", - "m6.nl.2mdn.net", - "m6.no.2mdn.net", - "m6.nz.2mdn.net", - "m6.pl.2mdn.net", - "m6.se.2mdn.net", - "m6.sg.2mdn.net", - "m6.uk.2mdn.net", - "m6.ve.2mdn.net", - "m6.za.2mdn.net", - "m7.ae.2mdn.net", - "m7.au.2mdn.net", - "m7.be.2mdn.net", - "m7.br.2mdn.net", - "m7.ca.2mdn.net", - "m7.cn.2mdn.net", - "m7.de.2mdn.net", - "m7.dk.2mdn.net", - "m7.doubleclick.net", - "m7.es.2mdn.net", - "m7.fi.2mdn.net", - "m7.fr.2mdn.net", - "m7.it.2mdn.net", - "m7.jp.2mdn.net", - "m7.nl.2mdn.net", - "m7.no.2mdn.net", - "m7.nz.2mdn.net", - "m7.pl.2mdn.net", - "m7.se.2mdn.net", - "m7.sg.2mdn.net", - "m7.uk.2mdn.net", - "m7.ve.2mdn.net", - "m7.za.2mdn.net", - "m8.ae.2mdn.net", - "m8.au.2mdn.net", - "m8.be.2mdn.net", - "m8.br.2mdn.net", - "m8.ca.2mdn.net", - "m8.cn.2mdn.net", - "m8.de.2mdn.net", - "m8.dk.2mdn.net", - "m8.doubleclick.net", - "m8.es.2mdn.net", - "m8.fi.2mdn.net", - "m8.fr.2mdn.net", - "m8.it.2mdn.net", - "m8.jp.2mdn.net", - "m8.nl.2mdn.net", - "m8.no.2mdn.net", - "m8.nz.2mdn.net", - "m8.pl.2mdn.net", - "m8.se.2mdn.net", - "m8.sg.2mdn.net", - "m8.uk.2mdn.net", - "m8.ve.2mdn.net", - "m8.za.2mdn.net", - "m9.ae.2mdn.net", - "m9.au.2mdn.net", - "m9.be.2mdn.net", - "m9.br.2mdn.net", - "m9.ca.2mdn.net", - "m9.cn.2mdn.net", - "m9.de.2mdn.net", - "m9.dk.2mdn.net", - "m9.doubleclick.net", - "m9.es.2mdn.net", - "m9.fi.2mdn.net", - "m9.fr.2mdn.net", - "m9.it.2mdn.net", - "m9.jp.2mdn.net", - "m9.nl.2mdn.net", - "m9.no.2mdn.net", - "m9.nz.2mdn.net", - "m9.pl.2mdn.net", - "m9.se.2mdn.net", - "m9.sg.2mdn.net", - "m9.uk.2mdn.net", - "m9.ve.2mdn.net", - "m9.za.2mdn.net", - "marketing.doubleclickindustries.com", - "media-match.com", - "mimageads.googleadservices.com", - "mimageads1.googleadservices.com", - "mimageads2.googleadservices.com", - "mimageads3.googleadservices.com", - "mimageads4.googleadservices.com", - "mimageads5.googleadservices.com", - "mimageads6.googleadservices.com", - "mimageads7.googleadservices.com", - "mimageads8.googleadservices.com", - "mimageads9.googleadservices.com", - "motifcdn.doubleclick.net", - "motifcdn2.doubleclick.net", - "mpartner.googleadservices.com", - "n3302ad.doubleclick.net", - "n3349ad.doubleclick.net", - "n4052ad.doubleclick.net", - "n4061ad.doubleclick.net", - "n4061ad.hk.doubleclick.net", - "n4403ad.doubleclick.net", - "n479ad.doubleclick.net", - "omaze.com", - "open.spotify.com", - "optimize.doubleclick.net", - "pagead-googlehosted.l.google.com", - "pagead.googlesyndication.com", - "pagead.l.doubleclick.net", - "pagead.l.google.com", - "pagead1.googlesyndication.com", - "pagead2.googleadservices.com", - "pagead2.googlesyndication.com", - "pagead3.googlesyndication.com", - "pagead46.l.doubleclick.net", - "partner.googleadservices.com", - "partnerad.l.doubleclick.net", - "partnerad.l.google.com", - "paypalssl.doubleclick.net", - "pubads.g.doubleclick.net", - "pubmatic.com", - "ravenjs.com", - "rd.intl.doubleclick.net", - "redirector.gvt1.com", - "rlcdn.com", - "rmcdn.2mdn.net", - "rmcdn.f.2mdn.net", - "router.googlecom.biz", - "s0.2mdn.net", - "s1.2mdn.net", - "s2.video.doubleclick.net", - "securepubads.g.doubleclick.net", - "showads.pubmatic.com", - "showads1000.pubmatic.com", - "showadsak.pubmatic.com", - "so.2mdn.net", - //"spclient.wg.spotify.com", - "ssl.google-analytics.com", - "static.2mdn.net", - "static.doubleclick.net", - "stats.g.doubleclick.net", - "survey.g.doubleclick.net", - "tpc.googlesyndication.com", - "track.pubmatic.com", - "twx.2mdn.net", - "twx.doubleclick.net", - "uunyadgda1.doubleclick.net", - "uunyadgds1.doubleclick.net", - "v.jwpcdn.com", - "video-ad-stats.googlesyndication.com", - "video-stats.video.google.com", - "weblb-wg.gslb.spotify.com", - "wintricksbanner.googlepages.com", - "www-google-analytics.l.google.com", - "www-google.nl", - "www.adwords.google.lloymlincs.com", - "www.analytic-google.com", - "www.doubleclick.com", - "www.doubleclick.net", - "www.doubleclickbygoogle.com", - "www.google-analytics.com", - "www.google-docs.info", - "www.google-docs.org", - "www.google-tour.com", - "www.google.ienet.pl", - "www.google.xweb24.pl", - "www.googleadservices.com", - "www.googleapps-espana.com", - "www.googleapps-jobs.com", - "www.googleapps-spain.com", - "www.googlechrome2013.com", - "www.googletagmanager.com", - "www.googletagservices.com", - "www.googlew.com", - "www.googlewordpad.info", - "www.partner.googleadservices.com", - "www.www-google.nl", - "www.wwwgoogles.com", - "www2.doubleclick.com", - "www3.doubleclick.com", - "www3.doubleclick.net", - "video-ad-stats.googlesyndication.com", - "weblb-wg.dual-gslb.spotify.com", - "weblb-wg.gslb.spotify.com", - "ds.serving-sys.com", - "bs.serving-sys.com" - */ \ No newline at end of file +#endif /* _HOSTS_H */ diff --git a/src/stdafx.h b/src/stdafx.h index 2adc2ca..4d258c7 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -13,13 +13,14 @@ // TODO: reference additional headers your program requires here -#include "../mhook/mhook-lib/mhook.h" -#include "hosts.h" -#include #include #include #include - -#pragma comment(lib, "Ws2_32.lib") +#include +#include +#include +#include "HookApi.h" +#include "hosts.h" #pragma comment(lib, "Psapi.lib") -#pragma comment(lib, "Version.lib") \ No newline at end of file +#pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "Winhttp.lib")