Не могу найти

Статус
В этой теме нельзя размещать новые ответы.

k1sher

Известный
Автор темы
201
4
Посмотрите пожалуйста. Что нужно убрать что бы не удалялся оригинальный файл chatlog.txt?

Код:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include <ctime>
#include "SAMPFUNCS_API.h"

// Enhanced Chatlog plugin for SAMPFUNCS 5.2
// by NarutoUA for BlastHack.net

#define SAMPAddr SF->getSAMP()->getSAMPAddr()
SAMPFUNCS *SF = new SAMPFUNCS();
using namespace std;
struct stDate{
    char mon_s[3], day_s[3], year_s[3], hour_s[3], min_s[3];
};
stDate myDate;

DWORD file; // we save file pointer here
char msg[256];

DWORD offsetA;
DWORD ret_fclose;

void hook_sprintf(){
    _asm pushad
    DWORD offset1, offset2;
    offset1 = offset2 = SF->getSAMP()->getSAMPAddr();
    offset1 += 0x219F88;
    offset2 += 0x219E80;
    char chatlog_path[260];
   
    sprintf(chatlog_path, "%s\\chatlog", (char*)offset1);
   
    // Check is directory exist
bool result = ((bool(__cdecl *)(int)) (SF->getSAMP()->getSAMPAddr() + 0xAF480))(((int)&chatlog_path));
    if (!result)
        CreateDirectoryA(chatlog_path, 0);
    sprintf((char*)offset2, "%s\\chatlog\\[%s.%s.%s]chatlog.txt", (char*)offset1, myDate.day_s, myDate.mon_s, myDate.year_s);

    _asm popad

}



__declspec(naked) void hook_fclose(){
   
    // Save file pointer
    __asm mov file,eax
    // Restore original
    __asm push eax
    __asm mov[esi + 0x0D], 0x00000001
    __asm jmp[ret_fclose]

}


void CALLBACK mainloop(void)
{
    static bool patched = false;
    if (!patched){
        if (!SAMPAddr) return;

        //
        // STUFF
        //

        // Get time + date
        time_t t = time(0);
        struct tm * now = localtime(&t);
        int year;
        // Date
        now->tm_year += 1900;
        now->tm_year %= 100;
        (now->tm_year < 10) ? (sprintf(myDate.year_s, "0%d", now->tm_year)) : (sprintf(myDate.year_s, "%d", now->tm_year));
        now->tm_mon++;
        (now->tm_mon < 10) ? (sprintf(myDate.mon_s, "0%d", now->tm_mon)) : (sprintf(myDate.mon_s, "%d", now->tm_mon));
        (now->tm_mday < 10) ? (sprintf(myDate.day_s, "0%d", now->tm_mday)) : (sprintf(myDate.day_s, "%d", now->tm_mday));
        // Time
        sprintf(myDate.hour_s, "%d", now->tm_hour);
        (now->tm_min < 10) ? (sprintf(myDate.min_s, "0%d", now->tm_min)) : (sprintf(myDate.min_s, "%d", now->tm_min));


        // calculate offset for "a" atribute
        offsetA = SAMPAddr + 0xD3E34;
        char offA[6];
        char tmp;
        for (int i = 4; i >= 0; i--){
            offA[i] = offsetA % 0x100;
            offsetA /= 0x100;
        }
        tmp = offA[1];
        offA[1] = offA[4];
        offA[4] = tmp;
        tmp = offA[2];
        offA[2] = offA[3];
        offA[3] = tmp;
        offA[0] = 0x68;

        //
        // PATCHES
        //

        DWORD protect;
        // Patch "w" atribute to "a"
        VirtualProtect((void*)(SAMPAddr + 0x6485B), 5, PAGE_EXECUTE_READWRITE, &protect);
        memcpy((void *)(SAMPAddr + 0x6485B), (uint8_t *)offA, 5);
        VirtualProtect((void*)(SAMPAddr + 0x6485B), 5, protect, &protect);

        // NOP fclose function
        VirtualProtect((void*)(SAMPAddr + 0x64876), 5, PAGE_EXECUTE_READWRITE, &protect);
        memcpy((void *)(SAMPAddr + 0x64876), "\x90\x90\x90\x90\x90", 5);
        VirtualProtect((void*)(SAMPAddr + 0x64876), 5, protect, &protect);
       
        //
        // HOOKS
        //
       
        // "Copy file pointer" hook
        ret_fclose = 0x6486E + 8 + SAMPAddr;
        SF->getGame()->createHook((void*)(SF->getSAMP()->getSAMPAddr() + 0x6486E), hook_fclose, DETOUR_TYPE_JMP, 8);
        // "Folder" hook
        SF->getGame()->createHook((void*)(SF->getSAMP()->getSAMPAddr() + 0x2FCC72), hook_sprintf, DETOUR_TYPE_CALL_FUNC, 5);
       
       
    }
    static bool bfile = false;
    if (!bfile){
        if (!file)return;
        // Write to file current Date and Time
        sprintf(msg, "\n\n\n\t// Date: %s.%s.%s\n\t// Time: %s:%s\n\n\n\n", myDate.day_s, myDate.mon_s, myDate.year_s, myDate.hour_s, myDate.min_s);
        ((int(__cdecl *)(int, int)) (SF->getSAMP()->getSAMPAddr() + 0xB79BC))(file, (int)msg); // fprintf
        ((signed int(__cdecl *)(int)) (SF->getSAMP()->getSAMPAddr() + 0xB67E6))(file); // fclose
        bfile = true;
       
    }
   
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
 

Losyash1337

Новичок
16
16
Ну по коду я так понял, что ты просто подмениваешь по адресу строку с путем к файлу chatlog.txt на свой файл с указанием даты. Оригинальный chatlog.txt как таковой у тебя не удаляется, но SAMP использует именно твой файл (а т.к. его используешь уже ты, то доступ к файлу САМПик не получает). Если требуется ввести свои log'и, то просто используй запись в файл:

C++:
// К инклудам
#include <cstdio>

// Использование
FILE* fp = std::fopen(path_to_file, "w"); // режим записи
std::fprintf(fp, "bla bla %d bla bla %f", 10, 20.0) // аналогично функции printf, только с указанием потока
std::fclose(fp) // для закрытия

Могу ошибаться, код писал не я, так же вижу, что его писали не совсем грамотно, но если тебе срать, то писать о найденных ошибках не буду.
 

Losyash1337

Новичок
16
16
Кстати смысл 74-75 строк мне непонятен :)
C++:
now->tm_year += 1900; // прибавляем 1900, последние две цифры не меняются ни как
now->tm_year %= 100; // Получить последние две цифры, WTF?
На 76-82 строках вообще вижу, какой-то код индуса, можно было сделать проще:
C++:
 // Дата
sprintf(myDate.year_s, "%02d", now->tm_year); // прочитай где нибудь в интернете, про параметры printf
sprintf(myDate.mon_s, "%02d", ++now->tm_mon); // префиксный инкремент, аналогично now->tm_mon += 1, возвращает увеличенное значение
sprintf(myDate.day_s, "%02d", now->tm_mday);
// Время
sprintf(myDate.hour_s, "%d", now->tm_hour);
sprintf(myDate.min_s, "%02d", now->tm_min);
89-92 строка - ну, как по мне было бы логичнее сделать так:
C++:
// логичное линейное решение, цикл тут излишний
offA[4] = (offsetA >> 0x18); // думаю тут уместнее смещение, чем деление
offA[3] = (offsetA >> 0x10); // модуль по 0x100, нахуй не нужен
offA[2] = (offsetA >> 0x08); // потому что BYTE больше 0x100 быть не может
offA[1] = (offsetA >> 0x00);
93-95 строки - юзай std::swap:
C++:
std::swap(offA[1], offA[4]);
96-98 - аналогично 93-95.

P.S.: Остальное все то, что самповское мне до конца непонятно, но если изложишь задачу, которую решал, могу скинуть более "читабельный" (но это сугубо мое личное мнение) код с комментами на основе твоего (кароч перепишу покрасивше).
P.P.S.: Ой бля, не читал коменты
 
Последнее редактирование:
  • Нравится
Реакции: Rorian
Статус
В этой теме нельзя размещать новые ответы.