....
...
exception
시간이용
-------
FS[18] -> TEB 구조체
TEB+30 -> PEB
FEB -> BeingDebugged
-------
FindWindow(LPCTSTR IpClassName,
LPCTSTR IpWindowName
)
TimeCheck - RDTSC
CPU 사이클 값을 얻어오는 명령어
64bit 형태로 받아옴 -> EDX(상위32bit) 와 EAX(하위32bit)에 나누어 저장
시간이 흘러갈 수 밖에 없는 부분에 RDTSC를 걸어 준다
RDTSC // 1
인증
RDTSC // 2
검증 // 2-1
핵심코드
더미코드
----------------------------
dll 인젝션
프로세스가 실행되는 과정
프로세스는 각자 자기만의 개인적인 공간이 있다 -> 가상메모리 공간 -> 여러개의 Thread
-> 최소한의 작업 단위
-> 최소 한개 이상이 존재해야 프로세스가 됨
-> 여러개의 Thread가 합쳐져서 프로세스가 된다
-> 같은 주소를 가져도 다른 프로세스라면 서로 아무런 영향을 받지 않음
-> 자기만의 개인적인 공간 -> 가상 메모리 -> 가상메모리 관리자 -> 물리 메모리
-> 각각의 프로세스에 다르게 침투해야 한다 -> dll 모듈 강제 주입 -> dll injection
------------------
DLL
Dynamic linked Library
동적 연결 라이브러리
-> 함수의 집합
-> #include <stdio.h> -> 정적 라이브러리
-> 실행 파일의 크기를 줄임
-> dll 안에 있는 추가적인 기능을 프로세스안에 유동적으로 붙였다가, 땔 수 있음
-> 기능의 모듈화가 가능
-> 패치 기능 개선의 효율성
---------
#include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule -> dll 파일이 붙고나서 식별값
DWORD ul_reason_for_call -> 호출 시점에 따라 유동적인 값이 들어옴
LPVOID IpReserved -> 호출방식
-> 암시적 호출 방식 -> 실행할때 같이 포함하고 실행
-> 명시적 호출 방식 -> 포함해달라고 한 후 포함
)
-> LP -> pointer
-> APIENTRY -> stdcall 함후 호출 규약을 의미
-> BOOL -> 참/거짓 -> return 1을 해야 dll이 붙음
--------------
#include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
MessageBox(NULL, "DLL ATTACHED!!", "ATTACH", MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(NULL, "DLL DETACHED!!", "DETACH", MB_OK);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
-> 비주얼에서 실행 안 될시 project -> setting -> precomfiled headers 선택
not using precomfiled headers 선택
----------------------
LoadLibrary함수로 dll 붙임
-> "dll 파일이 맵핑이 되었다 , 로딩이 되었다" 라고 표현
system.dll 파일 -> Kernel32.dll -> 프로세스, 스레드, 입출력, 메모리, 객체 ** 중요 **
-> loadLibrary가 포함되어 있는 곳
-> User32.dll -> 윈도우창, 대화 상자나 인터페이스에 관련된 컨트롤
-> Gdi32.dll -> 그래픽
----------
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
-> const char* -> name /path
h for handle -> 핸들값을 리턴
BOOL FreeLibrary (HMODULE hLibModule);
-> dll 떼어 낼때 사용
-> h for handle -> 붙어있는 곳의 handle 값을 넣어줌
->
BOOL -> 잘 떼어지면 참, 안되면 거짓
두번붙였다가 한번 떼어내달라고 하면 안 떨어짐 -> 두번 붙였으면 두번 떼어달라고 해야 떨어짐
HWIND
HANDLE
HINSTANCE
-> 실행중인 프로세스의 handle 값을 구할 때 주로 사용
HMODULE
-> dll 모듈, dll에 대한 handle값을 구할 때 사용
---------------
#include <windows.h>
int main(int argc, char* argv[]){
HMODULE hModule;
hModule= LoadLibrary("c:\\test.dll");
if(hModule)
OutputDebugString("로드 성공"); -> 디버그 모드에서 확인
else
OutputDebugString("로드 실패");
if(hModule){
FreeLibrary(hModule);
}
return 0;
}
-------------------------
Pointer 개념
변수 -> 담을 수 있는 저장공간, data -> int, char ....
포인터 변수 -> 주소를 담는 저장공간 -> 어떤형태의 주소인지? -> int, char
함수 포인터 -> 함수의 주소를 담는 공간 -> 리턴 타입/ 함수 이름/ 인자 를 맞춰주어야 함
* 기본 형태
return_type (*function) (arg1, arg2....);
* 리턴형, 인자수와 형태를 맞춰준다
int hello(char *) -> int (*A)(char *);
-> A라는 이름의 공간으로 hello()를 담을 수 있다
void test() -> void(*A)();
-----------
#include <stdio.h>
void hello(char*name){
printf("Hi %s\n",name);
}
-> 함수 이름 자체는 함수의 주소를 의미한다
int main(){
void (*Func)(char*);
Func=hello; -> Func는 hello 함수의 주소를 가진다
Func("aaa~!");
}
------------
#include <stdio.h>
int hello(char*name){ // int 로 수정
printf("Hi %s\n",name);
return 0;
}
int main(){ // int 로 수정
int (*Func)(char*); // int 로 수정
Func=hello;
Func("aaa~!");
return 0;
}
---------------------
#include <stdio.h>
int hello(){ // 인자 없앰
printf("Hi %s\n");
return 0;
}
int main(){
int (*Func)(); // 인자 없앰
Func=hello;
Func(); // 인자 없앰
return 0;
}
-> 함수와 함수 포인터의 형태가 서로 같지 않으면 에러가 남
'Reversing' 카테고리의 다른 글
dll ejection and malicious codes (0) | 2014.10.17 |
---|---|
dll injection (0) | 2014.10.16 |
Anti-debugging (0) | 2014.10.14 |
crackme and winapi (0) | 2014.10.13 |
crackme and win32API (0) | 2014.10.08 |