Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

난 정말 최고야 멋있어

Reversing.kr - Direct3D 재밌게 풀어보기 본문

카테고리 없음

Reversing.kr - Direct3D 재밌게 풀어보기

n00bh4cker 2019. 12. 11. 19:36

정석적인 문제 푸는 방법은 고구마 죽일때마다 호출되는 복호화 루틴을 찾고,

파이썬 같은 언어로 에뮬레이터를 만들어 복호화 하는 스트링을 풀어내는 방법이지만...

게임으로 본다면 월핵을 만들어 볼 생각도 할 수 있다!

 

D3D 에는 SetRenderState라는 함수가 있다

https://docs.microsoft.com/en-us/windows/win32/api/d3d9helper/nf-d3d9helper-idirect3ddevice9-setrenderstate

 

IDirect3DDevice9::SetRenderState (d3d9helper.h) - Win32 apps

Sets a single device render-state parameter.

docs.microsoft.com

렌더링 될 녀석들의 상태를 결정하는 함수인데

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가 들어가기 때문이다..