728x90

Hooking을 이용한 Resize 원리

  1. MoveWindow()를 이용하여 Game Main Window의 크기를 변경해준다.

  2. SwapChain의 BackBuffer들의 크기를 변경해준다.

  3. RenderTarget의 크기를 변경해준다.

  4. DepthStencilBuffer의 크기를 변경해준다.

 

 

 

728x90

'Basic Programming > Hooking' 카테고리의 다른 글

Hooking - 안티 디버깅 방안  (0) 2023.04.07
Hooking - mhook-lib  (0) 2020.04.29
Hooking - API Hooking의 종류  (0) 2020.03.31
728x90

이건 대학생때 정보보호학과 수업에서 과제로 했던건데... 살다보니 쓸일이 생기네 ㄷㄷ

 

아래 코드에서

s.seed는 난수생성을 위한 seed 값

s.length는 생성할 난수의 갯수

X, Y, Z는 마음대로 지정하면 되는 값이다.

 

이 함수를 이용한다면 난수가 균등하게 0~255의 값 사이로 만들어진다.

동일한 seed 를 사용한다면 동일한 난수가 생성이 된다.

물론 seed와 x,y,z를 time을 이용하여 마음대로 넣는다면... 예측이 불가능한 값이 될 것이다.

 

728x90
728x90

1. browser를 이용한 실행 방법

- steam:://run/appid

- 이방법을 이용하면 steam 옵션을 적용할 수 없다.

https://developer.valvesoftware.com/wiki/Steam_browser_protocol

 

Steam browser protocol - Valve Developer Community

There are numerous system-wide commands available that interact with Steam. All of them open up Steam if it is not open. They can either be typed into a command box (Start-> Run) or through your browser's address bar (you can normally create links to them

developer.valvesoftware.com

 

2. steam.exe를 이용하는 방법

- start /d "(installPath)" /b steam.exe -applaunch (appId) -nolauncher

- 이방법을 이용하는 이유는 -nolauncher와 같은 steam 옵션을 적용할 수 있다.

(installPath) == steam의 설치 경로

(appId) == steam game의 id

 

3. steam 옵션

https://developer.valvesoftware.com/wiki/Command_Line_Options

 

Command Line Options - Valve Developer Community

Source Games These command-line parameters will work with any Source engine games (Half-Life 2, Counter-strike: Source, etc.). Note:Command parameters are described inside the < and > characters. Syntax: hl2.exe Usage These options can be used with: Hammer

developer.valvesoftware.com

 

4. steam installPath 가져오는 방법

line 148 : window registry에서 steam의 설치 경로를 가져온다.

line 151 : 기본 설치 경로를 queue에 추가.

line 153 ~ 157 : 기본 설치 경로 외에 추가적인 설치 경로를 queue에 추가.

 

5. steam game의 appid 가져오는 방법

- 아래와 같이 steamapps 폴더에 .acf 파일이 있는데 이 파일이 valve에서 만든 포맷으로 안에 게임의 appid, title name 등이 전부 있다.

 

acf_parser를 이용하여 acf 파일 데이터를 읽어오면 된다.

https://stackoverflow.com/questions/39065573/reading-values-from-an-acf-manifest-file

 

Reading values from an .acf / manifest file

The file I'm trying to read is presented in the format below. How using c# can I read this file to extract property values? Are there any libraries I can leverage? "AppState" { "appid" "244210" "

stackoverflow.com

 

대충 위와같이 AcfReader를 이용하여 파일들을 parsing하고 ACFFileToStruct()를 이용하여 struct로 넣어주면 된다.

 

 

728x90

'Basic Programming > C#' 카테고리의 다른 글

C# - 작업 스케줄러에 등록하기  (0) 2021.12.10
C# - Dispose  (0) 2018.10.12
C# - WeakReference  (0) 2018.10.11
C# - 공부하기 좋은 사이트  (0) 2018.09.05
C# - Attibute  (0) 2018.07.09
728x90

이번 내용은 MMF(Memory Mapped File) 을 이용한 프로세스간의 메모리 공유입니다.
 
일전에 설명드렸다시피(링크) Win32 이상의 환경에서는
 
프로세스의 주소공간은 독립적으로 관리되기 때문에
 
어떤 하나의 프로세스는 다른 프로세스의 주소공간을 공유할 수 없습니다.
 
A라는 프로세스의 0x1234라는 주소값은 B라는 프로세스의 0x1234와는 전혀 다른 공간입니다.
 
이런 메모리 관리 구조는 OS를 안정적이고 견고하게 만들어주었지만
 
한편으로는 프로그램 사이에 정보를 주고 받기가 어렵게 되어버렸습니다.
 
프로세스 사이에 정보를 공유하기 위해서 MMF라는 방식을 사용합니다.
 
MMF는 이름 그대로 파일을 메모리에 맵핑하기 위해서 사용되는 기법입니다.
 
간단하게 설명하자면, 파일을 열어서 해당 파일을 메모리에 맵핑시켜서 사용하는 것입니다.
 
MMF를 이용해서 하드디스크의 파일을 프로세스의 주소 공간에 연결해서 사용이 가능합니다.
 
하지만 여기서는 파일을 여는 것이 아닌 프로세스가 서로 접근할 수 있는 메모리의 공유 영역을
 
생성하기 위해서 사용하겠습니다.
 
File Mapping object는 Named kernel object로 생성되면 모든 프로세스에 영향을 줍니다.
 
뮤텍스와 유사한데 한 쪽 프로세스에서 뮤텍스를 생성하면 모든 프로세스에 영향을 주듯이
 
이것도 같은 이름의 File Mapping object는 어느 프로세스나 사용이 가능합니다.
 
전에 커널 영역은 접근이 불가능하다고 했는데,
 
Windows가 제공하는 함수들을 이용해서 정해진 방법으로
 
커널 오브젝트에 접근이 가능합니다.
 
그럼 예제를 먼저 보도록 하겠습니다.
 
일단 A 프로세스의 코드입니다.

 

그리고 B 프로세스의 코드입니다.

 

중요한 WndProc과 정의 부분만 캡쳐해서 올립니다.

 

일단 A 프로세스에서는 WM_CREATE부분에서 버튼 하나를 만들어주고

 

CreateFileMapping 함수를 이용해서 메모리 영역을 맵핑시키는데 중요한 것은

 

맨 처음 인자를 INVALID_HANDLE_VALUE(0xFFFFFFFF)로 주는 것이 핵심입니다.

 

일반적인 상황이라면 CreateFile에서 반환되는 핸들을 넣지만 여기서는 저 값을 넣어줍니다.

 

그리고 MapViewOfFile 함수를 이용해서 파일(여기서는 메모리의 일정 부분)의 뷰를

 

주소 공간에 맵핑시킵니다.

 

그럼 모든 준비는 끝나고 마우스로 버튼을 클릭하게 되면

 

MapViewOfFile 함수가 리턴하는 포인터에 문자열을 입력합니다.

 

_T("Message from ProcA")라는 문자열이 포인터가 가리키는 메모리 영역에 저장이 될 것입니다.

 

그리고 ProcB의 핸들(Window Handle)을 찾아서 거기에 메시지를 날립니다.

 

B에서 A가 기록한 문자열을 읽게 하기 위해서죠.

 

B 프로세스는 CreateFileMapping 대신에 OpenFileMapping을 사용하고 있습니다.

 

이미 생성된 object를 단순하게 열기만 할 경우에는 Open류의 함수를 이용하시면 됩니다.

 

WM_SHAREDMEMORY 메시지가 들어오면 B 프로세스 또한 MapViewOfFile 가 리턴한

 

포인터를 이용해서 해당 메모리 부분을 읽습니다.

 

일반적으로 A의 주소 공간과 B의 주소 공간은 완전히 격리되어있어서

 

A의 주소 공간을 B는 절대 볼 수 없지만 Name kernel object를 이용해서 공유가 가능해졌습니다.

 

그리고 종료시킬 때에는 시작시의 역순으로 UnmapViewOfFile 함수를 호출하고

 

CloseHandle로 열려진 핸들을 닫는 것으로 끝이 납니다.

 

어려운 것 같지만 차근차근 읽어보면 전혀 어렵지 않습니다.

 

Windows가 프로세스의 주소 공간을 실제 가상 메모리(실제 메모리)에 맵핑시켜주는데

 

이름을 갖는 커널 오브젝트가 같은 실제 가상 메모리에 연결되는 점을 이용해서

 

어디에서나 같은 가상 메모리를 가리키게 처리해주고 그걸 그냥 읽고 쓰기만 하는겁니다.

 

간단하게 보자면 A 프로세스가 파일에 기록을 하고 메시지를 날리면

 

B는 파일의 내용을 읽는 것으로도 프로세스간 데이터의 공유는 가능합니다.

 

하지만 그것은 조금 비효율적일 수 있기 때문에 위와 같은 방법을 이용해서 공유를 하는것이죠.

 

이것으로 MMF를 이용한 프로세스간 메모리 공유를 마치겠습니다.

 

 

출처 : http://psychoria.blog.me/40113892474 

728x90
728x90

mhook-lib는 windows api hook library이고 open source이다.

 

이번에 이걸 이용해봤는데 쓸만함.

 

https://github.com/martona/mhook

 

martona/mhook

A Windows API hooking library. Contribute to martona/mhook development by creating an account on GitHub.

github.com

http://codefromthe70s.org/mhook.aspx

728x90

'Basic Programming > Hooking' 카테고리의 다른 글

Hooking - 안티 디버깅 방안  (0) 2023.04.07
Hooking - Game Resize  (0) 2020.10.23
Hooking - API Hooking의 종류  (0) 2020.03.31
728x90

API Hooking은 크게 유저모드와 커널모드 두가지로 나뉜다.

 

 

User-Mode Hooking
 

  • IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에 다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.

  • Inline Function Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는 코드로 바꾸고 자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다 지능적이여서 찾아내기가 쉽지 않다. 요새 많이 등장한다.

 

Kernel-Mode Hooking (루트킷)
 

  • SSDT(System Service Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고 그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은 프로세스, 파일의 은폐에 많이 사용됨.

  • DKOM(Direct Kernel Object Modification): 커널 Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스, 포트, 드라이버 및 핸들의 Entry 를 실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.

  • SYSENTER: 유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데 호출후 시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여 해당 값을 수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.

  • Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써 다른 어떤 안티바이러스 제품보다 먼저 실행된다.

  • Runtime Detour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써 커널 함수들을 후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를 자신을 가리키는 주소로 써줌으로써 후킹목적을 달성한다.

  • IRP table Modification: 디바이스 드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets을 제어하는 Dispatch Routine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은 IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT 의 위치를 선정해줄수 있다. 즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여 Call 결과를 조
    작한다.



출처: https://ajlab.tistory.com/entry/Hooking의-종류?category=395542 [AJLab - Since 2012.1.20]

728x90

'Basic Programming > Hooking' 카테고리의 다른 글

Hooking - 안티 디버깅 방안  (0) 2023.04.07
Hooking - Game Resize  (0) 2020.10.23
Hooking - mhook-lib  (0) 2020.04.29
728x90

std::chrono를 이용하여 원하는 fps로 동작하게 하는 코드 까먹을까봐 박제함.

 

 

#include <iostream>

#include <chrono>

#include <cstdint>

 

const int fps = 60;

 

using namespace std;

using namespace chrono;

using frame = duration<int32_t, ratio<1, fps>>;

using ms = duration<float, milli>;

 

int main()

{

    time_point<steady_clock> fpsTimer(steady_clock::now());

    frame FPS{};

 

    while (true)

    {

        FPS = duration_cast<frame>(steady_clock::now() - fpsTimer);

 

        if (FPS.count() >= 1)

        {

            fpsTimer = steady_clock::now();

            cout << "LastFrame: " << duration_cast<ms>(FPS).count() << "ms | FPS: " << FPS.count() * fps << endl;

        }

    }

    return 0;

}

 

출처 : https://www.gamedev.net/forums/topic/690860-60-fps-game-loop-using-stdchrono/

 

60 FPS game loop using std::chrono

Hi everyone, out of curiosity yesterday I was trying out chrono header with the goal of creating a 60fps loop, the code below is what I have so far and I wanted your opinion about it, if it is the proper way to do it, how it is usually done or how I could

gamedev.net

 

추가 : Making an accurate Sleep() function | computerBear (blat-blatnik.github.io)

 

728x90
728x90

사용 방법

 

결과

 

CLogMessage.h
0.00MB

728x90

'Basic Programming > C, C++' 카테고리의 다른 글

C++ - MMF(Memory Mapping File)  (0) 2020.05.21
C++ - 60fps로 동작하게 하는 코드  (0) 2020.03.11
C++ - 덤프 파일을 통한 사후 디버깅  (0) 2018.11.21
C++ - region, endregion  (0) 2018.08.03
C++ - Joystick 입력 받기.  (0) 2018.02.01

+ Recent posts