[Development Log] - PE Protector API-Wrapping

Category: Reversing - Written on September 8, 2018

Original PE32 File

Problem


Protected PE32 File

Problem



call dword ptr ds:[<&SendMessageTimeoutA>] -> call 450248

Inside call 450248

depth 1

Problem

depth 2

Problem


depth 3

Problem


depth 4

Problem


depth 5

Problem


depth 6

Problem


depth 7

Problem


depth 8

Problem


depth 9

Problem


depth 10

Problem


depth 11

Problem


depth 12

Problem



API-Wrapping Algorithm을 간략하게 설명하자면, 0~100까지 공간을 예약했다고 가정했을 때,

배열은 아래와 같은 형태가 된다.

0, 10, 20, 30, 40, 50, ...

위 배열에 Random Shuffling을 하면, 아래와 같은 형태가 된다.

80, 20, 50, 40, 10, 70, ...


이 배열을 루프 돌 때, Wrapping 할 횟수 만큼 반복한다. 예를 들어 5번만 거치게 하고 싶다면 80~10까지 반복한다.

80Head 가 되고 10Tail 이 된다.

여기서 원본 바이너리의 FF 15 SendMessageTimeoutA 형태의 어셈블리 코드를 E8 Head Address 90 또는 90 E8 Head Address 형태로 바꾼다.

Head 에서는 순서대로 80 -> 20 -> 50 -> 40 -> 10 형태로 이동하게 된다.

Tail 에서는 E9 SendMessageTimeoutA 형태로 기존의 API 호출 코드의 API 주소로 JMP 한다.

위와 같은 과정을 거치면서, 원소의 파일 오프셋에서는 랜덤 사이즈가 할당되어 랜덤 어셈블리 코드가 작성된다. (NOP으로 채워진 부분) depth 또한 랜덤으로 결정된다.

랜덤 어셈블리 코드에서는 Anti-Debugging 코드 등이 적용될 예정이다.

또한 jmp dword ptr ds:[<&SendMessageTimeoutA>] 형태와 mov r32, dword ptr ds:[<&SendMessageTimeoutA>] 형태에도 위 Algorithm을 적용시킬 예정이다.


Comments