들어가며안티리버싱 테크닉을 이용해 안티치트솔루션 (게임가드 같은)을 만드는 걸 간단히 다뤄보겠습니다.유저모드 (ring3) 위주이며 커널모드 (ring0)의 드라이버등은 다루지 않습니다. 리버싱Reverse Engineering 을 줄여 Reversing으로 흔히 말하며, RE, 역공학, RCE 등으로 불리기도 합니다. 뜻대로 역으로 분석하는걸 칭하며, 대상으로는 exe, dll, sys 파일 등이 있습니다. 이러한 실행파일들을 대상으로 코드를 분석해 프로그램이 어떤 기능을 하는지 함수는 어떤 역할인지를 알아내는 작업하며, 프로그래밍 언어가 하나가 아닌만큼 여러 언어로 만들어졌을테니 어셈블리어를 알아두어야 합니다. 안티리버싱말 그대로 리버싱을 어렵게 만드는 작업입니다. 난독화, 가상화하여 코드 읽기의..
https://imoracle.tistory.com/50 [Game] 지뢰찾기 월핵 제작 - 1 -https://imoracle.tistory.com/51 [Game] 지뢰찾기 월핵 제작 - 2 -이어서이제 메모리를 읽어와서, 2차원 배열에 값을 넣어주어야 합니다. 프로그램을 열어줍니다. 실시간으로 볼 수 있게 띄워주겠습니다.imoracle.tistory.com이어서이제 메모리를 읽어와서, 2차원 배열에 값을 넣어주어야 합니다. 프로그램을 열어줍니다. 실시간으로 볼 수 있게 띄워주겠습니다.전 포스팅에서 봤다시피 0x20 은 32입니다.시작주소 + j 를 해주며 다음칸 [열]로 넘어갑니다.i * 32를 해주며 시작주소에서 다음시작주소[행]로 넘어갑니다. 그리고 만들어둔 data[9, 9] 에 값을 넣어주..
https://imoracle.tistory.com/51 [Game] 지뢰찾기 월핵 제작 - 2 -이어서이제 메모리를 읽어와서, 2차원 배열에 값을 넣어주어야 합니다. 프로그램을 열어줍니다. 실시간으로 볼 수 있게 띄워주겠습니다.전 포스팅에서 봤다시피 0x20 은 32입니다.시작주소 + jimoracle.tistory.com 들어가며 지뢰의 위치를 찾아 그려주는 프로그램을 만들어 보겠습니다.C#을 이용해서 만들어 보겠습니다. 시작 지금와서 보니 왜 이걸 Decimal로 보고 있었을까 싶습니다.어쨌든 143 은 0x8F 입니다. 16은 0x10 입니다.0x10 을 기점으로 행의 시작과 끝을 구분합니다. 사실 위의 사진을 캡쳐 할때만해도 아무생각없이 그냥 크기대로 들어가는줄 알고 진행하다2차원 배열에 값..
https://imoracle.tistory.com/48 [Assaultcube] FPS게임 분석 및 핵 제작 - 1 -https://imoracle.tistory.com/49 [Assaultcube] FPS게임 분석 및 핵 제작 - 2 -핵툴 개발 리버스 엔지니어링을 통해 동작중인 게임의 메모리주소를 얻은 후 프로세스에 접근하는 방식은 내부접근과 외부접근imoracle.tistory.com 핵툴 개발 리버스 엔지니어링을 통해 동작중인 게임의 메모리주소를 얻은 후 프로세스에 접근하는 방식은 내부접근과 외부접근으로 두가지의 방식이 존재합니다.Internal (내부접근)- Process에 DLL을 Injection 하는 DLL-Injection 기법을 사용합니다. 직접적으로 주입하므로 메모리에 직접 접근이 ..
https://imoracle.tistory.com/49 [Assaultcube] FPS게임 분석 및 핵 제작 - 2 -핵툴 개발 리버스 엔지니어링을 통해 동작중인 게임의 메모리주소를 얻은 후 프로세스에 접근하는 방식은 내부접근과 외부접근으로 두가지의 방식이 존재합니다.Internal (내부접근)- Process에 DLLimoracle.tistory.com들어가며 메모리해킹은 특히 게임분야에 사용되며, 유저들에게 피해를 입히는 기술로 사용됩니다.이러한 해킹프로그램을 통칭 치트 또는 핵이라 부릅니다.월핵, 맵핵, 스피드핵, 에임봇, 워프 등이 포함됩니다. 주로 사용되는 언어는 C/C++, C#, Delphi 가 있고, 매크로의 경우 AutoHotKey가 있습니다. 선행지식으로는 Assembly : 분석할 ..
정답은 무엇인가 라고 물어온다. 프로그램 실행화면 IDA에 올리니 디컴파일못하겠다고 칭얼거려.. x32Dbg에 올려보자 x32Dbg문자열을 찾아주고 밑에 call 부분은 printf 겠쥬?안으로 타고들어오니 401e95 부분에서 화면에 출력해주는 군요402010 은 scanf 호출 부분입니다.402010에 브레이크포인트를 걸고 진행하니 바로 꺼져버리는군요.그래서 바로 밑인 004012d7에 브레이크포인트를 걸고 진행했습니다.Stepover로 진행하던도중 무한루프에 갇혀버려서 00401361 부분의 jne -> je로 바꿔주며 탈출했습니다.그러다 call edx를 만나니 꺼져버리더군요. BP를 걸고 따라 들어가봅시다.한글자씩 비교하고 있었군요. CRAAACKED! 를 넣어주면 성공
이 프로그램은 몇 밀리세컨드 후에 종료 되는가정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오 프로그램 실행화면익숙하군요 https://imoracle.tistory.com/43 [Reversing] CodeEngn - Basic RCE L19이 프로그램은 몇 밀리세컨드 후에 종료 되는가 타이머관련 함수나 Sleep 함수를 사용하려나 유추가 된다. 프로그램 실행화면잘 움직이는걸 봐선 Sleep 함수는 쓰지 않는다. x32Dbg - 수동언패킹imoracle.tistory.com이전의 포스팅에서 다룬 방법과 같습니다.자세한 분석법을 보고 싶으시다면 위의 게시글을 봐주시길 바랍니다. 이번포스팅은 거저? 로 작성하겠습니다 ^-~안티디버깅이 적용되어 있습니다. IDAIsDebuggerPresent 함수를 ..
다음 파일은 악성코드 소스의 일부분이다. 이것의 공격방법은 무엇인가 소스코드addr_in.sin_family=AF_INET; addr_in.sin_port=htons(TargetPort); addr_in.sin_addr.s_addr=TargetIP;ipHeader.h_verlen=(4len) break;if(bRandPort) { TargetPort=brandom(1000, 10000); }szSpoofIP[0]=(char)brandom(0, 255); szSpoofIP[1]=(char)brandom(0, 255);szSpoofIP[2]=(char)brandom(0, 255); szSpoofIP[3]=(char)brandom(0, 255);Sleep(delay); }xClose(sock); 나름 주석을 ..
이 프로그램은 Key파일을 필요로 하는 프로그램이다.'Cracked by: CodeEngn!' 문구가 출력 되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가 프로그램 실행모습 crackme3.key를 별도로 만들어주고 실행했다. 아무것도없다.IDA에 올리자마자 훤히 보였다. eax 값이 1이면 메세지박스를 볼 수 있겠다. al 이 왜 eax 냐면EAX는 32비트 [ 0 ~ 31 ] - Extended AXAX는 16비트 [ 0 ~ 15 ]AH는 AX의 상위8비트 [ 8 ~ 15 ]AL은 AX의 하위8비트이다. [ 0 ~ 7 ]물론 64비트의 RAX도 있다. CreateFileA 함수를 통해 "CRACKME3.KEY" 파일을 여는듯하다. 시각적자료글 작성을 다하고 만든 표인데 ..
이 프로그램은 몇 밀리세컨드 후에 종료 되는가 타이머관련 함수나 Sleep 함수를 사용하려나 유추가 된다. 프로그램 실행화면잘 움직이는걸 봐선 Sleep 함수는 쓰지 않는다. x32Dbg - 수동언패킹이녀석 패킹이 되어있구나 ! 그냥 진행해보자popad 가 보이고 밑에 jmp가 보이는 걸로 봐서 이 프로그램은UPX 패킹이 된걸 알 수 있다.417770 이 OEP 겠구나.OEP 로 도착했다. 이제 분석해보자 안티디버깅 우회?? AutoIt 이라는 녀석으로 만들어 진 프로그램인거 같고 메세지를 뿜으며 종료된다.step over로 진행해보니 call 40ea50 부분에서 메세지박스를 띄우는 걸 알 수 있다. step into 로 40ea50 을 타고 들어가보자타고 들어와 step over로 진행 해보자c..
Name이 CodeEngn일때 Serial은 무엇인가 라고 물어온다. 프로그램 실행화면 PEIDEXE Shield 로 뭔가 되어있는데, 별다른 정보를 얻지 못했다. 패킹은 아닌듯 싶다 IDA함수들도 잘 보여진다. 패킹은 아닌듯. sub_401279() 를 타고 들어가자DialogFunc를 타고 들어가면 된다. 이전 포스팅에서 다뤘기에 설명은 생략 여기서 유의깊게 봐야하는 부분이 보인다.String1 과 String2를 비교해서 분기가 나뉜다. str, str2 를 넣어주고 strcmp를 call해주는듯 하다. 그리고 분기한다. x32Dbg call 부분에 브레이크 포인트를 걸고 어떤 값이 들어가는지 지켜보자String 1에 생성된 Serial 이 String2에 입력한 값이 들어가는게 보여진다. 0..
Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..정답인증은 Name의 MD5 해쉬값(대문자) 라고한다. 프로그램 실행화면 힌트로 Name은 한자리 라는걸 알게됐다. 우선 IDA로 보자한자리를 넣으면 비교해서 3보다 작으면 Please Enter More Chars... 를 띄운다. cmp eax, 3 을 cmp eax, 1로 바꿔주면 더이상 이쪽으로 분기되지 않는다. x32Dbg로 보자cmp eax, 1로 패치해주었다.브레이크포인트를 걸고 진행해보자 call 45b850을 지나고나면 Key가 스택에 들어가는 모습을 볼 수 있다. 그렇기에 call 45b850 에서 안으로 따라 들어가보자 타고들어..