重写已编译的C程序的段

时间:2018-08-30 19:47:47

标签: c visual-studio encryption memory-management segment

我有一个以这种方式构造的C程序:

#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;
}

基本上我有一个加密器,编译后首先在该程序的exe中加密.code段。 然后,当我执行修改后的exe时,我希望能够首先对其进行解密,然后执行解密后的部分。但是,似乎我无法写入内存中加载的.code段(我想是因为它是专用于执行代码的部分内存)。

有什么方法可以写入可执行内存?

您会做任何工作吗?

3 个答案:

答案 0 :(得分:3)

Windows和其他操作系统竭力阻止您执行此操作(修改正在运行的应用程序的代码部分)。

那么,您的直接选择是

1)将代码解密到为此目的而动态分配的其他一些内存区域(然后,代码必须仅使用与位置无关的指令,或者包含具有位置特定数据的指令的自定义修正)。

2)使用单独的程序,该程序在执行之前先解密磁盘上的程序。

答案 1 :(得分:0)

以这种方式混淆程序本质上是徒劳的。无论您的“解密器”做什么,决心对程序进行反向工程的人员也可以做到。将您的精力花在使程序令人满意上,以使人们想要付钱给您,并且仁慈到足以使您不必隐藏它在做什么。

答案 2 :(得分:0)

我需要按以下方式修改代码。此外,Visual Studio中还有重要的编译器选项可设置,例如,禁用数据执行保护。

使用的编译器选项: / permissive- / GS / TC / GL / analyze- / W3 / Gy / Zc:wchar_t / Gm- / O2 / sdl / Zc:inline / fp:precise / Zp1 / D“ _MBCS” / errorReport:prompt / WX- / Zc:forScope / GR- / Gd / Oy- / Oi / MD / FC / nologo / diagnostics:classic

使用的链接器选项: / 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“ / FIXED / MACHINE:X86 / OPT:REF / SAFESEH / INCREMENTAL:NO / SUBSYSTEM:CONSOLE / MANIFESTUAC:” level = 'asInvoker'uiAccess ='false'“ / MAP / OPT:ICF / ERRORREPORT:PROMPT / NOLOGO / TLBID:1

int

通过这种方式,我能够首先解密该段,然后执行该功能。