Мне нужно изменить код следующим образом. Более того, в 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();
}
Таким образом я смог сначала расшифровать сегмент, а затем выполнить функцию.