NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 엔지엠 RPA 매크로 - 프로그램의 메모리 읽기와 쓰기를 커스텀 모듈로 만들어보기. (Try making your progra…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이 예제는 엔지엠 에디터 6.2.1.3 이후부터 정상 동작합니다. 엔지엠 RPA 매크로에는 메모리를 읽거나 쓸 수 있는 액션이 포함되어 있습니다. 기본적인 학습 내용은 [ 메모리 읽기 ]와 [ 메모리 쓰기 ] 예제를 참고하세요. 이 예제를 같이 학습하려면 메모리의 주소값을 알아낼 수 있는 올리디버거(Olly Debugger)가 필요합니다. 아래 사이트에서 다운로드 후 설치하세요.

    [ 올리 디버거 다운로드 받기 ]

     

    다운로드 받은 압축 파일을 풀고, 적당한 위치에 복사해줍니다. 설치형이 아닌 포터블입니다.

    o0whJxH.png

     

     

    마우스 우클릭하고, 관리자 권한으로 실행하세요. 혹시라도 아래와 같은 에러 메시지가 표시되시면 보안 프로그램을 삭제해야 할수도 있습니다. 이 문제를 해결하려면 [ 여기 ]를 참고하세요. 그리고~ 대부분의 소프트웨어들이 올리 디버거로 프로세스를 연결하려고 하면 스스로 죽거나 경고 메시지를 표시할겁니다.

    ts098e7.png

     

     

    올리 디버거는 워낙 오래된 툴이기도 하고, 이미 알려진 상태라서 약간의 기술력이 있는 회사라면 뭔가 하기는 쉽지 않을겁니다. 더 강력한 도구들은 대부분 유료이고 전문적으로 다루거나 이런 일로 수익을 발생시키는게 아니라면 의미 없는 일이기도 합니다. 몇가지 툴을 가지고 있긴하지만, 대부분 불법적인 의뢰이기도하고 사실 불법이 아니더라도 시간이 없어서 못합니다. 대부분의 시간을 S사 프로젝트에 전념하고 있고 틈틈히 엔지엠소프트웨어도 운영하면서~ 투자자를 찾기 위한 활동과 미팅... 소개 자료등등 몸이 10개라도 부족한 상황이거든요^^;

     

    올리 디버거는 포터블 형태라서 시작 화면에 등록해주면 좀 더 쉽게 사용할 수 있습니다. 그리고, 바로가기의 관리자 권한으로 실행 옵션을 켜주는게 중요합니다. 윈도우 10에서 바로가기 아이콘을 관리자 권한으로 실행하도록 설정하는 방법은 [ 여기 ]를 참고해서 설정하세요.

     

    이제 올리 디버거를 실행 해보면, 아래와 같은 매인 화면을 볼 수 있습니다.

    DAuSu4F.png

     

     

    올리 디버거는 현재 2.0 버전까지 나와 있는걸로 알고 있는데요. 이 테스트에서는 1.10 버전으로 진행하고 있습니다. 64비트에 대응하려면 올리 디버거 2.0 버전을 사용하셔야 합니다. 또는 올리 디버거의 문제점을 보완한 x64dbg, x86dbg도 있습니다. 사실 둘다 사용해보면 큰 차이점은 없습니다. 64비트 응용프로그램을 크랙하거나 분석하는 용도라면 x64dbg나 ollydbg2.0을 사용하세요. 올리디버거는 현재 프로세스에 Attatch하는데 문제가 있습니다.

    pd9WMyJ.png

     

     

    메모장이 안보입니다.

    DtOaJyW.png

     

     

    x64dbg의 Attatch(부착)에는 정상적으로 보여집니다.

    xbALram.png

     

     

    아무래도 64비트 프로세스들도 모두 검색이 되다보니 더 많은 프로세스를 확인할 수 있습니다. 올리디버거도 64비트 프로세스를 제어하기 위한 확장 툴들이 있는데요. 이런 확장 기능을 설치해서 사용하면 동일하게 사용은 가능합니다. 아무튼~ x64dbg를 켠김에 메모장의 텍스트를 읽어오도록 하겠습니다. 메모장을 선택하고, 위 그림의 우측 하단에 "부착" 버튼을 클릭하세요. 좌측 상단에 어셈블리 코드가 보여지고, 우측에는 레지스터 상태를 볼 수 있습니다. 좌측 하단은 Heap 메모리, 파일맵, 텍스트 영역의 값들이 올 수 있습니다. 우측 하단은 스택 메모리의 상태를 확인할 수 있습니다. 스택도 메모리의 일부이기 때문에 덤프 영역에서도 확인이 가능합니다.

    lRUe82E.png

     

     

    올리 디버거 또는 x64dbg 도구의 사용 방법을 알아보는건 아니라서 대충 원하는 값을 어떻게 검색하는지만 알아보고 넘어가도록 하겠습니다. 좀 더 깊이있게 학습하려면 구글에서 검색해보세요. 다양하고 많은 예제들이 나옵니다^^; 아래 그림과 같이 메모리 맵 탭을 클릭하고, Ctrl+B(패턴 찾기)를 누르세요.

    qg9XT9z.png

     

     

    찾을 문자열 Welcome을 입력하고 확인 버튼을 누르세요.

    ktUF5Yn.png

     

     

    패턴과 일치하는 항목을 더블 클릭해줍니다.

    87NdcBa.png

     

     

    찾은 메모리 주소를 Alt+Ins를 눌러서 복사 해줍니다.

    2R9qNy4.png

     

     

    메모리 주소값을 알아냈으므로 엔지엠 에디터를 실행하고, 새로운 스크립트를 생성하세요. 그리고 메모리 카테고리에 [ 읽기 ] 액션을 추가하세요. 아래 그림과 같이 메모장의 핸들을 추가하고, 메모리 주소를 적어줍니다. Ctrl+Alt+F8을 눌러서 스크립트를 실행하면 "Welcome" 문자열을 읽어온것을 확인할 수 있습니다.

    OMmbUzd.png

     

     

    커스텀 모듈을 만들기 위해 Visual Studio Community를 실행하세요. 클래스 라이브러리로 새 프로젝트를 "CustomMemoryModule" 이름으로 만듭니다. 클래스 이름도 ReadModel로 변경해주세요. 엔지엠 RPA 매크로에서 커스텀 모듈을 사용하기 위해서는 몇가지 이름 규칙(Naming Rule)이 존재합니다. 엔지엠 에디터에서 커스텀 모듈을 사용하기 위해서는 모듈 이름이 Custom으로 시작해야 하고, 액션들은 모두 Model로 이름이 끝나야 합니다. 이 규칙은 그냥 외우세요~ ㅎㅎ; 이제 환경 구성의 마지막 NGM 커스텀 모듈 팩을 참조에 추가해줍니다. 커스텀 모듈 팩은 3개로 이루어져 있으며 엔터프라이즈 라이센스를 가진분은 관리자에게 요청해서 받아야 합니다.

    M1vQKjU.png

     

     

    전체 코드는 아래와 같습니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Serialization;
    
    namespace CustomMemoryModule
    {
        [Serializable]
        public class ReadModel : NGM.Models.Interface.BaseCustomToolModel
        {
            public override string DisplayCategory => "NGMsoftware";
    
            public override string DisplayName => "메모리 읽기";
    
            [Category("Data")]
            [DisplayName("메모리 값")]
            [Description("메모리 주소로부터 읽어온 값을 표시합니다.")]
            [Browsable(true)]
            public string Data { get; set; }
    
            [Category("Action")]
            [DisplayName("메모리 주소")]
            [Description("값을 읽어올 메모리 주소를 입력합니다.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public string MemoryAddress { get; set; }
    
            [Category("Action")]
            [DisplayName("핸들 값")]
            [Description("메모리를 읽은 프로그램의 매인 핸들 값입니다.")]
            [Browsable(true)]
            [DefaultValue(0)]
            public int MainHandle { get; set; }
    
            public override void Execute()
            {
                var helper = new NGM.API.Helper();
                Data = helper.ReadMemory(MainHandle, 16, MemoryAddress);
            }
        }
    }

     

    아래 커스텀 메뉴얼을 참고해서 컴파일 후 커스텀 모듈을 엔지엠 에디터에 등록해줍니다.

    [ 커스텀 모듈 만들기 ]

     

    엔지엠 에디터를 실행하고, 메모리 읽기 커스텀 액션을 스크립트에 추가해줍니다. 위 엔지엠 에디터에서 했던것과 동일하게 각각의 속성을 채워줍니다. 그리고, 실행하면 "Welcome" 문자열을 메모장의 메모리에서 읽어온 것을 확인할 수 있습니다.

    ZwY5Kys.png

     

     

    여기서 테스트 하지는 않았지만, 메모리 쓰기도 이와 비슷합니다. 메모리 쓰기는 사실 메모리에 있는 값을 편집한다는 의미입니다. 어떤 값이 메모리에 할당 받은 주소가 있어야하고, 이 주소의 값을 변경하는 방식이기 때문입니다. 그래서, 이 예제에서 사용된 메모리 주소로 메모리 쓰기 액션을 수행하면 텍스트가 변경되는걸 알 수 있습니다. 이외에도 분석해야 할 부분들이 많은데요. 전문적으로 분석해서 뭔가 조작하려는게 아니라면 러닝 커브가 높은 메모리 자동화보다는 이미지 자동화를 하는게 더 좋습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.