2016-12-08 4 views
1

Я пытаюсь запустить шеллкод с C# и использовать ниже заглушку (например, я нашел на Github). Однако каждый раз, когда я запускаю приложение, я получаю System.AccessViolationException occurred in ConsoleApplication1.exe, являющийся результатом функции callwindowproc.System.AccessViolationException для небезопасного кода

Я не очень хорошо знаком с вызовом небезопасного кода, я предполагаю, что это может быть защита памяти (например, DEP), но я не уверен. Может ли кто-нибудь дать дополнительную информацию?

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     [DllImport("user32")] 
     private static extern int CallWindowProc 
      (int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam); 


     public static unsafe int shl(int x) 
     { 
      //8B45 0C  MOV EAX,DWORD PTR SS:[EBP+12] 
      //D1E0   SHL EAX,1 
      //C2 10 00  RETN 10h 
      byte[] b = { 0x8B, 0x45, 0x0C, 0xD1, 0xE0, 0xC2, 0x10, 0x00 }; 
      fixed (byte* bb = &b[0]) 
      { 
       int bi = (int)bb; 
       return CallWindowProc(bi, x, 0, 0, 0); 
      } 
     } 

     public static unsafe int shr(int x) 
     { 
      //8B45 0C  MOV EAX,DWORD PTR SS:[EBP+12] 
      //D1E8   SHR EAX,1 
      //C2 10 00  RETN 10h 
      byte[] b = { 0x8B, 0x45, 0x0C, 0xD1, 0xE8, 0xC2, 0x10, 0x00 }; 
      fixed (byte* bb = &b[0]) 
      { 
       int bi = (int)bb; 
       return CallWindowProc(bi, x, 0, 0, 0); 
      } 
     } 

     public static unsafe void CallShellcode() 
     { 

      byte[] calc_shellcode = { //skylined calc shellcode from google code 
       0x31, 0xF6, 0x56, 0x64, 0x8B, 0x76, 0x30, 0x8B, 0x76, 0x0C, 0x8B, 
       0x76, 0x1C, 0x8B, 0x6E, 0x08, 0x8B, 0x36, 0x8B, 0x5D, 0x3C, 0x8B, 
       0x5C, 0x1D, 0x78, 0x01, 0xEB, 0x8B, 0x4B, 0x18, 0x67, 0xE3, 0xEC, 
       0x8B, 0x7B, 0x20, 0x01, 0xEF, 0x8B, 0x7C, 0x8F, 0xFC, 0x01, 0xEF, 
       0x31, 0xC0, 0x99, 0x32, 0x17, 0x66, 0xC1, 0xCA, 0x01, 0xAE, 0x75, 
       0xF7, 0x66, 0x81, 0xFA, 0x10, 0xF5, 0xE0, 0xE2, 0x75, 0xCC, 0x8B, 
       0x53, 0x24, 0x01, 0xEA, 0x0F, 0xB7, 0x14, 0x4A, 0x8B, 0x7B, 0x1C, 
       0x01, 0xEF, 0x03, 0x2C, 0x97, 0x68, 0x2E, 0x65, 0x78, 0x65, 0x68, 
       0x63, 0x61, 0x6C, 0x63, 0x54, 0x87, 0x04, 0x24, 0x50, 0xFF, 0xD5, 
       0xC3 
      }; 

      try 
      { 
       fixed (byte* bb = &calc_shellcode[0]) 
       { 
        int bi = (int)bb; 
        CallWindowProc(bi, 0, 0, 0, 0); 
       } 
      } 
      catch (Exception e) { } 

     } 

     static void Main(string[] args) 
     { 

      int a = shl(4); 
      int b = shr(4); 
      Console.WriteLine("shl(4)=" + a + " shr(4)=" + b); 
      Console.WriteLine("Press any key to call skylines calc shellcode"); 
      Console.ReadKey(); 
      CallShellcode(); 


     } 
    } 
} 
+0

Нарушение прав доступа означает, что вы получили доступ к памяти, которой не принадлежит ваш процесс, чаще всего путем разыменования нулевого указателя (адрес 0 никогда не отображается в ваши процессы, а значит, имеет место память). – Cameron

+0

Я принимал столько же, но я понятия не имею, почему это происходит, и если есть способ исправить/обойти его. –

ответ

1

CallWindowProc принимает указатель на функцию и дескриптор окна, как его первые два аргумента. Например, в shl вы передаете ему первые 32 бита последовательности команд x86 (т. Е. Значение указателя мусора) и твердое число 4 в качестве первых двух параметров. Неудивительно, что вскоре после этого произойдет сбой кода.

Что именно вы пытаетесь достичь? Что такое CallWindowProc? Похоже, вы хотите выполнить произвольные инструкции x86, созданные во время выполнения, что не имеет абсолютно никакого отношения к CallWindowProc, если вы прочтете его документацию.

This question может быть полезно.

+0

Я пытаюсь запустить шеллкод из C#. Я экспериментирую с созданием shellcode и использованием кодеров и криптовалов в C#. Первый шаг - запустить шеллкод после этого, я могу начать экспериментировать с использованием кодеров. Но теперь я все еще застрял в запуске шеллкода. Может быть, пункт для повышения - это то, что я сейчас компилирую его с помощью x64 (не уверен, что это имеет значение). В конце концов я хочу иметь возможность запускать x64 shellcode из C#. –