|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=62 [복사]
C++ 공부 한 200페이지 하다가 갑자기 프로그램 하나 만들고 싶어져서
온리 구글링만으로 삽질하면서 프로그램 하나 만들고 있는데요.
2일 삽질하다가 더이상은 진행이 안될 것 같아서.. 질문 드려봅니다.
롤 이라는 게임에서
게임래디 -> 로딩 -> 게임시작
->에 시작하는 부분을 캐치해내고 싶습니다.
(딱히 기능이나 변수명 등등 안꺼내와도 됩니다. 그냥 감지만 하면 됩니다.
특정 주소가 초기화 된다던지 .. 등등 )
게임래디 되고 로딩되는 부분은 어짜피 게임클라이언트가 시작되니깐 클라이언트 실행을 감지하는걸로 해결했는데요.
로딩100% -> 게임시작 이 부분이 골때립니다.
리버싱이나 OS분야에 대해서 무지식으로 접근하려니 너무 힘들어요.
온리 메모리 모니터링으로만 분석하고있는데요. 한계를 느꼈습니다.
----------------------------------------------------------------------------------------
일단 제가 메모리를 읽는것만으로 분석한 내용은
((사진이 안올라가서. 올리디버거 view memory로 보면))
게임 클라이언트에서 RiotLauncher.dll 를 불러오는 부분인데
PE헤더있고, 데이터, 리소스, 등등 영역 다음에
0x10000000 ~ 0x67DF0000 가상 메모리 영역에서 게임 로딩처리와 시작한뒤에 데이터들을 관리하는 것 같습니다. (게임시작! -> 게임클라이언트시작 -> RiotLAuncher.dll를 불러오는 것 같습니다. )
여기서 질문1.
:: 프로그램이 절대 주소를 가지고 있다고 하더라도, 윈도우비스타 부터 랜덤메모리주소(ASLR) 보안기술때문에
메모리에 데이터가 올라오는게 뒤죽박죽 이더라구요.
근데 이상한건 위에 적은 가상메모리 범위내에서만 뒤죽박죽입니다. 또,
0x10000000 ~ 0x31000000 이 부분에서 무조껀 로딩 0% ~ 100%을 처리하고
0x2F000000 ~ 0x3C000000 이 즈음에서 로딩 끝나고 게임 시작될때 처리됨.
0x3A000000 ~ 나머지 , 이 부분에서 게임 화면 처리( MS_PAINT 처럼 그려내는 부분인듯.. 창이 최소화되있으면 처리안함 )
즉, 약간씩은 범위가 겹치긴 하지만 저 범주를 벗어나지는 않는 것 같습니다.
:::: 제가 DLL에 대해서 잘 모릅니다. 대충 게임 프로그램에 의해서 저 DLL이 호출이 되는 것 같은데
0x10013000 ~ 0x67DF0000 영역은 무슨 영역인가요?? 그리고 무슨 데이터들이 오는건가요??
(헤더 바로 다음에 view memory로 안보이는 영역)
궁금한 이유는 가상주소를 통해 메모리를 읽고있는데(ReadProcessMemory 함수)
게임로딩 or 게임시작이 되지 않으면 저 부분은 초기화가 되지 않았는지 안읽힙니다. (return value zero)
그리고 저 범주 내에서만 값이 뒤죽박죽으로 초기화되는 것 같은데
실행파일에 dll이 올라오는 부분은 절대적인 주소로 묶여있는 건가요??
그렇지 않고서야 거의 비슷한 주소내에서 값들위치만 조금씩 달라질린 없다고 생각해요.
((ASLR)이 적용되는 범위)
정리 -
0x10013000 ~ 0x67DF0000 영역은 무슨영역인가? 무엇이 올라오는부분인가. 변수?코드? 궁금합니다.
저 dll이 불러와진다고 전부다 초기화가 되진 않고 로딩이 진행된 정도나 게임시작 유무에 따라서
조금씩 조금씩 초기화 되는것같더라구요. (여기서 초기화란. 리드메모리로 값이 읽혀서 return no zero )
(하위 주소에서 상위 주소로 조금씩조금씩 리턴값이 0에서 1로 바뀝니다. (리드프로세스메모리))
(조금씩 위치가 다르긴 하지만요.)
그리고 랜덤 가상메모리 주소 방식이 위의 영역부분에서만 바뀌는건지
그렇게 생각된 이유는 위의 메모리 사진에서 보듯이 dll이 호출되는 위치~ 다음 dll위치 이 사이에서만
그리고 저 세 영역으로 나뉘어진 부분에서만 조금씩 변동이 있었기 때문에요.
질문2.
위의 식으로 메모리 보는건 너무 의미없는짓인것같습니다.
영역을 확실히 캐치해내서 값이 읽히면 게임이 시작됬다고 판별해도 되긴하는데
언제 어떻게 될지도 모르는일이고.. 실제로 10번중에 1,2번 캐치를 제대로 못합니다.
그래서 다른방법이 있다면 어떻게 접근해야될까요?
분명히 로딩부분과 게임시작부분이 다른것 같습니다.
후킹이든 뭐든 접근 방법좀 알려주세요. 게임시작부분을 캐치해내고 싶습니다.. |
Hit : 4240 Date : 2013/08/24 07:23
|