Try Attack/Malware Analysis[basic]

메모리 상에 있는 code영역을 수정하는 프로그램

D4tai1 2019. 9. 18.

오늘이 내일이 되었네요.

 

바쁜하루를 보내고 

바람을 쐬고 다시 컴퓨터 앞에 앉았습니다.

 


 

메모리 상에 올라와있는 프로세스의 code영역을

수정하는 프로그램을 만들기 위해서는

주의해야할 사항이 있습니다.

 

빠밤!!

 

먼저 

타짜: 원 아이드 잭을 보셨나요?

저는 개인적으로 재밌게 보았습니다.

금수저나 흑수저나 카드 7장 들고 치는건 똑같답니다.

단, 조작(변조)했다면 정상적인거고

애매하게 조작하려다 걸리면 

죽는거구,,

 

프로그램도 마찬가지라는 생각이 드는건 기분탓이겠죠?

하하..

 

어쨋든 포커에서 포카드이상 나올 확률로

수정할 영역을 사용하고 있는 스레드가 

존재할 수 있으므로 

명령어 바이트코드의 실제크기를 감안하고

스레드 동기화를 통해 해당 영역을 수정해야 합니다.

 

스레드 동기화라고요?

낯설지만 소개를 해볼게요.

...더보기

보통 멀티스레드를 사용하는 프로그램에서 

2개 이상의 스레드가 공유 데이터에 접근하는 경우!!

작업 사이에 간격을 조정하는 것을 말합니다.

 

조금 쉽게 예를 들면

화장실(공유데이터)이 한 칸인데 동시에 같이 들어가서 작업을 할 수 없으니

두 스레드 간 작업시간을 맞춰서 

효율적으로 화장실을 이용하도록 하는 것이죠!

 

8byte를 넘지 않는다면?

 

InterlockedExchange64 API 등을 이용해서

스레드를 인위적으로 정지시키지 않고도 동기화를 수행하면서

해당 영역을 수정할 수 있습니다.

 

InterlockedExchange64의 원형

...더보기

LONGLONG InterlockedExchange64(LONGLONG volatile* Target, LONGLONG Value);

 

다른 하나는

CPU가 빠른 처리를 위해 사용하는 캐시(Cache)가 있습니다.

CPU는 실제 메모리의 코드영역이 수정되어도 

수정된지 꿈에도 모릅니다.

그래서 캐시에 남아있는 이전 코드를 계속 수행하게 됩니다.

코드영역을 수정한 이후에는 

FlushInstructionCache API를 호출해서 

반드시 해당영역의 캐시를 갱신하도록 해주어야 합니다.

그래야 바뀐코드가 캐시로 자연스럽게 들어가겠죠?

 

FlushInstructionCache의 원형

...더보기

BOOL FlushInstructionCache(HANDLE hProcess, LPCVOID lpBaseAddress, SIZE_T dwSize);

 

 

댓글