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

darthmaul

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

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

  • Посещение

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

  1. 1 час назад, Xipho сказал:

    Во-первых, надо мемсетом занулить выделенные буферы (массивы)

    Во-вторых, если ты используешь юникод, то нужно и длину строки получать юникодовой функцией или же результат strlen(cstr) умножать на 2.

    Спасибо тебе админушка! Проблема действительно была в подсчете строки, заменил на wcslen(wstr) и все работает корректно)

  2. Вывожу ники игроков, на латинце без проблем, а если крилица то тоже выводит то на конце иероглифы почему то.

    Спойлер
    
    void draw::Text(int x, int y, int align, unsigned color, const char* text, ...)
    {
    	wchar_t wstr[128];
    	char	cstr[256];
    
    	va_list	va_alist;
    	va_start(va_alist, text);
    	vsprintf(cstr, text, va_alist);
    	va_end(va_alist);
    	
    	MultiByteToWideChar(CP_UTF8, 0, cstr, -1, wstr, 128);
    
    	if (align)
    	{
    		int w, h;
    		surface->GetTextSize(g_iFont, wstr, w, h);
    
    		if (align == 1 && w > 0)
    			w /= 2;
    
    		x -= w;
    	}
    
    	surface->DrawSetTextColor(RGBA(color));
    	surface->DrawSetTextPos(x, y);
    	surface->DrawSetTextFont(g_iFont);
    	surface->DrawPrintText(wstr, strlen(cstr));
    }

     

     

  3. Всем доброго времени суток. Помогите решить такую задачку:

     

    Меняю модельку оружия через проп m_nModelIndex, получаю мерцание модельки, в основном показывает новую модельку а на доли секунд показывается стандартная моделька. Мерцание исчезает при cl_predict 0, но при этом значении играть не возможно.

  4. 2 минуты назад, partoftheworlD сказал:

     

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

    это понятно. но как адреса этих байтов найти?

  5. вот что нарыл в sdk

     

    Скрытый текст
    
    #define	MAX_ALIAS_NAME	32
    
    typedef struct cmdalias_s
    {
    	struct cmdalias_s	*next;
    	char				name[ MAX_ALIAS_NAME ];
    	char				*value;
    } cmdalias_t;
    
    static cmdalias_t	*cmd_alias = NULL;
    
    /*
    ===============
    Cmd_Alias_f
    
    Creates a new command that executes a command string (possibly ; seperated)
    ===============
    */
    void Cmd_Alias_f (void)
    {
    	cmdalias_t	*a;
    	char		cmd[1024];
    	int			i, c;
    	char		*s;
    
    	if (Cmd_Argc() == 1)
    	{
    		Con_Printf ("Current alias commands:\n");
    		for (a = cmd_alias ; a ; a=a->next)
    			Con_Printf ("%s : %s\n", a->name, a->value);
    		return;
    	}
    
    	s = Cmd_Argv(1);
    	if (strlen(s) >= MAX_ALIAS_NAME)
    	{
    		Con_Printf ("Alias name is too long\n");
    		return;
    	}
    
    // copy the rest of the command line
    	cmd[0] = 0;		// start out with a null string
    	c = Cmd_Argc();
    	for (i=2 ; i< c ; i++)
    	{
    		strcat (cmd, Cmd_Argv(i));
    		if (i != c)
    			strcat (cmd, " ");
    	}
    	strcat (cmd, "\n");
    
    	// if the alias allready exists, reuse it
    	for (a = cmd_alias ; a ; a=a->next)
    	{
    		if (!strcmp(s, a->name))
    		{
    			if ( !strcmp( a->value, cmd ) )		// Re-alias the same thing
    				return;
    
    			delete[] a->value;
    			break;
    		}
    	}
    
    	if (!a)
    	{
    		a = (cmdalias_t *)new cmdalias_t;
    		a->next = cmd_alias;
    		cmd_alias = a;
    	}
    	strcpy (a->name, s);	
    
    	a->value = CopyString (cmd);
    }
    
    static ConCommand alias("alias",Cmd_Alias_f);

     

     

    Через CE нашел сначала строку "Current alias commands:", поставил брейк поинт на чтение, при выполнении комнады alias вышло две функции: https://www.dropbox.com/s/960r1oe5j4yez2e/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202017-01-30%2014.50.23.png?dl=0

    Но что то думаю что копаю не в ту сторону. По коду есть ConCommand alias("alias",Cmd_Alias_f); т.е. регистрация команды alias. по идее эту строку и нужно занопить, но вот как словить это событие если регистрация команды происходит сразу после старта игры.

     

  6. Разобрался, тему можно закрывать.

     

    Хук:

    http://www.unknowncheats.me/forum/d3d-tutorials-and-source/58599-vtable-d3d9-base.html

     

    Код для скриншота:

    Скрытый текст
    
    HRESULT DXI_Capture(IDirect3DDevice9* Device, const char* FilePath)
    {
        IDirect3DSurface9* RenderTarget = nullptr;
        HRESULT result = Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &RenderTarget);
        result = D3DXSaveSurfaceToFile(FilePath, D3DXIFF_JPG, RenderTarget, nullptr, nullptr);
        //SafeRelease(RenderTarget);
        return result;
    }

     

     

  7. 55 минут назад, gmz сказал:

    http://flatassembler.net/examples/screenshot.zip

    годится как теоретический пример... наверно снятие скрина с д3д не особо отличается

    при полноэкранном режиме выдает черный снимок(

     

    вот в программе фрапс при запуске происходит инжект к игре fraps32.dll

  8. Вопрос в заголовке. Есть какие нибудь идеи реализации? Сам очень много гуглил, но так ничего рабочего не нашел. Теоретически понимаю, что без инжекта не обойтись, но как реализовать загадка.

  9. Найти это не сложно, сигнатуру сам думаю сделаешь. В общем полазив немного по коду.

     

    .text:000B3ED0                             ExecuteCmd proc near       ; DATA XREF: .rdata:003067E4o.text:000B3ED0                                      push    ebp.text:000B3ED1                                      mov     ebp, esp.text:000B3ED3                                      push    dword ptr [ebp+8].text:000B3ED6                                      call    Cbuf_AddText    ; STR: "Cbuf_AddText: buffer overflow".text:000B3EDB                                      add     esp, 4.text:000B3EDE                                      call    Cbuf_Execute    .text:000B3EE3                                      pop     ebp.text:000B3EE4                                 retn    4.text:000B3EE4                             ExecuteCmd endp

    Я искал с помощью engine.dylib как в первом посте описывал, ExecuteCmd это 106 индекс в виртуальной таблице CEngineClient. Если будешь искать не по виртуальной таблице, то для начала надо найти строку "Cbuf_AddText: buffer overflow" эта строка находится в функции "Сbuf_Addtext", дальше смотришь откуда вызывается она, переходишь по этим ссылкам и ищешь примерно похожий код. Если будет время, возможно вечером запишу как это работает :-D

    а у меня в папке с игрой только client.dylib и server.dylib

  10. На гитхабе нашел проект, называется sourcecmd, который выполняет консольные команды в играх типа CS:GO, CS:S и т.д. Но для работы как я понял нужно обновить сигнатуру. Так вот как через cheatengine найти сигнатуру на выполнение консольных команд?

     

    				if ( ::ReadProcessMemory( mhProcess, hmEngine, dump, size, NULL ) )				{					// Do a sigscan for CEngineClient::ExecuteClientCmd					// (old) Pattern: 8B 44 24 04 50 E8 ? ? ? ? 68 ? ? ? ? E8 ? ? ? ? 83 C4 08 E8 ? ? ? ? C2 04 00					// (old) Pattern: 55 8B EC 8B 45 08 50 E8 ? ? ? ? 68 ? ? ? ? E8 ? ? ? ? 83 C4 08 5D C2 04 00					// Pattern: 55 8B EC 8B 45 08 50 E8 ? ? ? ? 83 C4 04 5D C2 04 00					if ( void* p = FindPattern( dump, size,						"\x55\x8B\xEC\x8B\x45\x08\x50\xE8\x00\x00\x00\x00\x83\xC4\x04\x5D\xC2\x04\x00",						"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF" ) )
×
×
  • Создать...

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

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