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

MasterGH

Ветераны
  • Постов

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

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

    129

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

  1. По прежнему пока нет времени. Пока нашёл самый простой исходник по инициализации устройства.


    // Файл: CreateDevice.cpp
    //
    // Описание: Это первый туториал по использованию Direct3D. В этом туториале всё что
    // мы делаем - это создаём Direct3D устройство и используем его для очистки
    // окна.
    //
    // Copyright (c) Micro$oft Corporation. All rights reserved.
    //-----------------------------------------------------------------------------
    #include <d3d9.h>




    //-----------------------------------------------------------------------------
    // Глобальные переменные
    //-----------------------------------------------------------------------------
    LPDIRECT3D9 g_pD3D = NULL; // Используется для создания D3D устройства
    LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Наше устройство рендеринга




    //-----------------------------------------------------------------------------
    // Имя: InitD3D()
    // Описание: Инициализация Direct3D
    //-----------------------------------------------------------------------------
    HRESULT InitD3D( HWND hWnd )
    {
    // Создаём D3D объект, который необходим для создания D3D устройства.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
    return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp, &g_pd3dDevice ) ) )
    {
    return E_FAIL;
    }

    // Если устройство создано - возвращаем S_OK

    return S_OK;
    }




    //-----------------------------------------------------------------------------
    // Имя: Cleanup()
    // Описание: Освобождаем все ранее инициализируемые объекты
    //-----------------------------------------------------------------------------
    VOID Cleanup()
    {
    if( g_pd3dDevice != NULL)
    g_pd3dDevice->Release();

    if( g_pD3D != NULL)
    g_pD3D->Release();
    }




    //-----------------------------------------------------------------------------
    // Имя: Render()
    // Описание: Рисование сцены
    //-----------------------------------------------------------------------------
    VOID Render()
    {
    if( NULL == g_pd3dDevice )
    return;

    // Очистка backbuffer'а в голубой цвет
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    // начало сцены
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
    // Рендеринг объектов сцены должен находиться здесь

    // Конец сцены
    g_pd3dDevice->EndScene();
    }

    // Выводим содержимое backbuffer'a на экран
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }




    //-----------------------------------------------------------------------------
    // Имя: MsgProc()
    // Описание: Обработка сообщений
    //-----------------------------------------------------------------------------
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    switch( msg )
    {
    case WM_DESTROY:
    Cleanup();
    PostQuitMessage( 0 );
    return 0;

    case WM_PAINT:
    Render();
    ValidateRect( hWnd, NULL );
    return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
    }




    //-----------------------------------------------------------------------------
    // Имя: WinMain()
    // Описание: Точка входа приложения
    //-----------------------------------------------------------------------------
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    {
    // Регистрируем класс окна
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
    GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
    "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Создание окна программы
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
    WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
    GetDesktopWindow(), NULL, wc.hInstance, NULL );

    // Инициализация Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
    // Показываем окно
    ShowWindow( hWnd, SW_SHOWDEFAULT );
    UpdateWindow( hWnd );

    // Ввод петли сообщений
    MSG msg;
    while( GetMessage( &msg, NULL, 0, 0 ) )
    {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
    }

    //-----------------------------------------------------------------------------

    Статья "Hooking a DirectX/COM Interface" позволит мне позже вспомнить детали и сравнить со статьё про хукинг в OllyDbg.

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

  2. Спасибо. Очень было интересно посмотреть на эту схему. В ней даже есть текст кода для обработчиков игровых событий. Молодцы, разработчики, у них было меньше временных затрат с перекомпиляцией. Я там увидел по 822 строчке к примеру:


    <Bitmap Name="bmpInventory_HeroHealthTorseInactive">
    <Position x="730" y="66"/>
    <Size x="82" y="138"/>
    <Material MaterialID="_control_2">
    <Position x="329" y="1690"/>
    <Size x="82" y="138"/>
    </Material>
    </Bitmap>
    <Bitmap Name="bmpInventory_HeroHealthTorseActive" Visible="false">
    <Position x="730" y="66"/>
    <Size x="82" y="138"/>
    <Material MaterialID="_control_2">
    <Position x="565" y="1690"/>
    <Size x="82" y="138"/>
    </Material>
    </Bitmap>
    <Bitmap Name="bmpInventory_HeroHealthTorseMask" Opacity="0.5">
    <Position x="730" y="66"/>
    <Size x="82" y="138"/>
    <Material MaterialID="_control_2">
    <Position x="81" y="1687"/>
    <Size x="82" y="138"/>
    </Material>
    </Bitmap>
    <Custom Name="customInventory_HeroHealthTorseBox">
    <Position x="735" y="74"/>
    <Size x="72" y="125"/>
    <OnMouseIn>
    SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseInactive@Visible",false);
    SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseActive@Visible",true);
    SetStaticProperty("lblInventory_HeroInventoryMoneyValue","@Text",tostring(Game.GetHeroHealth("Torse")));
    </OnMouseIn>
    <OnMouseOut>
    SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseInactive@Visible",true);
    SetStaticProperty(curWidget,"../bmpInventory_HeroHealthTorseActive@Visible",false);

    </OnMouseOut>
    <OnDragAndDrop>
    do
    local ptrDragged = GetDraggedWidget();

    if GetStaticProperty(ptrDragged,"@Name") == "icontblInventory_HeroInventoryTable" then
    local nPID = GetDynamicProperty(ptrDragged,"PID");
    local nRealIndex = IconTable.GetIconDataAsNumber(ptrDragged,GetStaticProperty(ptrDragged,"@CurIcon"));
    Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));
    end
    end
    </OnDragAndDrop>
    </Custom>

    						<!-- Torse -->

    Меня заинтересовал:


    do
    local ptrDragged = GetDraggedWidget();

    if GetStaticProperty(ptrDragged,"@Name") == "icontblInventory_HeroInventoryTable" then
    local nPID = GetDynamicProperty(ptrDragged,"PID");
    local nRealIndex = IconTable.GetIconDataAsNumber(ptrDragged,GetStaticProperty(ptrDragged,"@CurIcon"));
    Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));
    end
    end
    </OnDragAndDrop>
    							<OnDragAndDrop>

    Это код обработчика перетаскивания на виджет торса.

    Функция пытается "добавить здоровья торсу" от свойства элемента который перетаскивается на "торс" :

    Game.AddHeroHealth("Torse",Control.GetInventoryItemInfo(nPID,nRealIndex,"s"));

    По всей "схеме" можно поколдовать ) Но лучший вариант всё же не в редактировании этого файла. Будет время я что-нибудь сделаю и отпишусь.

  3. Вы даже не представляете как далеко пошёл Дарк Байт. Он "прикручивает" настоящую IDE к Cheat Egine по существующим компонентам. А это предвестник того, что трейнеры начнут штамповать LUA скриптами. Которые будут сверхмалых размеров по сравнению с автономными трейнерами написанными даже на ассемблере.

    post-3-1297514425,98_thumb.png

    Но радоваться ещё рано, т.к. это дело на 100% не работает пока. Например, Control_SetCaption и Control_GetCaption пока не работают. Но обработчики события работают в связке с IDE, но не генерируются автоматически в LUA-консоле. Так же можно было видеть что добавлена подсветка. Как бы там не было, грядут большие перемены в создании трейнеров - сверх малых размеров.

  4. Если два или более бряков срабатывают один за другим, то можно быстро найти «развилку»

    post-3-1297502664,76_thumb.gif

    Сначала ставим оба бряка и делаем так чтобы один из них сработал.

    Затем пускаем трейс по ретам в OllyDbg (ctrl+F12)

    Вновь прервыемся и отпускаем игру по F9.

    В итоге мы останавливаемся в месте развилки.

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

  5. Для кому интересно как использовать поток в скриптах CE

    alloc(mycode,4096) 
    CREATETHREAD(mycode);

    mycode:
    mov eax,[gamex.dll+123456]
    mov ebx,[eax+4c]
    mov [eax+48],ebx

    push #1000
    call sleep
    jmp mycode

    В данном случае здесь заморозка с частотой в 1-ну секунду.

    А вот мой пример скрипта для GTA SAN Andreas. Скрипт заполняет данные структуры игрока один раз

    //mov [[00B6F3B8]+n*1c+5a8]],1
    //mov [[00B6F3B8]+n*1c+5ac]],1
    //где n =[1..12]

    [ENABLE]
    alloc(tred,200)
    registersymbol(tred)
    label(x1)

    tred:
    push eax
    push ecx
    push ebx
    xor ecx,ecx
    mov eax,[00B6F3B8]
    add eax,5a8
    x1:
    inc ecx
    imul ebx,ecx,1c
    mov [eax+ebx],1// mov [[00B6F3B8]+n*1c+5a8]],1 - в обойме
    mov [eax+ebx+4],1// mov [[00B6F3B8]+n*1c+5ac]],1 - общие патроны
    cmp ecx,c
    jne x1
    pop ebx
    pop ecx
    pop eax
    call GetCurrentThread
    ret

    createthread(tred)
    [DISABLE]
    dealloc(tred)

    Инструкцию call GetCurrentThread я ипользовал для корректного получения указателя на поток (хотя думаю можно было бы сделать иначе, но пока я не исследовал это дело). GetCurrentThread кладёт в eax указатель на данный поток и ret поток закрывает.

  6. Поиск инструкций по шаблону

    Чего-то я не обращал внимание на полезную возможность искать ассемблерные инструкции.

    В отладчике найдите нужное меню.

    А вот пример ввода.

    post-3-1297502422,4_thumb.gif

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

  7. А я тем временем написал lua-скрипт, отображающий цифровое значение здоровья частей тела при наведении на них (в инвентаре ноги-руки можно выделять и их здоровье отобразится снизу вместо денег) Почему в графе денег? Потому что графа здоровья выводит только целые, а в деньгах тип float отображается корректно. Если кому будет интересно, могу поделиться lua-скриптом, хотя толку от него немного...

    Поделись :)

  8. (если число заморозить, то перезайдя в инвентарь увидим, что и там число изменилось, но без заморозки тут же восстанавливаеся в первоначальное значение

    Тут надо ставить бряк на запись и следить каким образом идёт запись восстановленного значения.

  9. У меня идеи по структуризации тем и разделов по Cheat Engine модернизациям. Но сначала необходимо разобраться с тем как компилить Cheat Engine. Пока мне не удалось в этом разобраться если кто сможет, то пишите.

    Для начала следующая информация.

    Для компиляции текущего CE требуется Lazarus IDE версии не ниже v0.9.29, рекомендуется v0.9.31. Также требуется последний компилятор Free Pascal. Я предполагаю, что Dark Byte (DB) постоянно следит за последними обновлениями исходники этих инструментов. Компилирует их и затем компилирует ими Cheat Engine. Если он это делает не часто, то по крайне мере может сделать в любой момент и тогда новые исходники CE 6.xx мы уже не скомпилим и будем искать решение вместо того чтобы найти его сейчас. Это означает, что нам.

    1. Этап

    1) Скачиваем и пользуемся TortoiseSVN создав папку SVN в ней будет другие SVN-папки:

    2) Закачиваем с помощью TortoiseSVN SVN-cheatEngine по ссылке http://ce.colddot.nl/svn

    3) Закачиваем SVN-freePascalCompiler по ссылке http://svn.freepascal.org/svn/fpc/

    4) Закачиваем SVN-IDELazarus по ссылке http://svn.freepascal.org/svn/lazarus

    Таким образом всегда можно получать новые исходники. Я не знаю, возможно вы не захотите скачивать некоторые папки, но это уже Ваше решение.

    2. Этап.

    Потребуется компилировать все инструменты.

    Пока у меня получилось скомпилировать freepascal. Позже я напишу как это сделал. Но у меня не получилось собрать Lazarus. После его компиляции, настроек необходимых путей можно будет компилировать Cheat Engine 6.0... Также есть здесь обсуждение.

    А вообще мне не очень нравится этот гемморой на самом деле, но что делать - придётся.

  10. Я с тобой согласен. Я написал эту тему, т.к. мне было самому интересно и на этих инструментах была написана CE 6.0. Соответственно модификации делать можно этими инструментами. Кстати автономные трейнеры прикрученные к CE6.0 будут весит около 15 мб - писал Дарк байт. Но если "обрезать" выше описанными способами, то думаю чуть больше 2 метров. В CE 5.6 версиях трейнер весил ~800 кб с картинкой. ИМХО разница большая. Но LUA-скрипты в таблицах CE - это сверх компактный трейнер, который будет работать если установлена CE.

    ...Также стоит учитывать, что эти инструменты гибче Дельфи, они свободные и их можно продавать и другие могут продавать, то что продают первые - такая вот лицензия.

  11. Скачайте последний кряк с плейграунда иначе запаритесь с защитой. Как админ вынужден напомнить, что вся ответсвенность за его использование лежит за вами.

    У меня один раз игра подвисла, после того как я сделал иньекцию CE. Но игра была в оконном режиме и я с помощью клавиатуры убил процесс CE 6,0- всё закрылось - не пришлось перезагружаться. Возможно, это заморочки CE 6.0 и следует покапаться в её настройках. В следующий раз я сделал иньецию на дельнги снова и затем тут же выключил и больше у меня ничего не зависало.

    Сигнатуру кода не привожу, т.к. некогда было её делать. Инструкция "game.dll"+F251: срабатывает, когда пользователь лезет в инвентарь и в этот момент у него становиться 9999999 песо. Но они отнимаются, когда пользователь что-то покупает.

    [ENABLE]
    alloc(newmem,2048)
    label(returnhere)
    label(originalcode)
    label(exit)

    newmem:
    mov [eax+00000CC4],#9999999
    originalcode:
    mov eax,[eax+00000CC4]

    exit:
    jmp returnhere

    "game.dll"+F251:
    jmp newmem
    nop
    returnhere:


    [DISABLE]
    dealloc(newmem)
    "game.dll"+F251:
    mov eax,[eax+00000CC4]
    //Alt: db 8B 80 C4 0C 00 00

    Перейдём к читу здоровья.

    В вашем Xenuse

    Есть два адреса здоровья:

    Один статический, а другой динамический.

    Если на динамический постравить бряк, то прервёмся здесь (у вас может быть другая dll-ка)

     game.dll+79BF3 - F3 0F11 99 98100000  - movss [ecx+00001098],xmm3
    game.dll+79BFB - 33 C0 - xor eax,eax
    game.dll+79BFD - 8D 91 7C0C0000 - lea edx,[ecx+00000C7C]
    game.dll+79C03 - 56 - push esi
    game.dll+79C04 - 0FB6 F0 - movzx esi,al
    game.dll+79C07 - 83 FE 05 - cmp esi,05
    game.dll+79C0A - 77 11 - ja game.dll+79C1D

    Здесь нужно посмотреть по ecx начало структуры.

    В сканере памяти ввести поиск адресов от ecx, до где-то ecx + 0x1098+0x2000 = ecx + 0x3098;

    Вам нужно закупиться всякими шприцам взломав деньги. И наблюдать например за ногами. Сложность поставьте лёгкую чтобы боты стреляли по ногам чаще.

    Ну так вот поставьте поиск в MHS значения float. Всегда делайте первый отсев: уменьшилось, увеличилось, не изменилось(если уверены) и + дополнительный отсев по промежутку от 0,0 до 1,0.

    Возможно, можно так найти адрес (у меня к сожалению оврал со временем и в выходные тоже не будет)

    --------

    Ещё один способ поставить условнй бряк в CE на (см. выше)

    game.dll+79BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3

    Процесс игры должен остановиться.

    Зделайте трейс на 5000 или более инструкций (если что-то подвиснет, то минут через 10 отвиснет, не вздумайте это делать в полноэкранном режиме)

    Посмотрите вверх по коду как значение попадает в xmm3. Изучите инструкции SIMD.

    1) Можете следить есть ли выше по коду этот xmm3 (я к сожалению его не увидел на три уровня вверх). Если нет заглядывайте в выше стоящие call-ы ставя условные бряки (если не знаете как делать то не делайте этого) - я это не успел сделать.

    2) Я точно не помню, по моему есть инструкция которая крутит регистры XMM как барабан вверх или вниз смещая их.Значит от инструкции

    game.dll+79BF3 - F3 0F11 99 98100000 - movss [ecx+00001098],xmm3

    нужно искать либые инструкции которые поместили значение в xmm3. Обращайте внимание на циклы. Потому что в xmm3 - это явно результат цикла.

    3) Соледующие действия тоже могут помочь.

    Сделайте так чтобы game.dll (она запротокчена старфорсом) распаковалась в памяти игры (просто запустите её). Сохраните её дамп и проанализируйте IDA + hexarrays. Испольузуйте Petools

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

    Пока всё.

  12. Я могу предположить с точностью до 90% как я там схема, хотя я не видел этой игры даже на скриншотах, кроме того который ты привёл.

    Скорее всего, общее здоровье солдата состоит из суммы значений. Левая и правая нога и рука, тело, голова.. Также защита на голове - шлем, броня на теле. Если действительно там такая "схема здоровья", то я бы постарался отсеивать значения 4 байта с точкой когда меняется состояние от нормального к плохому и наоборот определённой части тела например туловища. Я бы взял бы побольше аптечек и попадал бы изредка под обстрел. Это самый простой вариант выйти на адреса здоровья. Они могут находится скорее всего рядом друг с другом, а могут и на каком-то расстоянии... В прошлой какой-то игре я нашёл адрес полоски здоровья и вышел по коду вверх на цикл где складывалось состояние каждой части тела и обмундирования. Так что вот так вот.

  13. Создание формы на WinAPI:

    post-3-1297348070,13_thumb.png

    Lazarus IDE - v0.9.28.2 Beta

    Free Pascal - v2.2.4


    {$APPTYPE GUI}
    Program Api;
    {$MODE DELPHI}
    uses
    windows, messages;
    var
    window:TWndClassEx;
    Mwindow: HWND;
    Mmsg: MSG;

    function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
    begin
    case msg of
    WM_Destroy:
    begin
    PostQuitMessage (0);
    Result := 0;
    Exit;
    end;
    else
    Result := DefWindowProc(wnd,msg,wparam,lparam);
    end;
    end;

    begin
    window.cbSize := sizeof (window);
    window.style := CS_HREDRAW or CS_VREDRAW;
    window.lpfnWndProc := @WindowProc;
    window.cbClsExtra := 0;
    window.cbWndExtra := 0;
    window.hInstance := HInstance;
    window.hIcon := LoadIcon (0,IDI_APPLICATION);
    window.hCursor := LoadCursor (0,IDC_ARROW);
    window.hbrBackground:=Color_BtnFace+12;
    window.lpszMenuName := nil;
    window.lpszClassName := 'Main_Window';
    RegisterClassEx (window);
    Mwindow := CreateWindowEx(0,'Main_Window','First_WinAPI_Programm', WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);
    SHOWWINDOW (Mwindow,SW_Show);
    while GetMessage (Mmsg,0,0,0) do
    begin
    TranslateMessage (Mmsg);
    DispatchMessage (Mmsg);
    end;
    end.

    Этапы работы "напильником":

    1) 63 КБ не в сжатом виде (23 КБ - упакован в архив .rar)

    2) Удалив отладочную инфорамцию батником:

    cd lazarus
    D:\SOFT\lazarus\fpc\2.2.4\bin\i386-win32\strip.exe --strip-all project1.exe

    Получаю 38 КБ(17 КБ - упакован в архив .rar)

    3) Открываем "Проект -- Параметры компилятора -- Код"

    Ставим галку напротив "Умное связывание (-CX)"

    Переходим на вкладку "Связывание" и убираем галку напротив "Выдать номера строк в ошибках времени исполнения (-gl)"

    Тут же ставим галку напротив "Вырезать символы из бинарника (-Xs)" - эту же самую функцию выполняет утилита strip.

    Тут же савим галку на "Умное связывание (-XX)"

    Жмем "Ок" и компилируем проект по новой.

    Получаю 28 кб (13 КБ - упакован в архив .rar)

    Выполнял по статье

    ------

    Но последние обновления (я их ещё не установил):

    2009-10-25 lazarus-0.9.28.2-fpc-2.2.4-win32.exe (64.6 MB)

    13.11.2010 Вышел релиз Free Pascal v2.4.2

    Я думаю, даже если бы я установил обновления, то размер бы вряд ли бы уменьшился.

    Пока вывод:

    Получаю 28 кб (12 КБ - упакован в архив .rar)

    Я не использовал пакеры, так что кому надо тот сам сделает.

    Файл для исследования (секций и дизассемблерного кода) в аттаче: 3) project1.rar

  14. Нормальная статья. Её поймут только те, кто делали хуки на COM бъекты.

    Я правда не совсем понял зачем автор ставит бряки больше одного раза, когда можно было обойтись одним. Хотя может я и ошибаюсь, т.к. на память не помню описания DirectX-интерфейсов и инициализацию устройства... Если будет время, то я почитаю повнимательнее эту статью. А вообще автор статьи неправильно поступил описывая подробности как и что делать в OllyDbg без рисования сначала общей картины как он собирается вытаскивать указатель и из какой представляемой "логики кода" на коде С++ он собирается вытащить, и вообще какова логика кода стандартной инициализации устройства, и по каким смещения каких интерфейсов находятся методы возвращающие те или иные объекты... Будет время я прокомментирую эту статью нормально с примерами.

  15. Народ, для того чтобы написать статью о компиляции CE6.0 нужна инфа по компиляции Lazarus после получения его исходников из SVN. Кто знает напишите )

    А всё сам сделаю как будет время. Я уже нашёл информацию как компилировать Лезаруса.

  16. Lazarus - свободно распространяемая IDE для компилятора Free Pascal Compiler, среды для разработки кросс-платформенных приложений на языке Free Pascal.

    Содержит набор визуальных компонентов LCL (Lazarus Component Library). В настоящее время практически полностью поддерживает виджеты GTK1 и Win32 . В разработке находятся виджеты Carbon, WinCE и WinAPI.

    Начиная с версии 0.9.26 поддерживает виджеты GTK2 и Qt

    Реализован основной набор элементов управления

    Поддерживает преобразование проектов Delphi

    Имеет собственный формат управления пакетами

    Поддерживаемые ОС: GNU/Linux, Microsoft Windows, Mac OS X, FreeBSD, WinCE

    Как уменьшить размер EXE файла в Lazarus

    Любой, даже небольшой проект в Lazarus, при компиляции создает EXE файл большого размера. Это связано с тем, что компилятор добавляет большое количество информации для отладчика. Когда это информация становится ненужной (например, после окончательной отладки программы) ее можно удалить.

    Рассмотрим этот процесс на примере простой консольной программы, выводящей строчку "Hello, World!". Создаем новый проект: Файл ? Создать ? Project ? Console application. Добавляем строчку Write('Hello, World!'); после строк "{ add your program here }" в подпрограмме TMyApplication.DoRun. Теперь запускаем программу. Все, что она делает - это выводит строку текста в консольном окне и при этом занимает 1 154 845 байт (в случае приложения под Виндоуз размер может быть выше 11 МБ).

    Начнем уменьшать размер. Первое, уберем информацию для отладчика из исполняемого файла: strip --strip-all project1.exe (здесь project1.exe - имя вашего бинарного файла). Новый файл project1.exe имеет размер 141 312 байт, т.е. в 8 раз меньше. Но на этом мы не остановимся.

    Проведем еще один шаг уменьшения размера исполняемого файла с помощью бинарного упаковщика UPX. Команда для полного сжатия следующая: upx.exe --best project1.exe (упаковщик UPX должен лежать в той же папке, что и сама программа или же можно прописать путь в PATH до папки, где проинсталлирован упаковщик). В результате получим размер 54 272 байт, т.е. в 21 раз меньше первоначального размера.

    Отметим, что порядок выполнения команд важен. Если запустить упаковщик, а потом команду strip, то результат будет значительно хуже (416 541 байт).

    Для удобства вы можете создать пакетный командный файл compile.bat со следующим содержанием (подставив вместо project1.exe имя вашего исполняемого файла):

    strip --strip-all project1.exe
    upx.exe --best project1.exe

    Теперь, для того, чтобы уменьшить размер исполняемого файла достаточно просто запустить файл compile.bat.

    Автор статьи: Ильдар Насибуллаев.

  17. Новые изменения на форуме:

    1) У пользователей группы "Разработчики" восстановлены рейтинги от минусовых рейтингов которые ставили бестолковые пользователи (в частности несчастные спамеры);

    2) Теперь только привилегированные пользователи могут ставить рейтинг. В данном случае это право заслужили "Разработчики". Может быть позже будет ещё одна группа для постояльцев, которые также могли бы оценивать рейтинг, т.е. уровень.

    3) Только что зарегистрировавшиеся пользователи проходят премодерацию сообщений какое-то время, после чего премодерация снимается. Это значит, что какое-то время Новые пользователи будут ждать когда их сообщения опубликуется. Когда пользователей будет очень много возможно администрации понадобятся помощники - супермодераторы и модераторы.

    От администрации: Xipho и MasterGH

    Мы ценим каждого нормального пользователя на нашем форуме. Спасибо за то, что вы с нами. Этот форум для вас и для нас.

  18. Эта тема будет для тех кто желает изучить программирование и кому это всегда казалось очень сложным.

    Я случайно нашёл идеальный вариант для вас: стильный, упрощенный и в то же время мощный, с описаниями на русском языке вариант - программирование на Small Basik. Ссылки которые я опубликую содержат настолько разжёванную информацию, что она позволит понять необходимые основы программирования и понять как учить язык программирования. Точнее не "учить", а воспринимать и понимать.

    1) Программа "Small Basic"

    post-3-1297173853,11_thumb.png

    2) Руководство "С чего начать" (.pdf)

    post-3-1297173871,9_thumb.png

    3) Сайт "Small Basic"

    4) Детский уголок вундеркиндов: Учебники по программированию

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

    Напишите вашу первую программу:

    s = "Привет, МИР!!!"
    TextWindow.WriteLine(s)

    А вот интересный пример который будет ближе к концу руководства:

    post-3-1297175986,96_thumb.png


    GraphicsWindow.BackgroundColor = "Black"
    GraphicsWindow.PenColor = "LightGreen"
    DrawTree()

    Sub DrawTree
    If (distance > 0) Then
    Turtle.Move(distance)
    Turtle.Turn(angle)

    Stack.PushValue("distance", distance)
    distance = distance - delta
    DrawTree()
    Turtle.Turn(-angle * 2)
    DrawTree()
    Turtle.Turn(angle)
    distance = Stack.PopValue("distance")

    Turtle.Move(-distance)
    EndIf
    EndSub

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

    - математические функции

    - работа со строками и текстом (класс Text, работа в консоле TextWindow)

    - работа с массивами, списками (Stack, ImageList)

    - работа с файлами

    - работа с удалёнными соединениями, сетевыми методами (можно загрузить содержимое страницы, отфильтровать её содержимое, проанализировать, воспользоваться службой Гугль по составлению например графиков, получить график и сохранить как файл)

    - работа с графикой (ImageList, Shapes и т.п.)

    - работа с мышкой

    - поддержка определения командной строки

    - работа с часами

    - работа с рабочим столом

    - работа с Интернет-словарём

    - размещение фотографий на сервисе Flick

    - Класс Program (методы для работы с программой)

    - Работа со звуками Класс Sound

    - Работа с таймером класс Timer

    - Черепашка Turtle готова выполнить ваши издевательства.

    Вот и весь очень скромный набор этой программы. К сожалению здесь нет создания GUI элементов (кнопок, менюшек и т.п.) у окна формы.

    Кому надо больше, обратите внимание на следующие продукты (именно в таком порядке):

    Visual Basic 2010 Express (новичкам будет тяжело...писать трейнеры можно по статьям)

    Visual C# 2010 Express (точно не для новичков...писать трейнеры можно по статьям)

    Visual C++ 2010 Express (точно не для новичков; если будите писать трейнеры, то только по статьям которые найдёте и то у вас будет очень много вопросов)

    Для веб-разработок:

    Visual Web Developer 2010 Express

    Другие инструменты в зависимости от ваших интересов найдёте сами.

    Я привел бесплатные урезанные среды разработок (возможно без ограниченных сроков) в которых вы можете писать куда более продвинутые программы. Например, вы можете: создавать пользовательский интерфейс, а для гурманов взаимодействовать с программами из пакета Офисных программ: Ворд, Ексель и другие. Взаимодействовать с базами данных... Но у всех этих программных продуктов есть один недостаток, скорее это достоинство. Огромная документация, просто огромнейшая документация MSDN на русском языке для C# и Visual Basic.net. Если вы выберите C++, то пока не разберётесь с WinAPI, то ничего не напишите ) Потом ещё придётся разобраться с архитектурой Windows... Есть и другие языки программирования типа Дельфи (язык Паскаль)... сами решайте что вам легче

  19. Недавно вышла статья про обход Xlive - ссылка.

    Например, там вы увидите следующее. Для того чтобы узнать какой код xlive проверяет сохранность кода игры, вы должны поставить "аппаратный бряк на доступ" на игровой код (подробности в статьи с видео) ;)

  20. Оказался ты 1800 годах в России и понадобилось тебе из Москвы в Париж...

    На велосипеде можно доехать из Москвы до Парижа.

    На лошади можно доскакать...

    На машине можно доехать из Москвы до Парижа.

    На поезде можно доехать...

    На самолете можно долететь из Москвы до Парижа.

    В конце концов можно и пешком дотопать если очень долго идти.

    Но самолётов тогда не было, машины были медленные... животное тебе нужно достать и на поезд не сесть. Машину достать проблема. На велосипеде как и пешком долго добираться. Но вот тебе подарили самую скоростную электронную машину с маркой LUA со сложной инструкцией. И ты всем сказал "да зачем она мне нужна, я эту инструкцию буду читать полмесяца, возьму я лучше велосипед и поеду на нём в Париж..." Так и уехал Akama в Париж на велосипеде с маркой Asm... :grin:

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

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

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