> For the complete documentation index, see [llms.txt](https://qpapel.papelship.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://qpapel.papelship.com/documentation/tr-documentation/proje-ayarlama/qpapelpacker.md).

# qPapelPacker

`qPapelPacker`, korumalı kimlik doğrulama yükünüzü (`qPapelAuth64.dll`) hedef yükleyici (loader) ikili dosyanızın (EXE veya DLL) içine gömen ve güvenliğini sağlayan sağlamlaştırılmış bir PE bölüm enjektörüdür.

Bu adım gerçekleştirilmezse, yükleyici saplaması (`QP_StubInit()`) `.******` bölümünü bulamayacak ve uygulama çalıştırılamayacaktır.

***

## Komut Satırı Arayüzü (CLI)

`qPapelPacker` aracını PowerShell veya Komut İstemi (CMD) üzerinden manuel olarak çalıştırabilirsiniz:

```bash
qPapelPacker.exe --dll <raw_auth_dll_yolu> --input <paketlenmemis_hedef_yolu> --output <paketlenmis_cikti_yolu> [seçenekler]
```

### Komut Satırı Bağımsız Değişkenleri

* `--dll <yol>`: (Gerekli) Derlenmiş ham kimlik doğrulama DLL dosyasının yolu (örn: `qPapelAuth64.dll`).
* `--input <yol>`: (Gerekli) Derlenmiş yükleyici uygulamanızın yolu (örn: `loader.exe` veya `loader.dll`).
* `--output <yol>`: (Gerekli) Nihai korumalı dosyanın oluşturulacağı hedef yol.
* `--fakes <N>`: Enjekte edilecek sahte bölüm sayısı (varsayılan: 7, en fazla: 9).
* `--no-fake`: Sahte bölüm oluşturmayı tamamen devre dışı bırakır.

***

## Visual Studio Entegrasyonu (Post-Build Event)

Her başarılı derlemede korumalı dosyanın otomatik olarak üretilmesi için paketleme işlemini otomatikleştirmek amacıyla Visual Studio projenize bir **Post-Build Event** ekleyebilirsiniz.

{% tabs %}
{% tab title="Yöntem A: Visual Studio GUI Yapılandırması" %}
{% stepper %}
{% step %}

## Proje özelliklerini açın

Projenize sağ tıklayın → **Properties**.
{% endstep %}

{% step %}

## Post-Build Event bölümüne gidin

**Configuration Properties → Build Events → Post-Build Event** yolunu izleyin.
{% endstep %}

{% step %}

## Command Line alanını ayarlayın

```cmd
if not exist "$(ProjectDir)dist" mkdir "$(ProjectDir)dist"
"$(ProjectDir)qPapelTools\qPapelPacker.exe" --dll "$(ProjectDir)qPapelTools\qPapelAuth64.dll" --input "$(OutDir)$(TargetName)$(TargetExt)" --output "$(ProjectDir)dist\$(TargetName)_final_x64.exe"
```

{% endstep %}

{% step %}

## Description alanını ayarlayın

```
Embedding qPapelAuth DLL into target executable...
```

{% endstep %}

{% step %}

## Değişiklikleri uygulayın

**Apply** (Uygula) ve **OK** (Tamam) butonlarına tıklayın.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Yöntem B: XML Yapılandırması (.vcxproj dosyası)" %}
Bu yapılandırma bloğunu doğrudan `.vcxproj` dosyanıza da yapıştırabilirsiniz:

```xml
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
  <PostBuildEvent>
    <Command>
      if not exist "$(ProjectDir)dist" mkdir "$(ProjectDir)dist"
      "$(ProjectDir)qPapelTools\qPapelPacker.exe" --dll "$(ProjectDir)qPapelTools\qPapelAuth64.dll" --input "$(OutDir)$(TargetName)$(TargetExt)" --output "$(ProjectDir)dist\$(TargetName)_final_x64.exe"
    </Command>
    <Message>Embedding qPapelAuth DLL into target executable...</Message>
  </PostBuildEvent>
</ItemDefinitionGroup>
```

{% endtab %}
{% endtabs %}

***

## DLL Hedefleriyle Çalışma

Yükleyiciniz bir Konsol/Pencere EXE projesi yerine bir DLL projesi (örn: `loader.dll`) olsa bile paketleme işlemi tamamen aynı şekilde çalışır:

```bash
qPapelPacker.exe --dll qPapelAuth64.dll --input loader.dll --output dist\loader_packed.dll
```

### DLL paketlerken önemli gereksinim

Yükleyici DLL'inizin kaynak kodunun, `QP_StubInit()` fonksiyonunun `.qpdata` bölümünü ana işlem yerine kendi içerisinde doğru bir şekilde arayabilmesi için `GetModuleHandle(NULL)` kullanmak yerine DLL adresini dinamik olarak aldığından emin olun:

```cpp
// DLL yükleyicisi içerisindeki doğru yöntem:
HMODULE hMod = nullptr;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
                   reinterpret_cast<LPCSTR>(QP_StubInit), &hMod);
auto* base = reinterpret_cast<const uint8_t*>(hMod);
```
