Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!



string pngFile = @"O:\cat.png";
string pngOutFile = @"O:\catnew.png";
using (Image img = Image.FromFile(pngFile))
{
var bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format32bppArgb);
using (Graphics gr = Graphics.FromImage(bmp))
{
gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
}
bmp.Save(pngOutFile, ImageFormat.Png);
}
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var orig = File.ReadAllBytes("9c63b8a4e0f74341b6484d481d434a02.png");
var modified = Modify(orig);
Console.WriteLine("Packed sizes: original = {0}, modified = {1}", orig.Length, modified.Length);
Compare(orig, modified);
orig = Unpack(orig);
modified = Unpack(modified);
Console.WriteLine("Unpacked sizes: original = {0}, modified = {1}", orig.Length, modified.Length);
Compare(orig, modified);
if (Enumerable.SequenceEqual(orig, modified))
Console.WriteLine("Unpacked data is equal");
else
Console.WriteLine("Unpacked data not equal");
}
private static byte[] Modify(byte[] orig)
{
var ms = new MemoryStream();
using (var image = Image.FromStream(new MemoryStream(orig)))
image.Save(ms, ImageFormat.Png);
/*using (var bmp = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb))
{
using (Graphics gr = Graphics.FromImage(bmp))
gr.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
bmp.Save(ms, ImageFormat.Png);
}*/
return ms.GetBuffer();
}
private static byte[] Unpack(byte[] orig)
{
var ms = new MemoryStream();
using (var image = Image.FromStream(new MemoryStream(orig)))
image.Save(ms, ImageFormat.Bmp);
return ms.GetBuffer();
}
private static void Compare(byte[] orig, byte[] modified)
{
using (var img1 = (Bitmap)Image.FromStream(new MemoryStream(orig)))
using (var img2 = (Bitmap)Image.FromStream(new MemoryStream(modified)))
{
int h = img1.Height, w = img1.Width;
if (h != img2.Height || w != img2.Width)
{
Console.WriteLine("Image sizes is different");
return;
}
for (int x = 0; x<w; x++)
for (int y=0; y<h; y++)
if (img1.GetPixel(x, y) != img2.GetPixel(x, y))
{
Console.WriteLine("\tat ({0},{1}): {2:x8} != {3:x8}", x, y, img1.GetPixel(x, y), img2.GetPixel(x, y));
return;
}
}
Console.WriteLine("Images are equal");
}
}
Packed sizes: original = 27314, modified = 21121
Images are equal
Unpacked sizes: original = 262198, modified = 262198
Images are equal
Unpacked data not equal

// .h
#pragma once
#include <tchar.h>
#include <windows.h>
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")
class DotNetHostDispatcher
{
private:
ICLRMetaHost *pMetaHost;
ICLRRuntimeInfo *pRuntimeInfo;
ICLRRuntimeHost *pClrRuntimeHost;
PCWSTR pszStaticMethodName;
PCWSTR pszStringArg;
DWORD dwLengthRet;
public:
HRESULT hr;
// Samples of pszVersion: L"v2.0.50727", L"v4.0.30319"
DotNetHostDispatcher(PCWSTR pszVersion);
// pszAssemblyPath - path to .NET dll
void StartMain(PCWSTR pszAssemblyPath, PCWSTR pszClassName, PCWSTR pszStringArg);
// Release
~DotNetHostDispatcher();
};
//.cpp
#include "DotNetHostDispatcher.h"
DotNetHostDispatcher::DotNetHostDispatcher(PCWSTR pszVersion)
{
pMetaHost = NULL;
pRuntimeInfo = NULL;
pClrRuntimeHost = NULL;
pszStaticMethodName = L"Main";
pszStringArg = L"--start";
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
if (FAILED(hr)) throw L"CLRCreateInstance failed w/hr 0x%08lx";
hr = pMetaHost->GetRuntime(pszVersion, IID_PPV_ARGS(&pRuntimeInfo));
if (FAILED(hr)) throw L"ICLRMetaHost::GetRuntime failed w/hr 0x%08lx";
BOOL fLoadable;
hr = pRuntimeInfo->IsLoadable(&fLoadable);
if (FAILED(hr)) throw L"ICLRRuntimeInfo::IsLoadable failed w/hr 0x%08lx";
if (!fLoadable) throw L".NET runtime cannot be loaded";
hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pClrRuntimeHost));
if (FAILED(hr)) throw L"ICLRRuntimeInfo::GetInterface failed w/hr 0x%08lx";
hr = pClrRuntimeHost->Start();
if (FAILED(hr)) throw L"CLR failed to start w/hr 0x%08lx";
}
void DotNetHostDispatcher::StartMain(PCWSTR pszAssemblyPath, PCWSTR pszClassName, PCWSTR pszStringArg)
{
hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath, pszClassName, pszStaticMethodName, pszStringArg, &dwLengthRet);
}
DotNetHostDispatcher::~DotNetHostDispatcher()
{
if (pMetaHost)
{
pMetaHost->Release();
pMetaHost = NULL;
}
if (pRuntimeInfo)
{
pRuntimeInfo->Release();
pRuntimeInfo = NULL;
}
if (pClrRuntimeHost)
{
pClrRuntimeHost->Release();
pClrRuntimeHost = NULL;
}
}
#include "DotNetHostDispatcher.h"
int _tmain(int argc, _TCHAR* argv[])
{
// Сборку будет исполнять вторым фреймворком
DotNetHostDispatcher * dispatcher = new DotNetHostDispatcher(L"v2.0.50727");
// Хостинг сборки и вызов метода Main с передачей параметра
dispatcher->StartMain(L"DotNetAppLib.dll", L"DotNetAppLib.DotNetClass", L"--start");
dispatcher->~DotNetHostDispatcher();
return 0;
}
По крайней мере легкий ступор хакеру-неофиту обеспечен.
Котфускация исполняемого .net кода