2023년 제9회 디지털 범인을 찾아라 경진대회 공고

 

□ 행사 개요
o 행사명: 2023년 제9회 디지털 범인을 찾아라 경진대회
o 대상: 주니어(전국 대학생 이하), 시니어(일반인 또는 전문가)
o 접수처: (사)한국포렌식학회 홈페이지(www.forensickorea.org) 공고
o 접수기간: 2023년 8월 7일(월)~8월 18일(금)
o 문제배포: 2023년 8월 28일(월)~9월 1일(금)
o 답안제출: 2023년 10월 6일(금) 18:00 마감
o 당선발표: 2023년 11월 2일(목) 18:00 (사)한국포렌식학회 홈페이지를 통해 발표
o 시상식(일정은 향후 변동될 수 있음)
- 일시: 2023년 12월 중순경
- 장소 미정

부문 시니어 주니어
대상 검찰총장상 1명
금상 한국포렌식학회장상 1명 한국저작권보호원장상 1명
은상 협찬사상 1명 협찬사상 1명
동상 협찬사상 2명 협찬사상 2명
장려상 한국포렌식학회장상 10명

o 추진체계
- 공동주최: (사)한국포렌식학회, 한국저작권보호원
- 후원: 대검찰청
- 협찬: 법무법인 클라스, 법무법인 세종, 법무법인 화우, 법무법인 태평양, 법무법인 허브, 법무법인 린, 손해보험협회, HM Company, 주식회사 제트코, GMDSOFT

□ 접수방법
o 접수
- (사)한국포렌식학회 홈페이지의 2023년 제9회 디지털 범인을 찾아라 경진대회 공고 페이지 하단에서 온라인 접수
- 접수 시 등기우편 수령 가능한 주소 및 연락처를 정확히 입력
o 참가비
- 주니어: 1만원 / 시니어: 2만원
- 주니어(전국 대학생 이하), 시니어(일반인 또는 전문가)

□ 문제배포 및 답안제출
o 문제 배포
- 등기우편으로 배포(배포방식은 변동될 수 있습니다.)
o 답안 제출 방법
- 답안 작성은 자유양식으로 작성, 관련 증거자료는 답안지와 함께 첨부하여 제출(배포한 문제 USB는 반납하지 마시고 개별적으로 사용하시면 됩니다)
- 2023년 10월 6일(금) 18:00까지 (사)한국포렌식학회에 도착한 답안까지 인정
- 답안 제출 주소: (03070) 서울특별시 종로구 성균관로 71, 201호 (명륜1가) (https://naver.me/5dPqTp4w)

□ 평가방법 및 참고사항
o 평가방법
- 분석 도구, 분석 절차, 분석 결과에 대해서 배점에 따라 평가
- 점수가 같은 경우, 답안 접수순서 등으로 우열 평가
o 대상 등 우수작에 대하여는 시상식장에서 발표함(허위사실이 발견 될 경우 입상 무효)

□ 디지털 범인을 찾아라 경진대회 개인정보 처리방침
본 경진대회에서 수집하는 개인정보는 다음과 같습니다.
수집하는 개인정보 항목: 이름, 이메일, 휴대전화번호, 생년월일, 주소, 소속/부서
수집목적: 경진대회 접수 및 응시·합격 정보관리, 확인서 발급, 행정 처리, 결제 정보 관리, 법령에 정한 통계 정보의 관리, 뉴스레터 발송, 신규 서비스 안내 등 관련 정보의 제공 등을 목적으로 개인정보를 처리합니다.
개인정보 처리 및 보관 기간: 접수일로부터 2년간, 요청 시 즉시 파기
개인정보 파기 방침: 복원 불가능한 상태로 파기(서류, 전산자료 포함)
개인정보의 제3자 제공: KG이니시스(경진대회 접수비 결제 대행)

<문의>
전화번호: 02-744-1809
이메일: challenge@forensickorea.org

2023년 제9회 디지털 범인을 찾아라 경진대회 접수 및 결제

결제 후 첨부파일인 '개인정보 수집·이용 및 제3자 제공 동의서'(한글 혹은 워드 파일 1개 선택)를 작성하여 challenge@forensickorea.org로 보내주시길 바랍니다.

개인정보-수집⸱이용-및-제3자-제공-동의서.hwp
0.13MB
개인정보-수집⸱이용-및-제3자-제공-동의서.docx
0.02MB

 

프로그램 이동.

MoveMonitorProgram.zip
0.26MB

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MoveMonitorProgram
{
    public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        // MONITORINFOEX 구조체 정의
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct MONITORINFOEX
        {
            public int cbSize;
            public RECT rcMonitor;
            public RECT rcWork;
            public uint dwFlags;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] szDevice;
        }

        // MonitorEnumDelegate 델리게이트 선언
        public delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData);

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

        [DllImport("user32.dll")]
        public static extern bool MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("user32.dll")]
        public static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumDelegate lpfnEnum, IntPtr dwData);

        [DllImport("user32.dll")]
        public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi);

        private List<Process> runningProcesses;

        public Form1()
        {
            InitializeComponent();
            runningProcesses = new List<Process>();
            // 폼이 로드될 때 라디오 버튼 1을 선택한 상태로 초기화
            radioButton1.Checked = true;
            LoadRunningProcesses();
            LoadMonitors();
        }

        private void LoadMonitors()
        {
            comboBox2.Items.Clear();
            int monitorCount = 0;
            EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, delegate (IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData)
            {
                MONITORINFOEX info = new MONITORINFOEX();
                info.cbSize = Marshal.SizeOf(info);
                GetMonitorInfo(hMonitor, ref info);
                monitorCount++;
                comboBox2.Items.Add("Monitor " + monitorCount);
                return true;
            }, IntPtr.Zero);

            if (comboBox2.Items.Count > 0)
            {
                comboBox2.SelectedIndex = 0;
            }
        }

        private void LoadRunningProcesses()
        {
            comboBox1.Items.Clear();
            string[] processNames;

            if (radioButton1.Checked)
            {
                processNames = new string[] { "dnplayer" };
            }
            else if (radioButton2.Checked)
            {
                processNames = new string[] { "Nox" };
            }
            else if (radioButton3.Checked)
            {
                string customProcessName = textBox1.Text.Trim();
                processNames = new string[] { customProcessName };
            }
            else
            {
                processNames = new string[] { "" };
            }

            runningProcesses.Clear();

            Process[] processes = Process.GetProcesses();
            foreach (Process process in processes)
            {
                foreach (string processName in processNames)
                {
                    if (string.IsNullOrEmpty(processName) || process.ProcessName.ToLower().Contains(processName.ToLower()))
                    {
                        runningProcesses.Add(process);
                        string windowTitle = !string.IsNullOrEmpty(process.MainWindowTitle) ? " - " + process.MainWindowTitle : "";
                        string displayName = process.ProcessName + windowTitle;

                        RECT rect;
                        GetWindowRect(process.MainWindowHandle, out rect);
                        string processInfo = $"({rect.Left}, {rect.Top}) {rect.Right - rect.Left} x {rect.Bottom - rect.Top}";

                        displayName += $" {processInfo}";
                        comboBox1.Items.Add(displayName);
                        break;
                    }
                }
            }

            // 프로세스를 로드한 후 첫 번째 아이템을 선택하도록 설정
            if (comboBox1.Items.Count > 0)
            {
                comboBox1.SelectedIndex = 0;
            }
        }

        private void MoveWindowToMonitor(Process process, Screen screen)
        {
            IntPtr handle = process.MainWindowHandle;
            if (handle != IntPtr.Zero)
            {
                RECT rect;
                GetWindowRect(handle, out rect);
                int width = rect.Right - rect.Left;
                int height = rect.Bottom - rect.Top;
                int newX = screen.WorkingArea.X + (screen.WorkingArea.Width - width) / 2;
                int newY = screen.WorkingArea.Y + (screen.WorkingArea.Height - height) / 2;
                MoveWindow(handle, newX, newY, width, height, true);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoadRunningProcesses();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked || radioButton2.Checked)
            {
                if (comboBox1.SelectedIndex >= 0 && comboBox1.SelectedIndex < runningProcesses.Count)
                {
                    Process selectedProcess = runningProcesses[comboBox1.SelectedIndex];
                    Screen selectedMonitor = Screen.AllScreens[comboBox2.SelectedIndex];
                    MoveWindowToMonitor(selectedProcess, selectedMonitor);
                }
            }
            else if (radioButton3.Checked)
            {
                string customProcessName = textBox1.Text.Trim();
                Process selectedProcess = GetProcessByNameString(customProcessName);
                if (selectedProcess != null)
                {
                    Screen selectedMonitor = Screen.AllScreens[comboBox2.SelectedIndex];
                    MoveWindowToMonitor(selectedProcess, selectedMonitor);
                }
                else
                {
                    MessageBox.Show("입력한 프로세스를 찾을 수 없습니다.");
                }
            }
        }

        private Process GetProcessByNameString(string processName)
        {
            Process[] processes = Process.GetProcesses();
            foreach (Process process in processes)
            {
                if (process.ProcessName.ToLower().Contains(processName.ToLower()))
                {
                    return process;
                }
            }
            return null;
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            textBox1.Visible = radioButton3.Checked;
        }
    }
}

컴퓨터 응용 프로그램은 특정 기능을 트리거하는 일련의 규칙으로 컴파일 된 간단한 코드 줄입니다. 결과적으로 대상 앱을 신중하게 분석하여 악성 소프트웨어를 쉽게 생성 할 수 있습니다. 그러나 개발자는 Confuser와 같은 응용 프로그램이 기대에 부응 할 수 있도록 소스 코드를 가능한 한 추적하거나 리버스 엔지니어링하기 어렵게 만드는 방법을 찾고 사용하고 있습니다.

 

Confuser.zip
1.08MB

ConfuserEX 1.0.0

ConfuserEx-master.zip
0.89MB
ConfuserEx_bin (1).zip
2.24MB

ConfuserEx는 2.0-4.5 및 Mono의 .NET Framework를 지원합니다 (요청이 충분할 경우 다른 .NET 플랫폼도 지원합니다!). 상업용 보호자에서 찾을 수있는 대부분의 보호 기능을 지원합니다.

 

기호 이름 변경

WPF / BAML 이름 바꾸기

제어 흐름 난독 화

메서드 참조 숨기기

안티 디버거 / 프로파일 러

안티 메모리 덤핑

변조 방지 (방법 암호화)

의존성 포함

지속적인 암호화

리소스 암호화

출력 압축

확장 가능한 플러그인 API

+ Recent posts