2012-03-22 3 views
4

프로젝트와 같은 보호자/포장기/바인더를 시작합니다.가상 파일 시스템 디자인

목표는 당신이

  • /이미지/
  • /음악/
  • 기본 * .INI 파일
  • DLL을
  • 예전 친구
와 전체 응용 프로그램 디렉토리가있을 때

그냥 packer.exe를 사용하면이 모든 파일이 압축되어 암호화되어 저장됩니다. 결과로 나오는 exe.

그런 다음 결과로 나오는 exe는 파일을 찾을 수없는 경우 "실제"파일 시스템으로 되돌아가는 투명한 가상 파일 시스템을 만듭니다. 지금

내가 allready 처리 수 (없는 매우 정확하게) 메모리 등으로부터 로딩 DLL을하지만이 흠 후크에 문제가

..

하는 debbuger 부착용 ProofOfConcept 메신저로서 (C++로)에 target.exe는

내가 유용한 데이터와 타겟을 공급 CreateFileW에서 ReadFile 등 IM 갖는 문제점 같은 것들을 디버거 중단 처리하고 다소

======= Started [target.exe] ======= 
> Placing breakpoint on EP : 0x401130 
Process started 
Loaded module : [target.exe] 
Loaded module : [ntdll.dll] 
Loaded module : [kernel32.dll] 
[...] 
Break point at [0x401130] 
> Restored EP byte. 
Loaded module : [bass.dll] 
Break point at [0x760fcc4e] 
Found set bp : kernel32!CreateFileW 
[!] CreateFileW Callback Function : 
     FileName : C:\Users\user\Desktop\cppve\loader\bin\Debug\target.exe 
     Access : 0x80000000 
     Return Addr: 0x741b91e6 
> Re-setting bp at [0x760fcc4e] 
Break point at [0x760fcc4e] 
Found set bp : kernel32!CreateFileW 
[!] CreateFileW Callback Function : 
     FileName : .\beyond_v.mod 
     Access : 0x80000000 
     Return Addr: 0x760fcfa0 

같다.

가짜 핸들을 만들어 잡아서 처리해야합니까? 또는 그 접근법에 매우 잘못 될 수있는 너무 많은 것들이 있습니까? 여기

void callback_createfilew(CONTEXT* ct){ 
//stub 
cout<<"[!] CreateFileW Callback Function :"<<endl; 

void* returnaddr=MemReadDwordPtr(hProcess,(void*)ct->Esp); 
string fn=MemReadCString(hProcess,MemReadDwordPtr(hProcess,(void*)ct->Esp+4),true); 
void* access=MemReadDwordPtr(hProcess,(void*)ct->Esp+8); 
void* sharemode=MemReadDwordPtr(hProcess,(void*)ct->Esp+12); 
void* dwCreationDisposition=MemReadDwordPtr(hProcess,(void*)ct->Esp+20); 
void* dwFlagsAndAttributes=MemReadDwordPtr(hProcess,(void*)ct->Esp+24); 

cout<<"  FileName : "<<fn<<endl; 
cout<<"  Access : "<<(void*)access<<endl; 
cout<<"  Return Addr: "<<(void*)returnaddr<<endl; 

if(fn.compare(".\\beyond_v.mod")==0){ 
    // this is wrong, we need to call it from the target process... 
    HANDLE ret=CreateFileA(".\\_beyond_v.mod",(DWORD)access,(DWORD)sharemode,NULL,(DWORD)dwCreationDisposition,(DWORD)dwFlagsAndAttributes,NULL); 
    ct->Esp+=0x20; 
    ct->Eax=(DWORD)ret; 
    ct->Eip=(DWORD)returnaddr; 
} 

내가 과정에서 codecave을하고 쉘 코드를 [편집을 추진한다 CreateFileW

에 대한 샘플 콜백 함수입니다 : 미안 해요, 내가 다른 일을 설명하기 위해이 말을 많이 사용하지만 난 당신을 생각 나는 무엇을 잡을 것인가?] 내 위조 된 코드를 실행하려면?

또는 int3s를 처리하고 로더가 설정 한 예외 처리기를 통해 제어를 전달하는 DLL을 삽입 할 수 있습니까? 그러나 그것은 dll이 가상 파일 시스템에 있어야한다는 까다로운 proove 수 있습니다! 그래서 다른 초기화 작업이 일어나기 전에 손으로로드해야합니다.

나는 최종 버전에서 디버거를 완전히 삭제하려고합니다. 그것은 단지 문제를 일으키고 프로젝트의 보호자 부분을 진지하게 타파 할 것입니다.

+0

ProofOfConcept (메모리에서 mod 파일을 재생하는 저음 dll) 완전하고 작동하는 .o0 – n00b

답변

1

"패커"가 미리 컴파일 된 바이너리에서 투명하게 작동하고 모든 결과가 단일 바이너리 내에 있도록하려면 패커가 바이너리에 후킹 코드를 추가해야합니다. 그런 다음 제어를 이진의 원래 진입 점으로 전달합니다. 확실히 할 수 있긴해도 이것은 사소한 것은 아닙니다.

하지만 여기에도 또 다른 문제가 있습니다. 이 후킹 코드는 암호 해독 코드와 아마도 열쇠를 포함 할 것이고,이 모든 것은 디버거와 다른 도구를 가진 좋은 프로그래머에 의해 파괴 될 수 있습니다.

가짜 핸들의 경우 여러 번 파일을 열고 다른 핸들을 사용할 수 있는지 알 수 있습니다. 그렇다면 공유 모드에서 읽기 위해 기존 파일을 열어두면 핸들을 기억하고 메모리 내 파일로 사용하십시오. 다른 손잡이가 필요 하신가요? 파일을 다시 열려면 파일을 엽니 다. 다른 실제 핸들과의 충돌을 보장하지 않습니다.

+0

공유 모드는 좋은 생각입니다. 내 버그 처리 스푸핑 코드를 제거 할 수 있습니다 :) – n00b

관련 문제