336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

....

...


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 


핵심코드



RDTSC .exe



더미코드


----------------------------


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
Posted by af334