요새 Hooking을 공부하면서 Rand 함수를 후킹해볼 일이 생기게 되었다.
그런데 뭥미.. 테스트 프로그램의 IAT에 MSVCRT.DLL.Rand API가 등록되어 있지 않았다.
Detour도 해봤는데, 어딘가 잘못되었는지 모르겠지만, 제대로된 주소를 가져오지 못해, Hooking 되지 않는다.
직접 분석해서 코드 패치를 이용해 원하는 랜덤 값이 나오게 조작해 보자.
아래는 랜덤값을 조작할 테스트 소스이다.
프로그램을 돌려보면 아래와 같이 랜덤한 값이 줄력 된다.
[그림 1] 랜덤 테스트 프로그램 화면
아래 그림을 보자. IATable에 Kernel32.dll 만 등록이 되어있다. 이래선 IAT Hook을 할수가 없겠군..
[그림 2] 랜덤 테스트 프로그램 IATable
rand의 함수 원형을 알아보자
int 형으로 랜덤 값이 리턴되는 것을 알수 있다.
int rand( void );
올리디버그로 아래 그림 3의 사진을 연속으로 보자.
Rand를 call 하면 Jump를 타고 411CB0 에서 랜덤 코드가 호출 된다.
411CB0 부터 랜덤값을 생성하고, 마지막에 EAX에 00004B31 값을 저장하고, 리턴하는 것을 볼 수 있다.
[그림 3] 랜덤 테스트 프로그램 Rand DASM Code
리턴 값은 eax에 저장된다. 실제 다음 부분을 디버깅 해보면 저 EAX 값이 랜덤값이라는 것을 알 수 있다.
그렇다면 어떻게 하면 랜덤 값을 바꿀 수 있는지 답이 나왔다.
eax에 원하는 값을 저장하고, 리턴해주면 된다. 411cb0 주소에 아래 코드로 변경하면 랜덤값은 무조건 1이다.
Mov eax, 1 ;
retn ;
[그림 4] 바뀐 랜덤 값
자 그러면 코드 패치를 할 수 있는 방법에 대해서 보자.
1. 바이너리 패치
HexEdit 같은것으로 프로그램을 불러와, 그림 3의 411cb0 ~ 411cd6의 기계어 코드를 복사하여 찾기를 눌러 보자.

주소를 보면 그림 3의 시작 주소 411CB0, 그림 4는 1cb0 이다. Base Address 가 410000임을 알 수 있다.
[그림 5] 랜덤 테스트 프로그램 바이너리
기계어 ASM
B8 01 00 00 00 mov eax, 1;
C3 retn;
그림 4의 바이너리를 위 기계어 코드로 바꾸고 실행하면 랜덤 값이 항상 1로 나오는 것을 알 수 있다.

[그림 6] 바이너리 코드 패치 한 랜덤 테스트 프로그램 바이너리
2. Rand 코드 주소를 찾아 코드 패치 하는 방법
바이너리 패치는 수동적이다.
실행파일이 재컴파일 되거나, 다른 실행파일을 변조하려면 다시 분석해야 하기 때문이다.
내가 한 방법은 DLL 을 삽입하고, dll은 Rand 코드 주소를 위치를 찾아서 코드 패치를 하는 방법이다.
rand 코드 주소를 찾는건 좀 무식하게 기계어로 찾아 버렸다. 물론 변경될 수 있는 포인트 값들 만 제외하고 명령어 코드만으로 찾았다.
혹시 쉽게 찾을 수 있는 방법을 아신다면, 알려주시면 참 감사하겠다. ( 시간만 날리고 방법을 찾지 못한 1인 ㅠㅠ)
DLL은 Rnad 프로그램의 메모리를 읽어와 아래 vcrand 와 같은 코드를 찾는다. 0x00 은 비교하지 말고 그냥 건너뛰면 된다.
char vcrand[39] = {0x55 ,0x8b, 0xec, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x69, 0xc0, 0xfd, 0x43, 0x03, 0x00, 0x05, 0xc3, 0x9e, 0x26, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xf8, 0x10, 0x25, 0xff, 0x7f, 0x00, 0x00, 0x5d, 0xc3};
해당 코드가 맞다면 시작 메모리에 아래 rwrand 코드를 패치 한다.
char rwrand[6] = {0xb8, 0x01, 0x00, 0x00, 0x00, 0xc3};
[그림 7] dll 삽입 후 rand 코드 패치 완료
**Rand는 확률을 담당하는 주요 함수이다. 이 함수를 사용하는 프로그램이 많을 것이다.
확률이 마음데로 조작 된다면.. 아이템 드랍? 카드 난수 등 문제가 발생할 것이다.
이런 rand 함수는 직접 만들어 쓰는 것이 좋다. 인터넷에도 소스가 많이 참고하면 된다.