Переписать сегмент скомпилированной программы на C - PullRequest
0 голосов
/ 30 августа 2018

У меня есть программа на С, структурированная таким образом:

#include <Windows.h>
#include <stdio.h>
#include <stdint.h>

#pragma section(".code",execute, read, write)
#pragma comment(linker,"/SECTION:.code,ERW")
#pragma code_seg(".code")

//Code to decrypt

#pragma section(".stub", execute, read, write)
#pragma code_seg(".stub")

void decryptor(){
    //Retrieve virtual address of the pointer to the .code section
    //Retrieve the virtual size of the pointer to the .code section
    for(int i = 0; i<size; i++){
         //HERE THE PROGRAM STOPS
         ptrCode[0] = //Reverse function of the encryptor
    }
}

int main(){
    decryptor();
    mainFunctionDecrypted();
    return 0;
}

По сути, у меня есть шифратор, который сначала зашифровывает сегмент .code в exe этой программы после компиляции. Затем, когда я выполняю измененный exe-файл, я хочу иметь возможность сначала расшифровать его, а затем выполнить расшифрованную часть. Однако кажется, что я не могу записать в сегмент .code, загруженный в память (я думаю, потому что это часть памяти, выделенная для кода, который должен быть выполнен).

Есть ли способ записи в исполняемую память?

Есть ли какой-нибудь метод работы, который ты бы сделал?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Запутывать программу подобным образом бесполезно. Что бы ни делал ваш «расшифровщик», человек, который полон решимости перепроектировать вашу программу, также может это сделать. Вместо этого потратьте свои усилия на то, чтобы сделать вашу программу настолько желательной, чтобы люди хотели заплатить вам за нее, и достаточно доброжелательными, чтобы вам не пришлось скрывать, что она делает.

0 голосов
/ 12 сентября 2018

Мне нужно изменить код следующим образом. Более того, в Visual Studio есть важная опция компилятора, например, для отключения Data Execution Prevention.

Используется опция компилятора: / permissive- / GS / TC / GL / анализ- / W3 / Гр / Zc: wchar_t / Гм- / O2 / sdl / Zc: встроенный / fp: точный / Zp1 / D "_MBCS" / errorReport: prompt / WX- / Zc: forScope / GR- / Gd / Oy- / Oi / MD / FC / nologo / диагностика: классика

Используемая опция компоновщика: / MANIFEST / LTCG: добавочный / NXCOMPAT: NO / DYNAMICBASE: NO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" " ole32.lib "" oleaut32.lib "" uuid.lib "" odbc32.lib "" odbccp32.lib "/ ИСПРАВЛЕНО / МАШИНА: X86 / OPT: REF / SAFESEH / INCREMENTAL: NO / SUBSYSTEM: CONSOLE / MANIFESTUAC:" level = 'asInvoker' uiAccess = 'false' "/ MAP / OPT: ICF / ERRORREPORT: PROMPT / NOLOGO / TLBID: 1

#pragma section(".code", execute, read)
#pragma section(".codedata", read, write)
#pragma comment(linker,"/SECTION:.code,ERW")
#pragma comment(linker,"/SECTION:.codedata,ERW")
#pragma comment(linker, "/MERGE:.codedata=.code")

//All the following will go in code
#pragma code_seg(".code")
#pragma data_seg(".codedata")
#pragma const_seg(".codedata")

//CODE TO DECRYPT

// .stub SECTION
#pragma section(".stub", execute, read)
#pragma section(".stubdata", read, write)
#pragma comment(linker,"/SECTION:.stub,ERW")
#pragma comment(linker,"/SECTION:.stubdata,ERW")
#pragma comment(linker, "/MERGE:.stubdata=.stub")

//All the following will go in .stub segment
#pragma code_seg(".stub")
#pragma data_seg(".stubdata")
#pragma const_seg(".stubdata")

/*This function needs to be changed to whatever correspond to the decryption function of the encryotion function used by the encryptor*/
void decryptCodeSection(){

     //Retrieve virtual address of the pointer to the .code section
     //Retrieve the virtual size of the pointer to the .code section
     for(int i = 0; i<size; i++){
          //HERE THE PROGRAM STOPS
          ptrCode[0] = //Reverse function of the encryptor
      }

void main(int argc, char* argv[]){
    decryptor();
    mainFunctionDecrypted();
}

Таким образом я смог сначала расшифровать сегмент, а затем выполнить функцию.

0 голосов
/ 30 августа 2018

Windows и другие операционные системы делают все возможное, чтобы помешать вам сделать это (изменив разделы кода запущенного приложения).

Тогда вашими ближайшими опциями будут

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

2) использовать отдельную программу, которая расшифровывает программу на диске перед ее выполнением.

...