我有一个以这种方式构造的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段(我想是因为它是专用于执行代码的部分内存)。
有什么方法可以写入可执行内存?
您会做任何工作吗?
答案 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
通过这种方式,我能够首先解密该段,然后执行该功能。