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
728x90

QWidget에 DirectX를 렌더링하니 뭔가가 계속 덮어져서 Rendering 한 영상이 지워지는 현상이 있었다.

 

그래서 인터넷 검색을 해보니 다른 API를 이용하여 QWidget에 그릴 때에는 paintEngine()을 오버라이딩 해줘야 한다.

QPaintEngine *paintEngine() const { return NULL;

 

https://stackoverflow.com/questions/34220730/qt-directx-rendering

 

Qt Directx rendering

I'm rendering in Qt widget by DirectX. I disabled qt paint engine QPaintEngine *paintEngine() const { return NULL; } but sometimes I want to enable qt paint and disable directX rendering. I'm

stackoverflow.com

 

 

728x90

'GUI Toolkit > QT' 카테고리의 다른 글

QT - Dragger  (0) 2023.06.22
QT - qDebug() 와 QT_NO_DEBUG_OUTPUT  (0) 2019.01.17
QT - InputMethodEvent() 버그...?  (3) 2019.01.15
QT - QT 설치하기.  (0) 2017.02.18
728x90
728x90

'Dev Tool' 카테고리의 다른 글

Dev Tool - Entrian Attach  (0) 2022.10.11
Dev Tool - Gold Wave  (0) 2020.04.28
Dev Tool - TortoiseGit  (0) 2018.10.17
Dev Tool - CMake  (0) 2018.02.26
Dev Tool - PixelAtro App  (0) 2018.02.22
728x90

이번에 Volume Rendering을 접할 기회가 생겨서 데이터를 모으고 공부하면서 작업을 완료 하였다.

 

우선 Marching Cube 방식으로 렌더링하는 방법이 있는데, 이건 이미 회사에서 구현이 완료되어있는 상태라 그대로 놔두고 Raycasting 방식으로 렌더링을 하는 것을 목표로 개발하였다.

 

이미 TransferFunction, Histogram 등 기본적으로 필요한 부분은 다 구현이 되어 있었기 때문에 오직 렌더링만 작업을 했다.

 

아래의 사진이 Marching Cube로 렌더링되는 기본 모습이다.

 

아래의 사진은 Raycasting으로 처음 렌더링을 했던 모습이다. 물론 기본적으로 TransferFunction은 적용이 되어 있는 상태이고 Lighting을 먹일 방법을 찾고 있을 때의 모습이다.

 

Blinn Phong Shader를 적용한 모습이다. Raycast에서 각각의 Voxel마다 Normal을 계산해야하는데, 하는 방법을 겨우 찾아서 처음 적용시켰을 때의 모습이다.

 

아래 사진은 최종 완성된 모습이다. Sampling마다 Light값이 중첩이 되다보니 위와 같이 메탈 재질이 나왔던 것이었고, 그 부분을 수정했더니 아래와 같이 해골다운 모습이 나왔다.

 

여러 회사를 다니다보니 Volume Rendering을 접해보네...

기본적으로 국내 자료는 부족하고, 논문에도 소스코드가 있는건 아니다보니 삽질을 굉장히 많이 한 것 같다.

그래도 석사출신의 동료직원이 C코드를 이용하여 CPU에서 Volume Raycasting 처리를 해본적이 있어서 다행이었다. 없었으면 못만들뻔...

 

MarcusJonsson.pdf
0.44MB
VolumeRendering.ppt
2.99MB

 

 

728x90
728x90

만약 Nvidia 그래픽 카드를 사용하는 사람들 중에 하드디스크의 용량이 이상하게 작아져서 컴퓨터가 엄청 느려지거나, 어떠한 프로그램들이 실행이 되지 않는다면, Nvidia Geforce Experience가 설치 되어 있는지도 한번 확인을 해보자.


CPU의 점유율을 많이 잡아먹거나 C:\Users\my\AppData\Local\NVIDIA\NvBackend 경로에 backend.log 가 말도 안되게 큰 파일이 있을 수도 있다.


만약 이런 파일이 생겨있다면 가장 빠른 방법은 NVidia Geforce Experience를 삭제하는 것이 가장 빠른 방법이고, 


삭제하고 싶지 않다면 로그를 기록하는 기능을 비활성화 시켜야한다.

아래의 링크를 보고 따라하면 된다.

https://nvidia.custhelp.com/app/answers/detail/a_id/3171/~/how-to-enable-nvidia-graphics-driver-and-geforce-experience-installer-logging



728x90
728x90

여러 사람이 commit을 하다보니 한글 깨짐 현상이 발생하여 인터넷 검색 결과 3개의 설정을 변경해 주면 된다.



프로젝트 속성 -> 구성 속성 -> 일반 -> 문자 집합 : 유니코드 문자 집합 사용 (Debug, Release 전부)




도구 -> 옵션 -> 텍스트 편집기 -> 일반 -> 서명 없는 UTF-8 인코딩 자동 검색(D) 체크 해제




도구 -> 옵션 -> 환경 -> 문서->빨간 부분 체크 할 것.







출처 : https://m.blog.naver.com/PostView.nhn?blogId=yun4794&logNo=221084383612&proxyReferer=https%3A%2F%2Fwww.google.com%2F


http://www.sysnet.pe.kr/2/0/1349

728x90

+ Recent posts