Код:
#include <amxmisc>
#define VERSION "2.2"
new g_filenameprecached[64], test_opengl32[33], precache_opengl32[64][64]
new g_num_opengl32 = 0
new g_configsdir[64], md5buffer[34]
public plugin_init()
{
register_plugin("CSF OpenGL32", VERSION, "CSF")
server_cmd("mp_consistency 1")
if(file_exists("..\opengl32.dll"))
{
md5_file("..\opengl32.dll", md5buffer)
}
server_print("^n [CSF-AC] OpenGL32 * FileName <%s>", g_filenameprecached)
server_print("^n [CSF-AC] OpenGL32 * MD5 <%s>", md5buffer)
}
public plugin_precache()
{
get_configsdir(g_configsdir, 63)
checkfiles_opengl32()
setfile_opengl32()
force_unmodified(force_exactfile, {0,0,0}, {0,0,0}, "../opengl32.dll")
}
public setfile_opengl32()
{
if(g_num_opengl32==0)
{
server_print("^t[CSF-AC] OpenGL32 * Not Found Files")
return PLUGIN_HANDLED
}
new len, text[64], next_file[64], check, notagain, frmError[64], filecfg[128]
format(filecfg, 127, "%s/csf_anticheat/csf_ac_opengl32_lastdll.cfg", g_configsdir)
if(file_exists(filecfg))
read_file(filecfg, 0, text, 63, len)
else
write_file(filecfg, "", 0)
for(new i;i<=g_num_opengl32;i++)
{
if(check == 1 && notagain == 0)
{
notagain = 1
format(next_file, 63, "%s", precache_opengl32[i])
}
if(equal(text, precache_opengl32[i]))
{
check = 1
}
}
if(file_exists("..\opengl32.dll"))
{
delete_file("..\opengl32.dll")
}
if(strlen(next_file) < 3 || check == 0)
{
format(g_filenameprecached, 63, "%s", precache_opengl32[1])
file_copy(precache_opengl32[1], "..\opengl32.dll", frmError, 63, true)
format(next_file, 63, "%s", precache_opengl32[1])
}
else
{
format(g_filenameprecached, 63, "%s", next_file)
file_copy(next_file, "..\opengl32.dll", frmError, 63, true)
}
if(strlen(frmError) > 0)
server_print("^t[CSF-AC] OpenGL32 * %s", frmError)
write_file(filecfg, next_file, 0)
return PLUGIN_HANDLED
}
public checkfiles_opengl32()
{
new filename[32], len, md5buffer[34], flieopengl32[64], num
new pDir = open_dir("..\opengl32\", filename, 31)
if(pDir) {
do{
len = strlen(filename)
if(len > 4)
{
if(equal(filename[len-4], ".dll"))
{
num++
format(flieopengl32, 63, "..\opengl32\%s", filename)
precache_opengl32[num] = flieopengl32
md5_file(flieopengl32, md5buffer)
}
}
}
while(next_file(pDir, filename, 31))
close_dir(pDir)
}
g_num_opengl32 = num
}
public inconsistent_file(id, const filename[], reason[64])
{
if(equal(filename, "../opengl32.dll"))
{
test_opengl32[id] = 1
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public client_connect(id)
{
test_opengl32[id] = 0
if(task_exists(id+443)) remove_task(id+443)
}
public client_putinserver(id)
{
if(!is_user_bot(id) && !is_user_hltv(id))
{
set_task(10.0, "check_opengl32", id+443)
}
return PLUGIN_HANDLED
}
public client_disconnect(id)
{
test_opengl32[id] = 0
if(task_exists(id+443)) remove_task(id+443)
return PLUGIN_HANDLED
}
public check_opengl32(id)
{
id-=443
if(test_opengl32[id]==0)
{
new szName[32], szAuthid[32], szIP[16]
get_user_name(id, szName, charsmax(szName))
get_user_authid(id, szAuthid, charsmax(szAuthid))
get_user_ip(id, szIP, charsmax(szIP), 1)
server_cmd("amx_ban 0 %s ^"[CSF-AC] OpenGL32 Hack Detected^"", szAuthid)
client_print(0, print_chat, "[CSF-AC] OpenGL32 Hack Detected with %s.", szName)
log_to_file("csf_opengl32.log", "|%-30s|%-15s|%-22s|%s", szName, szIP, szAuthid, g_filenameprecached)
}
return PLUGIN_HANDLED
}
stock bool:file_copy(SOURCE[], TARGET[], error[], const ERRORLEN, const bool:REPLACE_TARGET = false) {
if (!file_exists(SOURCE)) {
format(error, ERRORLEN, "File copy error: Source ^"%s^" doesn't exist!", SOURCE)
return false
}
if (!REPLACE_TARGET && file_exists(TARGET)) {
format(error, ERRORLEN, "File copy error: Target ^"%s^" exists!", TARGET)
return false
}
new source = fopen(SOURCE, "rb")
if (!source) {
format(error, ERRORLEN, "File copy error: Opening source ^"%s^" failed!", SOURCE)
return false
}
new target = fopen(TARGET, "wb")
if (!target) {
format(error, ERRORLEN, "File copy error: Opening target ^"%s^" failed!", TARGET)
fclose(source)
return false
}
for (new buffer, eof = feof(source); !eof; !eof && fputc(target, buffer)) {
buffer = fgetc(source)
eof = feof(source)
}
fclose(source)
fclose(target)
return true
}