난 정말 최고야 멋있어
Reversing.kr - Direct3D 재밌게 풀어보기 본문
정석적인 문제 푸는 방법은 고구마 죽일때마다 호출되는 복호화 루틴을 찾고,
파이썬 같은 언어로 에뮬레이터를 만들어 복호화 하는 스트링을 풀어내는 방법이지만...
게임으로 본다면 월핵을 만들어 볼 생각도 할 수 있다!
D3D 에는 SetRenderState라는 함수가 있다
렌더링 될 녀석들의 상태를 결정하는 함수인데
State 에 D3DRS_ZENABLE 값을 주고 깊이 고구마들의 깊이 버퍼를 사용하지 않도록 만들어버리면 모든 녀석들이 관통되서 보인다
그 외의 방법으로 State에 D3DRS_FILLMODE 값을 주고 D3DFILL_WIREFRAME값을 설정해주면 선으로 그려져서
훨씬 더 간단한 방법으로 월핵?을 구현해 볼 수 있다
[ENABLE] alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: mov [esp+8],7 //state => D3DRS_FILLMODE mov [esp+c],0 //value =>D3DFILL_WIREFRAME originalcode: push 14 mov eax,d3d9.Ordinal23+52C4 exit: jmp returnhere "d3d9.dll"+11C210: // D3D9!SetRenderState jmp newmem nop 2 returnhere: [DISABLE] dealloc(newmem) "d3d9.dll"+11C210: push 14 mov eax,d3d9.Ordinal23+52C4 |
발로 짜본 SetRenderingState의 파라미터를 변조하는 오토어셈블 스크립트다
깊이 버퍼를 0으로 만드는 방식을 이용하지 않은 이유는...
고구마들의 깊이 버퍼만 조작하는 것이 아니라 모든 녀석들의 파라미터를 조작하는 멍청한 방법이라서.. 이렇게 발로 짜면 배경에 가려 고구마들의 얼굴이 제대로 보이지 않게 된다..
또한 MSDN 에서 첫번째 파라미터인 state가 [esp+4]가 아닌 [esp+8]에 위치하는 까닭은..
이게 IDirect3DDevice9의 메서드라서.. 첫번째 인자로는 보이지 않는 this가 들어가기 때문이다..