如何在内存中运行可执行程序?

如何在内存中运行可执行程序?

在内存中运行可执行程序

在内存中运行可执行程序,好处是可以给程序加壳,加密源程序,静态反汇编无法获得PE输入节,但是因为运行后仍然是独立的进程,所以没办法防止远程线程注入,挂接API钩子。

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?typedefIMAGE_SECTION_HEADER( * PIMAGE_SECTION_HEADERS)[ 1 ];
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
// 计算对齐后的大小
如何在内存中运行可执行程序? unsigned long GetAlignedSize(unsigned long Origin,unsigned long Alignment)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
return (Origin + Alignment - 1 ) / Alignment * Alignment;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
// 计算加载pe并对齐需要占用多少内存
如何在内存中运行可执行程序?
// 未直接使用OptionalHeader.SizeOfImage作为结果是因为据说有的编译器生成的exe这个值会填0
如何在内存中运行可执行程序? unsigned long CalcTotalImageSize(PIMAGE_DOS_HEADERMzH
如何在内存中运行可执行程序?,unsigned
long FileLen
如何在内存中运行可执行程序?,PIMAGE_NT_HEADERSpeH
如何在内存中运行可执行程序?,PIMAGE_SECTION_HEADERSpeSecH)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?unsigned
long res;
如何在内存中运行可执行程序?
// 计算pe头的大小
如何在内存中运行可执行程序? res = GetAlignedSize(peH -> OptionalHeader.SizeOfHeaders,peH -> OptionalHeader.SectionAlignment);
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
// 计算所有节的大小
如何在内存中运行可执行程序? for ( int i = 0 ;i < peH -> FileHeader.NumberOfSections; ++ i)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
// 超出文件范围
如何在内存中运行可执行程序? if (peSecH[i] -> PointerToRawData + peSecH[i] -> SizeOfRawData > FileLen)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
return 0 ;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? else if (peSecH[i] -> VirtualAddress) // 计算对齐后某节的大小
如何在内存中运行可执行程序? 如何在内存中运行可执行程序? {
如何在内存中运行可执行程序?
if (peSecH[i] -> Misc.VirtualSize)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?res
= GetAlignedSize(peSecH[i] -> VirtualAddress + peSecH[i] -> Misc.VirtualSize
如何在内存中运行可执行程序?,peH
-> OptionalHeader.SectionAlignment);
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? else
如何在内存中运行可执行程序?如何在内存中运行可执行程序? {
如何在内存中运行可执行程序?res
= GetAlignedSize(peSecH[i] -> VirtualAddress + peSecH[i] -> SizeOfRawData
如何在内存中运行可执行程序?,peH
-> OptionalHeader.SectionAlignment);
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? else if (peSecH[i] -> Misc.VirtualSize < peSecH[i] -> SizeOfRawData)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?res
+= GetAlignedSize(peSecH[i] -> SizeOfRawData
如何在内存中运行可执行程序?,peH
-> OptionalHeader.SectionAlignment);
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? else
如何在内存中运行可执行程序?如何在内存中运行可执行程序? {
如何在内存中运行可执行程序?res
+= GetAlignedSize(peSecH[i] -> Misc.VirtualSize
如何在内存中运行可执行程序?,peH
-> OptionalHeader.SectionAlignment);
如何在内存中运行可执行程序?}
// if_else
如何在内存中运行可执行程序? }
// for
如何在内存中运行可执行程序?
如何在内存中运行可执行程序? return res;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
// 加载pe到内存并对齐所有节
如何在内存中运行可执行程序? BOOLAlignPEToMem( void * Buf
如何在内存中运行可执行程序?,
long Len
如何在内存中运行可执行程序?,PIMAGE_NT_HEADERS
& peH
如何在内存中运行可执行程序?,PIMAGE_SECTION_HEADERS
& peSecH
如何在内存中运行可执行程序?,
void *& Mem
如何在内存中运行可执行程序?,unsigned
long & ImageSize)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?PIMAGE_DOS_HEADERSrcMz;
// DOS头
如何在内存中运行可执行程序? PIMAGE_NT_HEADERSSrcPeH; // PE头
如何在内存中运行可执行程序? PIMAGE_SECTION_HEADERSSrcPeSecH; // 节表
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?SrcMz = (PIMAGE_DOS_HEADER)Buf;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if (Len < sizeof (IMAGE_DOS_HEADER))
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if (SrcMz -> e_magic != IMAGE_DOS_SIGNATURE)
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if (Len < SrcMz -> e_lfanew + ( long ) sizeof (IMAGE_NT_HEADERS))
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?SrcPeH
= (PIMAGE_NT_HEADERS)(( int )SrcMz + SrcMz -> e_lfanew);
如何在内存中运行可执行程序?
if (SrcPeH -> Signature != IMAGE_NT_SIGNATURE)
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if ((SrcPeH -> FileHeader.Characteristics & IMAGE_FILE_DLL) ||
如何在内存中运行可执行程序?(SrcPeH -> FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == 0 ) ||
如何在内存中运行可执行程序?(SrcPeH -> FileHeader.SizeOfOptionalHeader != sizeof (IMAGE_OPTIONAL_HEADER)))
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?SrcPeSecH
= (PIMAGE_SECTION_HEADERS)(( int )SrcPeH + sizeof (IMAGE_NT_HEADERS));
如何在内存中运行可执行程序?ImageSize
= CalcTotalImageSize(SrcMz,Len,SrcPeH,SrcPeSecH);
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if (ImageSize == 0 )
如何在内存中运行可执行程序?
return FALSE;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?Mem
= VirtualAlloc(NULL,ImageSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE); // 分配内存
如何在内存中运行可执行程序? if (Mem != NULL)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
// 计算需要复制的PE头字节数
如何在内存中运行可执行程序? unsigned long l = SrcPeH -> OptionalHeader.SizeOfHeaders;
如何在内存中运行可执行程序?
for ( int i = 0 ;i < SrcPeH -> FileHeader.NumberOfSections; ++ i)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
if ((SrcPeSecH[i] -> PointerToRawData) &&
如何在内存中运行可执行程序?(SrcPeSecH[i] -> PointerToRawData < l))
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?l
= SrcPeSecH[i] -> PointerToRawData;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?memmove(Mem,SrcMz,l);
如何在内存中运行可执行程序?peH
= (PIMAGE_NT_HEADERS)(( int )Mem + ((PIMAGE_DOS_HEADER)Mem) -> e_lfanew);
如何在内存中运行可执行程序?peSecH
= (PIMAGE_SECTION_HEADERS)(( int )peH + sizeof (IMAGE_NT_HEADERS));
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
void * Pt = ( void * )((unsigned long )Mem
如何在内存中运行可执行程序?
+ GetAlignedSize(peH -> OptionalHeader.SizeOfHeaders
如何在内存中运行可执行程序?,peH
-> OptionalHeader.SectionAlignment)
如何在内存中运行可执行程序?);
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
for (i = 0 ;i < peH -> FileHeader.NumberOfSections; ++ i)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
// 定位该节在内存中的位置
如何在内存中运行可执行程序? if (peSecH[i] -> VirtualAddress)
如何在内存中运行可执行程序?Pt
= ( void * )((unsigned long )Mem + peSecH[i] -> VirtualAddress);
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
if (peSecH[i] -> SizeOfRawData)
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
// 复制数据到内存
如何在内存中运行可执行程序? memmove(Pt,( const void * )((unsigned long )(SrcMz) + peSecH[i] -> PointerToRawData),peSecH[i] -> SizeOfRawData);
如何在内存中运行可执行程序?
if (peSecH[i] -> Misc.VirtualSize < peSecH[i] -> SizeOfRawData)
如何在内存中运行可执行程序?Pt
= ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> SizeOfRawData,peH -> OptionalHeader.SectionAlignment));
如何在内存中运行可执行程序?
else // pt定位到下一节开始位置
如何在内存中运行可执行程序? Pt = ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> Misc.VirtualSize,peH -> OptionalHeader.SectionAlignment));
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? else
如何在内存中运行可执行程序?如何在内存中运行可执行程序? {
如何在内存中运行可执行程序?Pt
= ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> Misc.VirtualSize,peH -> OptionalHeader.SectionAlignment));
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?}

如何在内存中运行可执行程序? return TRUE;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?typedef
void * (__stdcall * pfVirtualAllocEx)(unsigned long , void * ,unsigned long ,unsigned long ,unsigned long );
如何在内存中运行可执行程序?pfVirtualAllocExMyVirtualAllocEx
= NULL;
如何在内存中运行可执行程序?
如何在内存中运行可执行程序?BOOLIsNT()
如何在内存中运行可执行程序?如何在内存中运行可执行程序?
{
如何在内存中运行可执行程序?
return MyVirtualAllocEx != NULL;
如何在内存中运行可执行程序?}

如何在内存中运行可执行程序?
如何在内存中运行可执行程序?
// 生成外壳程序命令行
如何在内存中运行可执行程序? char * PrepareShellExe( char * CmdParam,unsigned long BaseAddr,unsigned long Ima