반응형

Cheat Engine(CE)으로 포인터의 포인터를 찾아 보자.

 

CE을 실행하고 Help - Cheat Engine Tutorial 을 실행 한다.

 

Cheat Engine에서 Tutorial을 열어 준다.

 

Edit - Settings를 클릭하고 Cheat Engine settings 창이 열리면 Pointer adding: Append pointerline instead of insert를 체크 한다.

 

Tutorial에서 찾아야 하는 값인 3045를 First Scan 으로 찾아서 Address List에 추가 한다.

 

 

Address List에 추가된 주소는 첫 번째 포인터가 가리키는 주소와 그 주소에 저장된 값이다. 4 단계에 걸친 포인터를 모두 찾아 주어야 한다. 추가된 목록에서 우클릭 - Find out what accesses this address(F5)를 클릭 한다.

 

열려 있는 프로세스에 Cheat Engine의 debugger를 attach 한다는 메세지 박스가 나온다.

 

Yes 를 클릭하면 아래와 같은 창이 뜬다.

 

Tutorial 로 돌아와 Change value 버튼을 클릭 한다.

 

 

 

Find out what accesses this address 로 지정한 주소에 접근하는 opcode가 표시 된다.

 

More information 버튼을 클릭하면 추가 정보가 표시 된다. 내용을 확인해 보면 eax에 저장된 값을 rsi+18에 복사하고 있다.

rsi의 주소는 01587460이고 여기에 offset 값 18을 더하면 01587478로 위에서 CE으로 찾은 주소의 값과 일치 한다.

 

CE에서 Hex 체크 박스를 클릭하고 rsi 주소값을 입력한 다음 New Scan을 클릭하고 First Scan 한다. 아래와 같이 rsi 주소 값을 가지는 메모리의 주소(첫 번째 포인터)를 찾았다. 이 상태에서 Add Address Manually 버튼을 클릭 한다.

 

Add address 창이 뜨면 Pointer 체크 박스를 클릭 하고 위에서 찾은 메모리 주소를 입력한다. offset 값으로 18을 입력 하면 최종 값인 3559가 표시 된다.

 

 

OK를 클릭하면 CE에 아래와 같이 표시 된다.

 

이제 이 포인터의 포인터를 찾아 보자. 추가한 포인터에서 F5를 눌러 Find out what accesses this address를 실행하면 아래와 같은 메세지가 나온다.

Find out what accesses this pointer를 클릭한다.

 

Tutorial로 돌아가 Change value 버튼을 클릭하면 아래와 같이 포인터에 접근하는 opcode 목록을 표시해 준다. 첫 번째 opcode의 operand 인 rsi 값을 확인해 보면 07312500으로 위에서 찾은 포인터의 주소와 일치 한다.

 

rsi 값을 가지는 주소(포인터)를 찾아 보자. 015661E8에 같은 값이 저장되어 있는걸 확인 할 수 있다.

 

 

리스트에 추가된 포인터를 더블 클릭하고 Add Offset 버튼을 클릭하면 아래와 같은 화면으로 바뀐다.

 

하단 주소 입력 에디트 박스에 포인터 주소값을 입력해 주면 아래와 같이 표시된다. OK 버튼을 클릭한다.

 

별 다른 변화는 없어 보이지만 포인터의 포인터까지 찾아 놓은 상태이다.

 

다시 그 포인터의 포인터를 찾는 과정을 반복하면 아래와 같이 더 이상 포인터로 지시되지 않는 녹색 주소값이 나온다. (CE 에서는 static address가 녹색으로 표시 된다)

 

 

이 마지막 포인터를 추가해 준다.

 

마지막 포인터까지 추가되었으면 Active 체크 박스를 클릭해서 값을 고정 시키고 Value를 5000으로 수정 한다.

 

 

Tutorial로 돌아가 Change pointer버튼을 클릭하면 3초 후 Next 버튼이 활성화 된다. a pointer to a pointer to a pointer to a pointer to the health 값을 찾은 것이다.

 

 

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

x64dbg에서 패치한 파일은 아래와 같이 ollydbg와는 다른 방식으로 저장한다.

 

필요한 부분을 패치 한다. 아래 예에서는 4바이트를 패치 했다.

 

File - Patch file... 을 클릭 한다.

 

패치된 4바이트가 표시 된다. Patch File 버튼을 클릭 한다.

 

원하는 이름을 입력하고 저장 버튼을 클릭 한다.

 

 

패치가 적용되었다는 메세지 박스가 나타난다.

 

지정된 폴더에 패치된 파일이 생성되어 있다.

 

 

 

 

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

2021.09.25 - [C, C++] - Qt6 설치 및 간단한 사용법

 

Qt의 Pixmap을 이용해 간단한 스프라이트 애니매이션을 구현 할 수 있다.

 

아래와 같은 스프라이트 이미지를 준비 한다. 

horse.zip
다운로드

이 중 처음 11개의 달리는 이미지 프레임만 사용한다.

 

 

Qt Widgets Application으로 기본 설정들을 적용해서 프로젝트를 만든다. (D:\Horse)

 

 

프로젝트를 만든 후 바로 build 디렉토리가 만들어지지 않으므로 build를 한 번 진행 한다.

 

build 디렉토리에 준비한 스프라이트 이미지를 복사한다.

 

mainwindow.h 에 아래와 같이 추가 한다.

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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QTimer>
#include <QPainter>
#include <QDebug>
 
namespace Ui {
class MainWindow;
}
 
class Sprite
{
public:
    Sprite(QSize winsize);
    void Draw(QPainter* painter);   // 현재 프레임 그리기
    void NextFrame();   // 다음 프레임 지정
 
private:
    QPixmap* SpriteImage;   // 스프라이트
    int CurrentFrame;   // 현재 프레임
    int TotalFrame; // 전체 프레임 수(11)
    int Column; // 스프라이트내 프레임 열(4)
    int Row;    // 스프라이트내 프레임 행(3) (실제 사용되지는 않음)
    int FramesizeX; // 한 프레임의 X 길이(128)
    int FramesizeY; // 한 프레임의 Y 길이(128)
    QPoint FramePosition;   // 스프라이트내 현재 프레임의 픽셀 단위 위치
    QPoint DrawPosition;    // 윈도우에서 프레임이 그려질 위치
    QSize MainWindowSize;   // 윈도우 사이즈
};
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
    virtual void paintEvent(QPaintEvent* event);
 
private:
    Ui::MainWindow *ui;
 
    Sprite* sprite; // 스프라이트
    QTimer* timer;  // 타이머
};
 
#endif // MAINWINDOW_H
cs

 

 

mainwindow.cpp 에 아래와 같이 추가 한다.

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
67
68
69
70
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    sprite = new Sprite(this->size());
    timer = new QTimer(this);
    timer->start(50);   // 20Hz 타이머 시작
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));    // timeout() 시그널이 발생하면 update() 실행
    // connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
    // Creates a connection of the given type from the signal in the sender object to the method in the receiver object.
    // Returns a handle to the connection that can be used to disconnect it later. You must use the SIGNAL() and SLOT() macros
    // when specifying the signal and the method.
}
 
MainWindow::~MainWindow()
{
    delete timer;
    delete sprite;
 
    delete ui;
}
 
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter paint(this);   // The QPainter class performs low-level painting on widgets and other paint devices.
    sprite->Draw(&paint);
    sprite->NextFrame();
}
 
// 128X128 사이즈, 4X3배열의 11개 프레임
Sprite::Sprite(QSize winsize) : CurrentFrame(0), TotalFrame(11), Column(4), Row(3), FramesizeX(128), FramesizeY(128), FramePosition(00)
{
    MainWindowSize = winsize;   // 메인 윈도우 사이즈
    qDebug() << "Main Window Size: " << MainWindowSize << endl// Application Output 창에 메인 윈도우 사이즈(400X300) 출력
    SpriteImage = new QPixmap("horse.png"); //The QPixmap class is an off-screen image representation that can be used as a paint device.
    qDebug() << "Sprite Size: " << SpriteImage->size() << endl;    // Application Output 창에 스프라이트 사이즈(512X1024) 출력
 
    // 메인 윈도우 중앙에 프레임 출력
    DrawPosition.setX(MainWindowSize.width() / 2 - FramesizeX / 2);
    DrawPosition.setY(MainWindowSize.height() / 2 - FramesizeY / 2);
}
 
void Sprite::Draw(QPainter* painter)
{
    // Draws a pixmap at (x, y) by copying a part of the given pixmap into the paint device.
    painter->drawPixmap(DrawPosition.x(), DrawPosition.y(), *SpriteImage, FramePosition.x(), FramePosition.y(), FramesizeX, FramesizeY);
 
    // 'Running horse' 문자열 출력
    const QRect rect = QRect(00, MainWindowSize.width(), MainWindowSize.height() / 2);
    painter->setPen(Qt::blue);
    painter->setFont(QFont("Arial"30));
    painter->drawText(rect, Qt::AlignCenter, "Running horse");
}
 
void Sprite::NextFrame()
{
    if (CurrentFrame >= TotalFrame) // 11번 째 프레임을 넘어가면 0으로 초기화
        CurrentFrame = 0;
 
    // 출력할 프레임의 픽셀 단위 위치 지정
    FramePosition.setX((CurrentFrame % Column) * FramesizeX);
    FramePosition.setY((CurrentFrame / Column) * FramesizeY);
 
    CurrentFrame++;
}
cs

 

프로젝트를 build하고 실행하면 아래와 같은 애니매이션이 재생된다.

 

Application Output 창에는 Main Window와 Sprite 사이즈가 표시 된다.

 

iCCP 관련 warning은 무시하거나 이 링크를 참고해서 제거한다.

 

 

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

x64dbg를 설치하고 실행해 보면 아래와 같이 밝은 배경으로 표시 된다.

 

아래 링크에서 원하는 Color Scheme을 다운 받고 압축을 풀어 주자. (

mostlyblack.ini
다운로드

)

x64dbg Color Schemes

 

Options - Import settings... 를 선택 한다.

 

다운 받은 Color Scheme 파일을 선택해 준다.

 

선택한 Color Scheme이 바로 적용 된다.

 

 

파일을 열어 보면 아래와 같이 표시 된다.

 

 

 

반응형

'Reverse Engineering' 카테고리의 다른 글

Cheat Engine으로 Multilevel pointers 찾기  (0) 2019.03.20
x64dbg 패치한 파일 저장하기  (0) 2019.03.05
Cheat Engine으로 Pointer 찾기  (2) 2019.02.13
Back to user mode  (4) 2019.02.10
Windows 10에서 *.hlp 파일 열기  (10) 2019.02.05
Posted by J-sean
:
반응형

※ 참고: 포인터 스캐너 사용법

 

Cheat Engine으로 간단하게 Pointer를 찾을 수 있다.

 

Cheat Engine에서 Tutorial 프로세스를 열어 준다. Value를 변경해 가며 정확한 Address를 찾는다.

 

찾은 Address에서 오른쪽 클릭 하고 'Find out what accesses this address'를 클릭한다.

 

Cheat Engine에 debugger를 붙여 준다.

 

 

아래와 같은 창이 뜬다.

 

Tutorial로 돌아가 Change value 버튼을 클릭해 값을 변경 하면 018F3D30 주소에 접근한 opcode들이 표시 된다. 그 중 두 번째 opcode가 018F3D30 위치의 값을 바꾼다는 것을 알 수 있다. (아래 창에서 << 표시된 opcode) More information을 클릭하면 약간의 추가 정보가 표시 된다.

 

Cheat Engine에서 value가 저장된 Address인 018F3D30을 다시 Hex scan 한다.

 

018F3D30이 저장된 Address가 Pointer의 Address 이다. Add Address Manually 버튼을 클릭한다.

 

 

Pointer를 체크한다.

 

Pointer의 Address를 입력한다. offset 값은 없으므로 0으로 둔다.

 

Value가 저장된 위치를 가리키는 Pointer가 추가 된다.

 

Value를 5000으로 수정하고 Active를 체크한다. (Value가 5000으로 고정 된다)

 

 

Tutorial에서 Change value 버튼을 클릭하면 Value가 바뀌지만 메모리 상에서는 다시 5000으로 돌아간다. Change pointer 버튼을 클릭하면 Pointer가 가리키는 주소(Value 값이 저장된 주소)가 바뀌고 Cheat Engine 에서 찾아 놓은 Pointer 가 가리키는 주소값도 똑같이 바뀐다. Next 버튼이 활성화 되고 Pointer를 찾았음을 확인 할 수 있다.

 

 

이번에는 아래와 같은 코드로 프로그램을 만들어서 정확히 확인해 보자. 

 

Pointer.exe
다운로드

 

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
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    int* p = new int;
    *= 100;
    int choice;
 
    cout << "Value(*p): " << *<< endl;
    cout << "Pointer value(p): " << p << endl << endl;
    cout << "1: Change value\n2: Change pointer value\nChoose: ";
 
    while (cin >> choice)
    {
        switch (choice)
        {
        case 1:
            (*p)++;
            cout << endl << "Value(*p): " << *<< endl;
            cout << "Pointer value(p): " << p << endl << endl;
            break;
        case 2:
            p = new int;
            *= 100;
            cout << endl << "Value(*p): " << *<< endl;
            cout << "Pointer value(p): " << p << endl << endl;
            break;
 
        default:
            break;
        }
 
        cout << "1: Change value\n2: Change pointer value\nChoose: ";
    }
 
    delete p;
 
    return 0;
}
cs

 

프로그램을 실행 시키면 포인터에 저장된 주소(p)와 그 주소에 저장된 값(*p)이 표시 된다.

아래와 같이 1을 선택하면 값을 1 증가 시키고 2를 선택하면 포인터에 저장된 주소를 다시 할당 한다.

 

프로그램을 다시 실행하고 Cheat Engine으로 Value를 변경해 가며 주소를 찾는다.

 

 

 

프로그램에서 주소값을 표시해 주므로 Cheat Engine에서 찾은 주소가 맞는지 쉽게 확인 된다.

마찬가지로 Find out what accesses this address 로 어떤 코드가 이 주소에 접근하는지 확인해 보자.

 

 

More informatioin의 내용도 확인해 보자.

 

Value의 주소값을 Hex Scan으로 검색한다. 아래와 같이 두 개의 주소가 확인 되었다.

 

 

프로그램에서 2번을 선택해 Pointer가 가리키는 주소를 변경해 보자.

 

00F3F764에 저장된 값이 프로그램과 동일하게 변경되는걸 확인 할 수 있다. 00F3F764가 포인터의 주소이다.

 

Add Address Manually로 Pointer를 추가해 준다.

 

 

 

프로그램에서 Value와 Pointer value를 변경하면 Cheat Engine에 찾아 놓은 포인터에도 똑같이 적용되는걸 확인 할 수 있다.

 

 

 

반응형

'Reverse Engineering' 카테고리의 다른 글

x64dbg 패치한 파일 저장하기  (0) 2019.03.05
x64dbg Color Scheme 바꾸기  (0) 2019.02.19
Back to user mode  (4) 2019.02.10
Windows 10에서 *.hlp 파일 열기  (10) 2019.02.05
IDA Pro Skin 바꾸기  (1) 2019.02.04
Posted by J-sean
:

Back to user mode

Reverse Engineering 2019. 2. 10. 22:21 |
반응형

프로세서가 kernel mode에서 user mode로 변경되는 시점을 간단히 찾을 수 있다. (User mode and kernel mode)

 

 

 

예를 들어 Message box가 종료되는 지점을 찾아 보자. ollydbg에서 분석할 프로그램을 열어 준다.

 

RegisterMe.zip
0.00MB

(password: lena)

 

 

F9를 눌러 실행 한다.

 

아래와 같은 Message box가 나타난다.

 

F12를 눌러 정시 시킨다.

 

 

아래와 같은 곳으로 이동 된다.

 

Alt + F9를 눌러 back to user mode를 실행 한다.

 

오른쪽 아래에 Till user가 표시 된다.

 

'Register Me' 메세지 박스에서 '확인'을 클릭하면 아래와 같이 MessageBoxA CALL 이 종료되는 시점에서 정지 된다.

 

 

이번엔 scanf 가 종료되는 지점을 찾아 보자. 아래와 같은 소스로 실행 파일을 만들어 준다. (

FindMe.zip
다운로드

)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int i;
 
    printf("Enter a number: ");
    scanf_s("%d"&i);
    printf("Number: %d", i);
 
    return 0;
}
cs

 

ollydbg(v.2.01)로 열어 준다.

 

F9를 눌러 실행 한다.

 

아래와 같이 숫자를 입력하는 콘솔창이 뜬다.

 

 

다시 ollydbg로 돌아와 F12를 눌러 정지 시킨다. 하지만 여기서는 Paused 상태가 되지 않고 Pausing 상태가 된다.

 

콘솔창에서 숫자를 입력 한다.

 

숫자를 입력하면 아래와 같은 주소로 이동하고 정지 상태가 된다.

 

F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.

 

 

같은 파일을 x32dbg로 열어 보자.

 

F9를 눌러 진행 한다.

 

한번 더 F9를 눌러 진행하면 아래와 같이 Running 상태가 된다.

 

숫자를 입력하라는 콘솔창이 뜬다.

 

 

x32dbg로 돌아가 Threads 창을 열어 준다.

 

Title Bar에는 Main Thread가 선택되어 있는 것 처럼 표시 되지만 Main Thread가 아닌 2번 thread가 활성화 되어 있다. 이 상태에서는 break point가 제대로 작동하지 않는다. Main Thread를 활성화 해 준다.

 

아래와 같은 주소로 이동 된다. F12를 눌러 Pause 한 후(F12를 한 번 누르면 화면에는 아무것 도 표시되지 않는다. 두 번 누르면 Error setting breakpoint at XXXXXXXX! (SetBPX) 가 표시 되지만 무시하자) 콘솔창에서 숫자를 입력한다.

 

숫자를 입력하고 나면 아래와 같이 Paused 상태가 된다.

 

 

F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.

 

스크롤을 조금 올려 보면 프로그램의 전체적인 내용을 파악 할 수 있다. pdb파일이 같이 있기 때문에 소스 라인까지 표시 된다.

 

 

반응형

'Reverse Engineering' 카테고리의 다른 글

x64dbg Color Scheme 바꾸기  (0) 2019.02.19
Cheat Engine으로 Pointer 찾기  (2) 2019.02.13
Windows 10에서 *.hlp 파일 열기  (10) 2019.02.05
IDA Pro Skin 바꾸기  (1) 2019.02.04
ollydbg Jump 위치 표시  (2) 2019.02.02
Posted by J-sean
:
반응형

ollydbg 에서 많이 사용하는 win32.hlp는 Windows 3.0 부터 XP까지 지원하는 도움말 파일 형식(*.hlp) 이다.

도움말 탐색기(winhlp.exe)로 열 수 있는 이 형식은 XP 이후로는 공식 업데이트를 이용해 사용 가능하지만 Windows 10 부터는 공식 지원이 되지 않고 있다.


Windows 10에서 *.hlp 파일을 실행 하면 아래와 같이 MS Windows 도움말 홈페이지가 연결 된다.


다음과 같은 방법으로 Windows 10에서도 *.hlp 파일을 열어 볼 수 있다.


적당한 폴더를 만들고 아래 파일 중 사용 중인 윈도우에 맞는 버전을 다운 받아서 압축을 풀어 준다.

winhlp32_WinXP_x86.zip

winhlp32_WinXP_x64.zip


같은 폴더에 아래 파일을 다운 받는다.

Windows10_hlp_fix.cmd


파일 내용:

@echo off

set crtpth=%CD%

takeown /f "%windir%\winhlp32.exe" >nul

icacls "%windir%\winhlp32.exe" /grant *S-1-5-32-544:F >nul

copy /y "%crtpth%\winhlp32.exe" %windir%

icacls "%windir%\winhlp32.exe" /setowner "NT Service\TrustedInstaller" >nul

echo.

echo Done.

echo.

echo Press any key to Exit

pause >nul

exit




명령 프롬프트를 관리자 권한으로 실행하고 다운 받은 폴더가 위치한 곳으로 이동한다.


Windows10_hlp_fix.cmd 파일을 실행 한다.


이제 *.hlp 파일을 열어 보면 잘 열린다.



반응형

'Reverse Engineering' 카테고리의 다른 글

x64dbg Color Scheme 바꾸기  (0) 2019.02.19
Cheat Engine으로 Pointer 찾기  (2) 2019.02.13
Back to user mode  (4) 2019.02.10
IDA Pro Skin 바꾸기  (1) 2019.02.04
ollydbg Jump 위치 표시  (2) 2019.02.02
Posted by J-sean
:
반응형

IDA Pro를 설치하고 파일을 disassembling 해 보면 밝은 스킨이 적용된 화면이 나타난다.

 

 

어두운 스킨 적용을 위해 아래 링크에서 파일을 다운 받는다. (

IDASkins-master.zip
다운로드

이 파일을 받아도 된다)

https://github.com/zyantific/IDASkins

 

다운 받아서 압축을 풀고 plugins 폴더를 확인해 보면 아래와 같은 폴더와 파일이 있다.

 

IDA Pro가 설치된 폴더 - plugins 폴더에 모두 복사한다. (idaskins.py는 그림에 표시되지 않았다)

 

IDA Pro를 실행시키고 Edit - Plugins - IDASkins: Settings를 선택한다. (Ctrl + Shift + S)

 

 

Theme selection 에서 IDASkins dark를 선택한다.

 

Options - Colors... 를 선택 한다.

 

Import 를 선택하고 plugins\idaskins\themes\idaskins-dark\ida-consonance.clr 을 선택한다.

 

원하는 파일을 disassembling 해 보면 아래와 같은 skin이 적용되어 표시 된다.

 

 

반응형

'Reverse Engineering' 카테고리의 다른 글

x64dbg Color Scheme 바꾸기  (0) 2019.02.19
Cheat Engine으로 Pointer 찾기  (2) 2019.02.13
Back to user mode  (4) 2019.02.10
Windows 10에서 *.hlp 파일 열기  (10) 2019.02.05
ollydbg Jump 위치 표시  (2) 2019.02.02
Posted by J-sean
: