반응형

C 코드를 어셈블리 코드로, 어셈블리 코드를 기계 코드로 바꿔보자.

 

콘솔 명령어 CMD를 실행하는 C 코드를 작성하고 빌드한다.

 

실행하면 콘솔 화면이 나타난다.

 

브레이크 포인트를 걸고 디버깅한다.

 

C 코드가 디스어셈블리된 코드를 확인할 수 있다.

 

 

디버거를 이용해 kernel32.dll의 WinExec() 주소를 확인한다. (0x75E3E120)

디버거로 확인한 WinExec() 주소는 재부팅 할 때마다 변경된다.

 

확인한 어셈블리 코드와 WinExec() 주소를 적당히 편집해 어셈블리 코드를 작성한다. 빌드하고 실행하면 콘솔 화면이 실행된다.

 

WinExec() 가 실행되기 전 코드에 브레이크 포인트를 걸고 디버깅한다. 이번엔 기계 코드를 확인한다.

 

DEP(Data Execution Prevention)를 No로 세팅한다.

 

 

기계 코드를 작성하고 빌드한다. 실행하면 콘솔 화면이 실행된다.

 

반응형
Posted by J-sean
:
반응형

치트 엔진으로 삽입한(inject) 코드를 enable/disable 하기 위해 Cheat Table Framework code 사용할 수 있다. 하지만 자세히 보지 않으면 원치 않는 결과를 얻게 되므로 조심해야 한다.

 

치트 엔진 튜토리얼을 실행하고 Step 7: Code Injection 까지 진행한다.

 

Health 메모리를 찾는다.

 

Health 메모리에 쓰기를 시도하는 코드를 찾는다.

 

쓰기 코드를 찾았으면 Show disassembler 버튼을 클릭한다.

 

 

Health 메모리에 저장된 값을 1 감소(sub) 시키는 코드가 선택된다.

 

Tools - Auto Assemble 을 클릭한다.

 

삽입할 코드를 enable/disable 할 수 있도록 Cheat Table framework code를 선택한다.

 

Code injection을 선택한다.

 

 

코드를 삽입하고 복구하는 기본 코드가 작성되었다. 코드를 수정하지 않았으므로 프로그램은 변경되지 않는다.

 

Assign to current cheat table을 선택한다.

 

Cheat Table Address List에 스크립트가 추가되었다.

 

Active 체크박스를 클릭해 enable 시킨다.

 

 

스크립트가 삽입된 주소로 점프하는 코드로 변경되었다.

 

다시 Active 체크박스를 클릭해 disable 시킨다.

 

변경된 점프 코드가 다시 원래 sub 코드로 복구되었다.

 

하지만 튜토리얼의 Hit me 버튼을 클릭하면 오류가 발생하고 프로그램이 종료되어 버린다.

 

 

왜 그럴까? 원래 코드와 복구된 코드를 다시 살펴보자.

위 Memory Viewer가 원래 코드고 아래 Memory Viewer가 복구된 코드다.

원래 코드나 복구된 코드나 ebx 레지스터에 저장된 메모리 주소에서 4A4 바이트 떨어진 곳에 저장된 값에서 1을 빼는 내용으로 동일하지만 자세히 보면 Opcode가 다른것을 확인할 수 있다. 원래 코드의 Opcode는 83이고 복구된 코드의 Opcode는 81이다. 두 번째 operand도 값은 1로 동일하지만 크기가 1바이트(01)와 4바이트(00000001)로 큰 차이가 발생했다. 이렇게 코드가 바뀌었지만 내용은 같기때문에 별 문제가 없을것 같지만 명령어 크기가 바뀌는 바람에 그 다음 명령어 영역까지 침범한 것은 큰 문제이다. (그래서 프로그램이 오류로 종료되어 버리는 것이다)

 

스크립트의 복구 내용을 살펴보면 원래 어셈블리어 코드 그대로 사용했음을 확인할 수 있다. 그런데 그 어셈블리어 코드가 원래 옵코드와 오퍼랜드로 복구되지 않는것이 문제이다.

 

인텔 소프트웨어 개발자 메뉴얼을 확인해 보자.

 

intel Software Developer’s Manual_Vol_2.pdf
11.06MB

 

sub 명령어는 여러가지 Opcode가 존재한다.

원래 코드의 83은 imm8(8비트 값)을 오퍼랜드로 사용하지만 복구된 코드의 81은 imm32(32비트 값)을 오퍼랜드로 사용한다. 복구할 스크립트의 sub 명령어를 기계어로 번역할때 Opcode를 81로 사용하기 때문에 sub dword ptr [ebx+000004A4], 01 이라는 어셈블리 명령어의 두 번째 오퍼랜드 01을 0x01로 1바이트 값이 아닌 0x00000001로 4바이트 값으로 번역하는 것이다. 치트엔진은 튜토리얼이 32비트 프로그램이므로 당연히 4바이트 값을 사용했을것이라 생각하는것 같다. 어쨌든 원래 코드로 복구시키지 못하므로 버그라고 봐야 할거같다.

 

 

해결 방법은 간단하다.

위 그림처럼 sub dword ptr [ebx+000004a4], 01 코드를 주석처리하고 그 아래 db 83 AB A4 04 00 00 01을 주석 해제한다. 어셈블리어로 작성한 코드를 기계어로 번역하지 않고 원래 있던 기계어를 다시 그대로 바이트 단위로 정의(db: define byte)하는 것이다.

 

아니면 위 그림처럼 dword(4바이트)를 byte(1바이트)로 바꿔도 된다.

 

r/m8, imm8 오퍼랜드를 사용하는 80 옵코드로 복구되지만 기계어로 번역된 결과의 길이가 같아 다른 명령어를 침범하지 않고 실행에도 문제가 없다.

 

반응형
Posted by J-sean
:
반응형

C# 코드를 난독화 해 보자.

 

Tools - NuGet Package Manager - Manage NuGet Packages for Solution... 선택

 

Browse에서 Obfuscar 검색 후 설치

 

Project - XXX Properties 선택

 

Build Events - Post-build event command line: 에 위와같이 작성한다.

"$(Obfuscar)" obfuscar.xml

 

 

Hello World!를 출력하는 소스를 입력한다.

 

Output 폴더에 obfuscar.xml 파일을 만들고 아래와 같이 작성한다.

 

간단한 obfuscar.xml 파일 내용

더 많은 세팅값은 아래 링크에서 확인할 수 있다.

Configuration

 

프로젝트를 빌드하면 난독화 되지 않은 실행파일과 함께 Obfuscator_Output 폴더가 생성된다.

 

 

Obfuscator_Output 폴더에는 난독화된 실행파일이 생성된다.

 

반응형
Posted by J-sean
:
반응형

리눅스(우분투)에 설치된 비주얼 스튜디오에서 파이썬을 프로그래밍해보자.


pip가 설치되지 않았다면 설치한다.


폴더를 만들어 준다.


폴더내에 파이썬 소스를 작성할 파일을 만든다. 확장자는 .py로 한다.


Python extension을 설치한다.



Linter pylint가 설치되지 않았다는 메세지가 나온다. Install 한다.


소스를 입력하고 Ctrl+F5키를 누르면 실행된다.

Run - Run Without Debugging을 선택해도 된다.


반응형
Posted by J-sean
:
반응형

리눅스(우분투)에서 비주얼 스튜디오 코드를 설치하고 코딩해 보자.


비주얼 스튜디오 홈페이지에 접속하고 Debian, Ubuntu용 .deb을 선택한다.


설치파일을 다운로드한다.


다운로드한 설치파일을 실행한다.


Install을 선택한다.



설치는 간단히 끝난다.


build-essential을 설치한다.


설치된 Visual Studio Code를 실행한다.


Welcome 화면이 나타난다.



File - Open Folder... 를 선택한다.


원하는 폴더를 만들고 선택한다.


EXPLORER - 위에서 만든 폴더에서 New File을 선택한다.


원하는 파일이름을 지정한다. C++ 프로그램을 만들기 위해 확장자는 .cpp로 지정한다.



Extensions에서 c/c++를 설치한다.


간단한 C++ 코드를 입력한다.


Terminal - Configure Default Build Task...를 선택한다.


C/C++: g++ build active file을 선택한다.



Terminal - Run Build Task...를 선택한다.


빌드가 진행된다.


위에서 만든 폴더로 가면 빌드된 파일이 있다. 실행해 본다.


task를 변경하고 싶다면 아래 예처럼 tasks.json 파일을 변경한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
    "version""2.0.0",
    "runner""terminal",
    "type""shell",
    "echoCommand"true,
    "presentation": {
        "reveal""always"
    },
    "tasks": [
        // C++
        {
            "label""save and compile for C++",
            "command""g++",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group""build",
            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp""^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file"1,
                    "line"2,
                    "column"3,
                    "severity"4,
                    "message"5
                }
            }
        },
        // C
        {
            "label""save and compile for C",
            "command""gcc",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group""build",
            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp""^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file"1,
                    "line"2,
                    "column"3,
                    "severity"4,
                    "message"5
                }
            }
        },
        {
            "label""execute",
            "command""cd ${fileDirname} && ./${fileBasenameNoExtension}",
            "group""test"
        }
    ]
}


tasks.json 예제


필요하다면 File -Preferences - Keyboard Shortcuts 에서 새로만든 task의 단축키를 지정할 수 있다.


Open Keyboard Shortcuts (JSON) 아이콘을 클릭한다.


아래 예처럼 keybindings.json 파일을 수정한다.



1
2
3
4
5
6
7
[
    // Compile
    { "key""ctrl+shift+1""command""workbench.action.tasks.build" },
 
    // Execute
    { "key""ctrl+shift+2""command""workbench.action.tasks.test" }
]


keybidings.json 예제


반응형
Posted by J-sean
:
반응형

It shows how to detect and decode a QR Code.

OpenCV에서 QR코드를 감지하고 내용을 확인할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <Windows.h>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
    VideoCapture cap(0);
 
    if (!cap.isOpened()) {
        cerr << "Camera open failed." << endl;
 
        return -1;
    }
 
    QRCodeDetector detector;
 
    Mat frame;
    vector<Point> points;
    String msg;
 
    while (true) {
        cap >> frame;
 
        if (frame.empty()) {
            cerr << "Empty frame." << endl;
 
            break;
        }
 
        msg = detector.detectAndDecode(frame, points); // Both detects and decodes QR code.
 
        if (!msg.empty()) {
            polylines(frame, points, true, Scalar(00255), 2);
            putText(frame, msg, Point(1030), FONT_HERSHEY_PLAIN, 2, Scalar(00255), 2);
 
            if (msg.substr(04== "http") {
                imshow("QR Code", frame);
 
                if (MessageBox(NULL, (msg + " is a website address.\nDo you want to visit?").c_str(), "QR Code", MB_YESNO) == IDYES) {
                    ShellExecute(NULL"open", msg.c_str(), NULLNULL, SW_SHOW);
                    // Performs an operation on a specified file.
                }
                else {
                    continue;
                }
            }
        }
        else {
            putText(frame, "No QR code detected", Point(1030), FONT_HERSHEY_PLAIN, 2, Scalar(00255), 2);
        }
 
        imshow("QR Code", frame);
 
        if (waitKey(10== 27)
            break;
    }
 
    return 0;
}



Run the program. It says 'No QR code detected' at first.


QR code with a message.


QR code with a website address.


If the first 4 letters of the message are 'http', it opens the website with the default web browser.



반응형
Posted by J-sean
: