/*
제목: 함수를 바이트 배열(OPCODE)로 관리하자..!!
작성자: 박성완
작성일: 2004.08.16
목적: 1) 재미있을 거 같아서..
2) 사고의 전환을 가져오기 위해서..
3) 인라인 어셈블리를 사용하고 싶어서..
4) 이를 이용해 암호화 패키지를 만들고 싶어서..
5) 함수를 파일(OPCODE)로 관리하고 싶어서.
* 방법 *
-함수에 브레이크 포인트를 건다.
-ALT+8을 눌러 어셈블리 모드로 진입한다.
-코드의 어셈블리 코드를 참고한다.
-코드의 스택내용을 참고한다.
-어드레싱에 민감하게 주의를 기울인다.
-메모리 보기로 함수시작 주소로 간 후, 함수 크기만큼 복사한다.
(함수크기는 ret까지 이므로 VC++에서 알 수 있다.)
*/
#include
#include
//-----------------------------------------------------------------------------------------------
//
/*
00401030 push ebp
00401031 mov ebp,esp
00401033 sub esp,40h
00401036 push ebx
00401037 push esi
00401038 push edi
00401039 lea edi,[ebp-40h]
0040103C mov ecx,10h
00401041 mov eax,0CCCCCCCCh
00401046 rep stos dword ptr [edi]
16: printf("OPCODE array");
00401048 push offset string "OPCODE array" (0042001c)
0040104D call printf (004011e0)
00401052 add esp,4
17: }
00401055 pop edi
00401056 pop esi
00401057 pop ebx
00401058 add esp,40h
0040105B cmp ebp,esp
0040105D call __chkesp (00401260)
00401062 mov esp,ebp
00401064 pop ebp
00401065 ret
*/
/*
코드내에서 스택 외의 주소값(전역변수, 함수, 힙관련 포인터)을 사용할 경우,
그 주소 값에 문제가 생긴다.
프로세스 로딩시 리로케이션이 될 것이니까..
단, API일 경우 정적 주소값(BASE + RVA)을 얻어 낼 수 있다.
그러므로 모든 값들은 파라메터로 Stack으로 전달해야 사용이 가능하다.
*/
BYTE CODE_BYTE1[] =
{
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x40, 0x53, 0x56, 0x57, 0x8D, 0x7D, 0xC0, 0xB9, 0x10, 0x00,
0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0xF3, 0xAB, 0x68, 0x74, 0x0F, 0x42, 0x00, 0xE8,
0x8E, 0x00, 0x00, 0x00, 0x83, 0xC4, 0x04, 0x5F, 0x5E, 0x5B, 0x83, 0xC4, 0x40, 0x3B, 0xEC,
0xE8, 0xFE, 0x00, 0x00, 0x00, 0x8B, 0xE5, 0x5D, 0xC3
};
void func()
{
printf("일반 함수 호출 void func() \\r\\n");
}
//-----------------------------------------------------------------------------------------------
/*
/*
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,44h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-44h]
0040107C mov ecx,11h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
32: for(int i = 0; i < size; i++)
00401088 mov dword ptr [ebp-4],0
0040108F jmp func3+2Ah (0040109a)
00401091 mov eax,dword ptr [ebp-4]
00401094 add eax,1
00401097 mov dword ptr [ebp-4],eax
0040109A mov ecx,dword ptr [ebp-4]
0040109D cmp ecx,dword ptr [ebp+10h]
004010A0 jge func3+44h (004010b4)
33: dest[i] = org[i];
004010A2 mov edx,dword ptr [ebp+0Ch]
004010A5 add edx,dword ptr [ebp-4]
004010A8 mov eax,dword ptr [ebp+8]
004010AB add eax,dword ptr [ebp-4]
004010AE mov cl,byte ptr [eax]
004010B0 mov byte ptr [edx],cl
004010B2 jmp func3+21h (00401091)
34: }
004010B4 pop edi
004010B5 pop esi
004010B6 pop ebx
004010B7 mov esp,ebp
004010B9 pop ebp
004010BA ret
*/
<FONT COLOR=#000000>BYTE CODE_BYTE2[] =
{
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x44, 0x53, 0x56, 0x57, 0x8D, 0x7D, 0xBC, 0xB9, 0x11, 0x00,
0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0xF3, 0xAB, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00,
0x00, 0xEB, 0x09, 0x8B, 0x45, 0xFC, 0x83, 0xC0, 0x01, 0x89, 0x45, 0xFC, 0x8B, 0x4D, 0xFC,
0x3B, 0x4D, 0x10, 0x7D, 0x12, 0x8B, 0x55, 0x0C, 0x03, 0x55, 0xFC, 0x8B, 0x45, 0x08, 0x03,
0x45, 0xFC |