Перейти к содержанию

DragonForce

Стажёры
  • Постов

    11
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные DragonForce

  1. ИНИЦИАЛИЗАЦИЯ ЗАЩИТЫ

    Перед тем как выводить какое либо приветствие на экран, таск проверяет флаг NtGlobalFlag из структуры PEB:

    spacer.png

     

    mov eax, dword ptr fs:[30] - загружает в регистр EAX указатель на PEB структуру
    test byte ptr ds:[eax+68],70 - провряет флаг NtGlobalFlag по смещениею PEB+0x68 для 32-разрядной или PEB+0xBC дя 64-разрядной / Если флаг равен 0x70(FLG_HEAP_ENABLE_TAIL_CHECK (0x10)
         + FLG_HEAP_ENABLE_FREE_CHECK (0x20)
    	 + FLG_HEAP_VALIDATE_PARAMETERS (0x40)) - процесс создан из под отладчика.
    jne debug_detected

    Обойти это можно как изменением PEB структуры, так и просто пропатчить jne на NOP

     

    Далее идет следующий трюк, создается поток с проверкой где в цикле вызывается функция IsDebuggerPresent:

    spacer.png

     

    Обойти можно разными путями, начиная от проNOPить создание потока, изменить пролог функции с push на ret или просто изменить логику внутри патчем cmp или jne\je

     

    Далее идет последний трюк, который так же будет выполняться в отдельном потоке как и предыдущий:

    spacer.png

     

    Используются следующие функции:

    CreateToolhelp32Snapshot - Делает снимок процессов
    Process32Next - Получает информацию о следующем процессе
    Process32First - Получает информацию о первом процессе

     

    Я думаю многие уже догадались в чем заключается данный трюк, а если нет, вот подсказка:

    spacer.png

     

    В цикле, как и в предыдущем трюке, будут искаться процессы, которые указаны выше, при детекте которых таск будет закрываться.

     

    АЛГОРИТМ

    :lol:

    Разбирать алгоритм нет никакого смысла(и желания), ибо сгенерированный ключ по имени палится в регистре перед сравнением.

    spacer.png

    • Плюс 1
  2. 2 часа назад, Xipho сказал:

    Всегда проще обвинить кого-то, чем признать, что допустил оплошность в формулировке вопроса )))

    То-есть я должен был написать - "Дайте мне готовое решение как вызывать WINAPI функции в AutoAsm"?)

  3. 2 часа назад, Garik66 сказал:

    может поможет пример

    Спасибо Вам всем. Такой вопрос, Вы создали метку example и прописали туда через db слово - Text. Но сама память для этого слова выделяется где-то в рандомном месте или хранится в выделенной памяти newmem? Просто я не вижу чтобы персонально для метки example выделялось память через alloc.

  4.   

    56 минут назад, Xipho сказал:

    записать свой текст в память, и в EDI записать адрес твоего текста.

    Нужно по идее выделить память через alloc, прописать туда байты нужно текста, а потом написать "mov edi, NameAllocMemory", но я не совсем знаю как правильно написать это в Auto Assembler`e, подскажите пожалуйста.

  5. Доброго времени суток.

    Такой вопрос, как изменить текст который хранится в регистре EDI.

     

    К примеру: 

    push edi - edi:"TEST"

    call eax

    MessageBox выводит сообщение - "TEST".

     

    Как изменить текст который хранится в EDI перед вызовом call eax?

  6. 15 минут назад, Xipho сказал:

    Тебе следует разобраться с указателями в С++, и как хранятся константные строки в памяти, при использовании их с С++. Но вкратце - да, конструкцией

    lpBuffer = (LPVOID)"TEST1234"

    ты создаешь в памяти новый кусок, куда кладешь строку TEST1234, и затем адрес начала этого куска ты записываешь в lpBuffer. Только это локальный для функции lpBuffer, а не внешний. А далее в коде используешь оригинальный адрес

    Видимо для меня это пока не совсем понятно... Я думал достаточно в хук функции присвоить другое значение lpBuffer, а далее все что читает в оригинале этот буфер(после вызова ReadFile), будет получать уже новое значение lpBuffer`a(то, которое я присвоил в хуке)... Если у меня в собственной программе(в которой 30 строк кода-_-), которую я сделал для примера, не получается изменить lpBuffer, то о чем тогда еще речь...?

  7. 19 минут назад, Xipho сказал:

    Попробуй подменять буфер уже после того, как отработает оригинальная функция, а не наоборот. Ну и плюс ты в коде хука подменяешь адрес буфера, а в мейне читаешь из старого адреса, в котором, разумеется, пустота.

    Сделал как Вы подсказали, сперва вызвал TrueReadFile, а только потом указал lpBuffer = (LPVOID)"1234", но щас не работает, выводит все равно - "TEST".
    Из-за того что я в коде хука lpBuffer присваиваю другое значение(1234), я изменяю адрес самого lpBuffer?

  8. Спойлер
    void ReadFromFile(LPVOID Buff)
    {
    	HANDLE FileHandle;
    	DWORD R;
    	DWORD Size;
    	char Line[256]{};
    
    	FileHandle = CreateFileA("C:\\123.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	Size = GetFileSize(FileHandle, &Size);
    	if (Size > 255) Size = 255;
    	ReadFile(FileHandle, Buff, Size, &R, NULL);
    	*(Line + R) = 0;
    	CloseHandle(FileHandle);
    }
    
    void main()
    {
    	getchar();
    
    	LPVOID Line[256]{};
    	ReadFromFile(Line);
    	std::cout << (LPCSTR)Line << std::endl;
    }

    Для теста был написан код выше. Выводит в консоль текст - "TEST" из текстового документа 123.txt.
    Пытаюсь поставить хук на ReadFile, чтобы подменять считанный результат, допустим вместо "TEST" чтобы выводило "TEST1234".

    Спойлер
    BOOL(WINAPI * TrueReadFile)(
    	HANDLE       hFile,
    	LPVOID       lpBuffer,
    	DWORD        nNumberOfBytesToRead,
    	LPDWORD      lpNumberOfBytesRead,
    	LPOVERLAPPED lpOverlapped) 			= ReadFile;
    
    __declspec(dllexport) BOOL WINAPI MyReadFile(
    	HANDLE       hFile,
    	LPVOID       lpBuffer,
    	DWORD        nNumberOfBytesToRead,
    	LPDWORD      lpNumberOfBytesRead,
    	LPOVERLAPPED lpOverlapped)
    {
    	lpBuffer = (LPVOID)"TEST1234";
      
    	return TrueReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
    }

     

    Но в итоге просто пустое поле появляется и все, может ли кто-нибудь помочь?

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.