본문으로 바로가기

아래 XTrap 바이패스 만드는 법

category Security/Reversing 2007. 7. 9. 23:57
반응형

어잌후님께서 궁금해 하셔서 간단히 설명드립니다.

아마 대부분 분들은 이미 알고 계신 부분일 겁니다.


CE의 dll과 sys 사이에서는 DeviceIoControl이라는 API를 통해 통신을 합니다.

XTrap은 이 API의 파라메터를 관찰해서 차단을 하고 있습니다.


아래는 CE에서 IoControlCode와 In/OutBufferSize를 바꾸는 방법입니다.

DLL과 SYS 두 곳을 동일하게 바꾸어 주어야 합니다.


먼저 sys 부분은 DBKKernel/DBKDrvr.c에 보면,


#define IOCTL_UNKNOWN_BASE FILE_DEVICE_UNKNOWN
#define IOCTL_CE_READMEMORY CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)


이런 부분이 있습니다. 0x800 이 부분을 완전 다른 값으로 바꾸셔도 됩니다.

하지만 이러면 DLL에서 다 대응되게 바꾸어 주여야 되므로 좀 귀찮죠.


그냥 FILE_DEVICE_UNKNOWN 이것이 0x22이므로,
#define IOCTL_UNKNOWN_BASE 0x33


이런식으로 해주시면 쉽습니다. 0x22를 0x33으로 바꾼 것이죠.
이렇게 하면 IoControlCode값 체크를 피할 수 있습니다.


다음 dll 부분은 dbk32/DBK32functions.pas에 보면,


const FILE_DEVICE_UNKNOWN=$00000022;
const IOCTL_UNKNOWN_BASE=FILE_DEVICE_UNKNOWN;


이런 부분이 있는데, 역시 $00000022를 $00000033으로 바꾸어줍니다. (위에서 0x33으로 바꾸었다면 말입니다)


만약 sys에서 0x800 이 부분을 건드리셨다면,


cc:=CTL_CODE(IOCTL_UNKNOWN_BASE, $080f, METHOD_BUFFERED, FILE_READ_ACCESS or FILE_WRITE_ACCESS);
deviceiocontrol(hdevice,cc,nil,0,@idtdescriptor,6,br,nil);


이런 모든 deviceiocontrol 호출을 찾아서 CTL_CODE의 $080f 부분을 sys에서 바꾸었던 대응되는 값으로 바꾸어줘야 합니다.


그리고 마지막으로,

deviceiocontrol(hdevice,cc,@ao[0],512,@ao[0],512,br,nil)

이런 호출들이 아마 두 군데 있습니다. 이 512 부분이 입력버퍼사이즈와 출력버퍼사이즈입니다.

이 512를 적절한 다른 값으로 바꾸어주면 사이즈 체크를 피할 수 있습니다


메모리뷰에 ??가 나오면 이 부분을 한번 의심해 보시면 좋을 것 같네요.

수고하세요~

반응형

'Security > Reversing' 카테고리의 다른 글

yoda's cryptor 언팩  (0) 2007.12.07
바람의나라 템복사  (5) 2007.12.01
Cheat v.42  (0) 2007.07.09
GameGuard Nop 처리 부분  (1) 2007.07.09
How to way Bypass CRC Check  (0) 2007.07.09