HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. OpenGL32 Detector
  3.  
  4. based form https://forums.alliedmods.net/showthread.php?t=122280&page=4
  5.   added some file management and stats
  6.  
  7. Description:
  8. Using precache mechanism checks if conecting player have same version of opengl32.dll
  9. like server.Player will be punish after first attack.
  10.  
  11.  
  12. Required:
  13. At least one file of opengl32.dll in root of server,
  14. or a colection of files in opengl32 directory
  15.  
  16. Usage:
  17. copy any opengl32.dll file in opengl32 directory with wich name you want, after map change
  18.  
  19. amx_opengl_list to view aviable files
  20. amx_opegl_set x where x is form amx_opengl_list for a fixed file check
  21. or 0/without argument for cyclic files
  22.  
  23. after a while you can delete ineffctive files from opengl directory to have a sorter cycle
  24.  
  25. Credits:
  26. - xPaw: for ideea
  27. - Fanopike for effort to decompile an plugin with rate backdoor
  28. - Johnny got his gun for copy_file function
  29. */
  30. #include <amxmodx>
  31. #include <amxmisc>
  32. #define PLUGIN "OpenglCheck"
  33. #define VERSION "1.1"
  34. #define AUTHOR "xYz"
  35.  
  36. new g_CheckPlayer[33]
  37. new g_PunishPlayer[33]
  38.  
  39. new g_File[17] = "../opengl32.dll"
  40. new g_PrecFile[32]
  41. new g_Path[12] ="../opengl32"
  42. new Array:g_Files
  43.  
  44. //cvars in amxx.cfg if you want other than plugin defaults
  45. new g_Enable
  46. new g_PunishType
  47. new g_BanTime
  48. new g_ShowAdmin
  49.  
  50. // from http://forums.alliedmods.net/showthread.php?t=13783
  51. stock bool:file_copy(SOURCE[], TARGET[], error[], const ERRORLEN, const bool:REPLACE_TARGET = false)
  52. {
  53. if (!file_exists(SOURCE))
  54. {
  55. format(error, ERRORLEN, "Fajl masolas hiba: Forras ^"%s^" nem talalt!", SOURCE)
  56. return false
  57. }
  58. if (!REPLACE_TARGET && file_exists(TARGET))
  59. {
  60. format(error, ERRORLEN, "Fajl masolas hiba: celpont ^"%s^" talalt!", TARGET)
  61. return false
  62. }
  63.  
  64. new source = fopen(SOURCE, "rb")
  65. if (!source)
  66. {
  67. format(error, ERRORLEN, "Fajl masolas hiba: Forras megnyitasa ^"%s^" sikertelen!", SOURCE)
  68. return false
  69. }
  70.  
  71. new target = fopen(TARGET, "wb")
  72. if (!target)
  73. {
  74. format(error, ERRORLEN, "Fajl masolas hiba: Celpont elerese ^"%s^" sikertelen!", TARGET)
  75. fclose(source)
  76. return false
  77. }
  78.  
  79. for (new buffer, eof = feof(source); !eof; !eof && fputc(target, buffer))
  80. {
  81. buffer = fgetc(source)
  82. eof = feof(source)
  83. }
  84.  
  85. fclose(source)
  86. fclose(target)
  87.  
  88. return true
  89. }
  90.  
  91. public plugin_init()
  92. {
  93. register_plugin(PLUGIN, VERSION, AUTHOR)
  94. register_concmd("amx_opengl_list","opengl_list",ADMIN_BAN,"List opengl files and stats")
  95. register_concmd("amx_opengl_set","opengl_set",ADMIN_BAN,"'opengl_set x' 1->nr.max. Set specific opengl file for nextmap or 0 for cyclic")
  96. register_event("Damage", "Event_Damage", "b", "2!0", "3=0", "4!0");
  97.  
  98. g_Enable = register_cvar("opengl_enable", "1") // enable?
  99. g_BanTime = register_cvar("opengl_bantime", "43200") // 30 Days BAN (43200 minutes)
  100. g_PunishType = register_cvar("opengl_punish_type", "1") // 1-ban,2-kick,3-log
  101. g_ShowAdmin = register_cvar("opengl_show_admin", "1") // 0-disable,1-anounce admins,2-anounce everybody
  102.  
  103. if (!file_exists(g_File))
  104. {
  105. server_print("[OpenglCheck] Nincs opengl32 ,plugin leallt!!!")
  106. set_pcvar_num(g_Enable,0)
  107. //return PLUGIN_HANDLED
  108. }
  109.  
  110. set_task(1.0,"load")
  111. return PLUGIN_CONTINUE
  112. }
  113.  
  114. public load()
  115. {
  116. //If no opengl directory, no file manipulation
  117. if (!dir_exists(g_Path))
  118. {
  119. server_print("[OpenglCheck] Nincs mappa opengl32 forras fajlokkal!!!")
  120. return PLUGIN_HANDLED
  121. }
  122.  
  123. //check and copy opengl file in case of first time run plugin
  124. new glfile[32], glfile_path[64], err[64]
  125.  
  126. if(!file_exists(g_File))
  127. {
  128. new gldir = open_dir(g_Path,glfile,31)
  129.  
  130. formatex(glfile_path,63,"%s/%s",g_Path,glfile)
  131. file_copy(glfile_path,g_File,err,63,true)
  132.  
  133. if (strlen(err)>0)
  134. {
  135. server_print("[OpenglCheck] %s",err)
  136. server_print("[OpenglCheck] Ervenytelen opengl32 fajl!!!")
  137. return PLUGIN_HANDLED
  138. }
  139. close_dir(gldir)
  140. }
  141.  
  142. //Loop opengl dir to identify curent opengl file with md5,
  143. //and store names for setting next precache file
  144.  
  145. new prec_buff[34], glfile_buff[34]
  146. md5_file(g_File,prec_buff)
  147.  
  148. g_Files = ArrayCreate(32);
  149. new gldir = open_dir(g_Path,glfile,31)
  150. new maxarr = 0
  151.  
  152. do
  153. {
  154. if(strlen(glfile)>3)
  155. {
  156. if(contain(glfile,"@")!=-1) //rename opengl file in case of contain @ ,is used later as token
  157. {
  158. new renfile[64]
  159.  
  160. formatex(renfile,63,"%s",glfile)
  161. replace(glfile,31,"@","")
  162. formatex(glfile_path,63,"%s/%s",g_Path,glfile)
  163. format(renfile,63,"%s/%s",g_Path,renfile)
  164.  
  165. rename_file(renfile,glfile_path,true)
  166. server_print("[OpenglCheck] Ervenytelen opengl32 fajl nev: %s atnevezve: %s",renfile,glfile_path)
  167. }
  168.  
  169. formatex(glfile_path,63,"%s/%s",g_Path,glfile)
  170. md5_file(glfile_path,glfile_buff)
  171. if(equal(prec_buff,glfile_buff))
  172. {
  173. copy(g_PrecFile,31,glfile)
  174. server_print("[OpenglCheck] Betoltott opengl32 fajl: %s",g_PrecFile)
  175. }
  176. ArrayPushString(g_Files,glfile);
  177. maxarr += 1;
  178. }
  179.  
  180. }
  181. while ( next_file(gldir,glfile,31))
  182. close_dir(gldir)
  183.  
  184. //check and update list of files
  185. new listfile[128]
  186.  
  187. get_configsdir(listfile,127)
  188. format(listfile,127,"%s/openglfiles.txt",listfile)
  189.  
  190. if(!file_exists(listfile))
  191. {
  192. server_print("[OpenglCheck] openglfiles.txt nem letezik, hozd letre !!!")
  193. write_file(listfile,g_PrecFile,0)
  194. write_file(listfile,"0",1)
  195. }
  196.  
  197. new i, chk, lstfile[36],chkfile[36],arrfile[32], maxlst, len
  198.  
  199. //new maxlst = file_size(listfile,1)
  200.  
  201. for(i = 0 ; i < maxarr ; i++)
  202. {
  203. ArrayGetString(g_Files,i,arrfile,31)
  204. formatex(chkfile,35,"@%s",arrfile)
  205. chk = 0
  206.  
  207. //loop inside list file to check new opengl files from dir
  208. //for loop is shortly than while loop because skip first 2 lines, but spent time with reading maxlines
  209. /*
  210. new listfile_handle = fopen( listfile, "rt" );
  211. while(!feof(listfile_handle))
  212. {
  213. fgets(listfile_handle,lstfile,35)
  214. if(strlen(lstfile) >10)
  215. {
  216. if (strfind(lstfile,chkfile)!=-1)
  217. chk += 1
  218. }
  219. }
  220. */
  221.  
  222. new j
  223. maxlst = file_size(listfile,1)
  224.  
  225. for(j = 2 ; j < maxlst-1 ; j++)
  226. {
  227. read_file(listfile,j,lstfile,31,len)
  228. if (strfind(lstfile,chkfile)!=-1)
  229. chk += 1
  230. }
  231.  
  232. if (chk == 0)
  233. {
  234. server_print("[OpenglCheck] opengl fajl iras %s listaba",chkfile)
  235. format(chkfile,35,"0%s",chkfile)
  236. write_file(listfile,chkfile,-1)
  237. }
  238. }
  239.  
  240. //set nextopengl file
  241. new nextfile[32], setfile[32], pos
  242.  
  243. read_file(listfile,0,nextfile,31,len)
  244. read_file(listfile,1,setfile,31,len)
  245.  
  246. if( strlen(setfile) < 2 ) //cycle ?
  247. {
  248.  
  249. if(maxlst > 3) //in case of firstime running or only one file in opengl dir
  250. {
  251. i=0
  252. for( i = 0 ; i < maxarr ; i++ )
  253. {
  254. ArrayGetString(g_Files,i,chkfile,31)
  255.  
  256. if ( strfind(nextfile,chkfile) != -1)
  257. {
  258. if (i == maxarr-1)
  259. pos = 0
  260. else
  261. pos = i+1
  262. }
  263. }
  264. ArrayGetString(g_Files,pos,nextfile,31)
  265. }
  266. else
  267. {
  268. copy(nextfile,31,g_PrecFile)
  269. }
  270.  
  271. formatex(glfile_path,63,"%s/%s",g_Path,nextfile)
  272. write_file(listfile,nextfile,0)
  273. }
  274. else
  275. {
  276. formatex(glfile_path,63,"%s/%s",g_Path,setfile)
  277. }
  278.  
  279. ArrayDestroy(g_Files);
  280.  
  281. file_copy(glfile_path,g_File,err,63,true)
  282. if (strlen(err)>0)
  283. server_print("[OpenglCheck] %s",err)
  284. return PLUGIN_CONTINUE
  285. }
  286.  
  287. public plugin_precache()
  288. {
  289. force_unmodified(force_exactfile, {0,0,0},{0,0,0}, g_File)
  290. }
  291.  
  292. public inconsistent_file(id, const filename[], reason[64])
  293. {
  294. if (equal(filename,g_File))
  295. {
  296. g_CheckPlayer[id]=1
  297. g_PunishPlayer[id]=0
  298. }
  299. return PLUGIN_HANDLED //to avoid kicking player without opengl file
  300. }
  301.  
  302. public client_connect(id)
  303. {
  304. g_CheckPlayer[id]=0
  305. g_PunishPlayer[id]=1
  306. if((get_pcvar_num(g_Enable)==0)&&(file_exists (g_File)))
  307. set_pcvar_num(g_Enable,1)
  308. return PLUGIN_CONTINUE
  309. }
  310.  
  311. public client_putinserver(id)
  312. {
  313. if ( is_user_hltv(id) || is_user_bot(id) )
  314. {
  315. g_PunishPlayer[id]=0
  316. g_CheckPlayer[id]=1
  317. return PLUGIN_HANDLED
  318. }
  319. set_task(5.0, "check_file", id)
  320. return PLUGIN_HANDLED
  321. }
  322.  
  323. public client_disconnect(id)
  324. {
  325. g_CheckPlayer[id]=0
  326. g_PunishPlayer[id]=0
  327. if(task_exists(id))
  328. remove_task(id)
  329. }
  330.  
  331. public Event_Damage(id)
  332. {
  333. if(get_pcvar_num(g_Enable)==0)
  334. return PLUGIN_HANDLED
  335. if (id>0) {
  336. new attacker = get_user_attacker(id)
  337. if (attacker > 0 && attacker <= 32)
  338. {
  339. if(g_PunishPlayer[attacker]==0)
  340. return PLUGIN_HANDLED
  341. if(g_CheckPlayer[attacker]==0)
  342. set_task(1.0,"punish_player",attacker+33)
  343. }
  344. }
  345. return PLUGIN_CONTINUE;
  346. }
  347.  
  348. public check_file(id)
  349. {
  350. if(get_pcvar_num(g_Enable)==0)
  351. return PLUGIN_HANDLED
  352.  
  353. //anounce admins about entered suspicious player
  354. if(g_CheckPlayer[id]==0)
  355. {
  356. new name[32]
  357. get_user_name(id, name, sizeof(name)-1)
  358.  
  359. new msg[127]
  360. switch(get_pcvar_num(g_PunishType))
  361. {
  362. case 1:
  363. formatex(msg,127,"; bannolva lesz %d percre. az elso loves utan", get_pcvar_num(g_BanTime) )
  364. case 2:
  365. formatex(msg,127,"; kickelve lesz az elso loves utan")
  366. case 3:
  367. formatex(msg,127,"!!!")
  368. default:
  369. formatex(msg,127,"; bannolva lesz %d percre. az elso loves utan", get_pcvar_num(g_BanTime) )
  370. }
  371. format(msg,127,"[OpenglCheck] Jatekos: %s OpenGL32 hack fajllal rendelkezik, %s",name,msg)
  372.  
  373. switch(get_pcvar_num(g_ShowAdmin))
  374. {
  375. case 0:
  376. return PLUGIN_HANDLED
  377. case 1:
  378. {
  379. new players[32],num,i;
  380. get_players(players,num,"c");
  381. for(i=1;i<num;i++)
  382. {
  383. if( get_user_flags(i) & ADMIN_KICK )
  384. client_print(i,print_chat," %s",msg);
  385. }
  386. }
  387. case 2:
  388. client_print(0,print_chat," %s",msg);
  389. default:
  390. client_print(0,print_chat," %s",msg);
  391. }
  392. }
  393. return PLUGIN_CONTINUE;
  394. }
  395.  
  396. public punish_player(id)
  397. {
  398.  
  399. if(get_pcvar_num(g_Enable)==0)
  400. return PLUGIN_HANDLED
  401.  
  402. new name[32], authid[32], ip[32]
  403. id -= 33
  404. get_user_authid(id, authid, sizeof(authid)-1)
  405. get_user_ip(id, ip, 31, 1)
  406. get_user_name(id, name, sizeof(name)-1)
  407.  
  408. client_print(id,print_chat,"[OpenglCheck]OpenGL32 Hacket talaltunk nalad") // my amx_ban take screenshot
  409.  
  410. switch(get_pcvar_num(g_PunishType))
  411. {
  412. case 1:
  413. server_cmd("amx_ban %s %d ^"Wallhack OpenGL^"", name, get_pcvar_num(g_BanTime) )
  414. case 2:
  415. server_cmd("kick %s Wallhack OpenGL", name)
  416. default:
  417. server_cmd("amx_ban %s %d ^"Wallhack OpenGL^"", name, get_pcvar_num(g_BanTime) )
  418. }
  419.  
  420. log_amx("Wallhack OpenGL version %s talalt rajta: %s<%s><%s> ",g_PrecFile, name, ip, authid)
  421. g_PunishPlayer[id]=0
  422. set_pcvar_num(g_Enable,0) //disable ulterior get_user_attacker(id) from event_damage
  423.  
  424. //increment number in opengl list file
  425.  
  426. new listfile[128]
  427. get_configsdir(listfile,127)
  428. format(listfile,127,"%s/openglfiles.txt",listfile)
  429.  
  430. new upfile[36]
  431. formatex(upfile,35,"@%s",g_PrecFile)
  432.  
  433. if(!file_exists(listfile)) //in case of opengl dir not exist but opengl file exist in first time run
  434. {
  435. server_print("[OpenglCheck] Lista az openglfajlkrol nem letezik, letrehoztuk,hogy lasd hany jatekos lett eszlelve ilyen fajllal!!!")
  436.  
  437. write_file(listfile,g_PrecFile,0)
  438. write_file(listfile,"0",1)
  439.  
  440. format(upfile,35,"1%s",upfile)
  441. write_file(listfile,upfile,2)
  442.  
  443. return PLUGIN_HANDLED;
  444. }
  445.  
  446. //loop list file to find and extract number for precached file
  447. new maxlst = file_size(listfile,1)
  448. new i,chkfile[36], pnumstr[5], pnum, pos, len
  449.  
  450. for( i = 2 ; i < maxlst - 1 ; i++)
  451. {
  452. read_file(listfile,i,chkfile,35,len)
  453.  
  454. if(strfind(chkfile,upfile) != -1 )
  455. {
  456. strtok(chkfile,pnumstr,4,chkfile,31,'@')
  457. pnum=str_to_num(pnumstr)
  458. pnum += 1
  459. format(upfile,35,"%d%s",pnum,upfile)
  460. pos = i
  461. }
  462. }
  463. if(pos) //be sure to avoid damage file
  464. write_file(listfile,upfile,pos)
  465. return PLUGIN_HANDLED;
  466. }
  467.  
  468.  
  469.  
  470. public opengl_list(id, level, cid)
  471. {
  472. if (!cmd_access(id, level, cid, 1))
  473. return PLUGIN_HANDLED;
  474.  
  475. new listfile[128]
  476. get_configsdir(listfile,127)
  477. formatex(listfile,127,"%s/openglfiles.txt",listfile)
  478.  
  479. new maxlst = file_size(listfile,1)
  480. new i, name[36], chkfile[64], pnum[5],len
  481.  
  482. console_print(id,"---- Opengl fajlok statusza ----")
  483. console_print(id,"Jelenlegi fajl %s",g_PrecFile)
  484.  
  485. read_file(listfile,0,name,35,len)
  486. console_print(id,"kovetkezo fajl %s",name)
  487.  
  488. read_file(listfile,1,name,35,len)
  489.  
  490. if(strlen(name)<5)
  491. console_print(id,"Cyclic files on")
  492. else
  493. console_print(id,"Cyclic files off, desired opengl file : %s",name)
  494.  
  495. for( i = 2 ; i < maxlst - 1 ; i++)
  496. {
  497. read_file(listfile,i,name,35,len)
  498. strtok(name,pnum,4,name,31,'@')
  499. format(chkfile,63,"%s/%s",g_Path,name)
  500.  
  501. if(file_exists(chkfile))
  502. console_print(id,"%d. %s talalt %s jatekoson",i-1,name,pnum)
  503. else
  504. console_print(id,"%d. %s talalt %s jatekosokon * deleted file",i-1,name,pnum)
  505. }
  506. return PLUGIN_CONTINUE;
  507. }
  508.  
  509. public opengl_set(id, level, cid)
  510. {
  511. if (!cmd_access(id, level, cid, 1))
  512. return PLUGIN_HANDLED;
  513.  
  514. new listfile[128]
  515.  
  516. get_configsdir(listfile,127)
  517. formatex(listfile,127,"%s/openglfiles.txt",listfile)
  518.  
  519. //in case of running server, between maps and populate opengl directory with files
  520. if(!file_exists(listfile))
  521. {
  522. console_print(id,"[OpenglCheck] Lista az openglfajlokrol nem letezik, letrehoztuk ")
  523. write_file(listfile,g_PrecFile,0)
  524. write_file(listfile,"0",1)
  525. return PLUGIN_HANDLED;
  526. }
  527.  
  528. new arg[4];
  529. read_argv(1,arg,3);
  530.  
  531. new lstmax = file_size(listfile,1)
  532.  
  533. new pos = str_to_num(arg)
  534.  
  535. if ( pos ==0 )
  536. {
  537. console_print(id,"[OpenglCheck] you choose for cyclic files")
  538. write_file(listfile,"0",1)
  539. return PLUGIN_HANDLED;
  540. }
  541.  
  542. if ( (pos < 0) || ( pos > lstmax - 1 ) )
  543. {
  544. console_print(id,"[OpenglCheck] Ervenytelen fajl szamozas, hasznald az amx_opengl_list parancsot,hogy megnezd a korrekt szamot")
  545. return PLUGIN_HANDLED;
  546. }
  547.  
  548. new name[36], chkfile[64], pnum[5], len
  549.  
  550. read_file(listfile,pos+1,name,35,len)
  551. strtok(name,pnum,4,name,31,'@')
  552.  
  553. //check if file was not deleted from opengl32 dir
  554. format(chkfile,63,"%s/%s",g_Path,name)
  555.  
  556. if(!file_exists(chkfile))
  557. {
  558. console_print(id,"[OpenglCheck] Ervenytelen fajl szamozas, torolve lett, hasznald az amx_opengl_list parancsot,hogy megnezd a korrekt szamot")
  559. return PLUGIN_HANDLED;
  560. }
  561.  
  562. write_file(listfile,name,1)
  563. console_print(id,"[OpenglCheck] Kivalasztottad a %d következo betoltott fajlt %s",pos,name)
  564.  
  565. set_task(1.0,"load")
  566. return PLUGIN_CONTINUE;
  567. }
  568. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  569. *{\\ rtf1\\ ansi\\ ansicpg1252\\ uc1\\ deff0\\ deflang1033\\ deflangfe1033{\\ fonttbl{\\ f0 Tahoma;}}\n\\ f0{\\ colortbl;}{\\ *\\ generator Wine Riched20 2.0.????;}\\ pard\\ sl-240\\ slmult1\\ li0\\ fi0\\ ri0\\ sa0\\ sb0\\ s-1\\ cfpat0\\ cbpat0\n\\ par}
  570. */
  571.