'programming/windows'에 해당되는 글 9건

  1. 2016.01.04 codepad.org
  2. 2015.11.03 str ansi uni multi
  3. 2013.10.11 VC2010/2012에 WTL 설치
  4. 2012.05.24 리소스 다루기 2
  5. 2012.05.23 리소스 다루기 1
  6. 2012.02.28 까먹지말자
  7. 2011.12.27 Win32 Ref.
  8. 2011.09.16 까먹까먹하는 PE rewrite
  9. 2011.09.11 LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR

codepad.org

programming/windows 2016. 1. 4. 17:38

'programming > windows' 카테고리의 다른 글

str ansi uni multi  (0) 2015.11.03
VC2010/2012에 WTL 설치  (0) 2013.10.11
리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28

str ansi uni multi

programming/windows 2015. 11. 3. 16:23


strcpy -> wcscpy -> _tcscpy (문자열을 복사) 

strncpy -> wcsncpy -> _tcsncpy ( 사이즈 만큼 복사) 

strlen -> wcslen -> _tcslen (문자열 길이 확인)  

strcat -> wcscat -> _tcscat (두 문자열 이어 붙이기) 

strncat -> wcsncat -> _tcsncat (사이즈 만큼 이어 붙이기) 

strcmp -> wcscmp -> _tcscmp (문자열 비교) (반환 값(-1, 0, 1)) 

strncmp -> wcsncmp -> _tcsncmp ( 사이즈 만큼 문자열 비교) 

stricmp -> wcsicmp -> _tcsicmp (대소문자를 구별하지 않고 문자열을 비교) 

strnicmp -> wcsnicmp -> _tcsnicmp (사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교)

strchr -> wcschr -> _tcschr (문자 찾기) 

strrchr -> wcsrchr -> _tcsrchr (문자 찾기 (문자열 끝에서 부터 검색)) 

strstr -> wcsstr -> _tcsstr (문자열 찾기)

strpbrk -> wcspbrk -> _tcspbrk (문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성)   

strtok -> wcstok -> _tcstok (문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능)) => 해당 문자가 NULL로 치환 됨

strset -> wcsset -> _tcsset (문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함) => "abc" -> "bbb" 

strnset -> wcsnset -> _tscnset (사이즈 만큼 문자 치환) 

strupr -> wcsupr -> _tcsupr (대문자로 치환)

strlwr -> wcslwr -> _tcslwr (소문자로 치환) 

strrev -> wcsrev -> _tcsrev (문자열 역정렬) => "가나다라마" -> "마라다나가"

출처 : http://blog.naver.com/kilsu1024/110168931552

'programming > windows' 카테고리의 다른 글

codepad.org  (0) 2016.01.04
VC2010/2012에 WTL 설치  (0) 2013.10.11
리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28

VC2010/2012에 WTL 설치

programming/windows 2013. 10. 11. 11:15

'programming > windows' 카테고리의 다른 글

codepad.org  (0) 2016.01.04
str ansi uni multi  (0) 2015.11.03
리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28

리소스 다루기 2

programming/windows 2012. 5. 24. 09:21
루트킷 같은 성격의 드라이버들은 배포시 아래와 같은 방법으로 
실행 바이너리의 리소스에 드라이버를 포함시킨다.




리소스 추가 -> 가져오기( 드라이버 파일) -> 사용자 지정 리소스 탐색 (ex:Driver) 
와 같이 추가를 하면 아래의 그림처럼 바이너리가 추가된다.




그 후 Build를 하면 내가 포함 시킨 드라이버 파일과 Resource.h 파일이 수정된다.





아래의 IDR_DRIVER1의 선언해준 "DRIVER"를 통해 리소스를 추출하면 된다.



[Source]
BOOL ExtractDriver(LPSTR Path)
{
  HRSRC RsH;
  HGLOBAL RsGH;
  BYTE *FilePtr;
  ULONG FileSize;
  ULONG numWritten;
  HANDLE hFile;
  RsH = FindResource(NULL, MAKEINTRESOURCE(IDR_DRIVER1), "DRIVER");
  if(!RsH)
  {
   printf( "FindResource Error\n" );
   return FALSE;
  }
  RsGH = LoadResource(NULL, RsH);
  if(!RsGH)
  {
   printf( "LoadResource Error\n" );
   return FALSE;
  }
  FileSize = SizeofResource(NULL, RsH);
  FilePtr = (unsigned char *)LockResource(RsGH);
  if(!FilePtr)
  {
   printf( "LockResource Error\n" );
   return FALSE;
  }
  hFile = CreateFile( Path ,FILE_ALL_ACCESS,0,NULL,CREATE_ALWAYS,0, NULL);
  if(INVALID_HANDLE_VALUE == hFile)
  {
   return FALSE;
  }
  WriteFile(hFile, FilePtr, FileSize , &numWritten, NULL);
  CloseHandle(hFile);
  return TRUE;
}
BOOL CleanUp(LPSTR Path)
{
 if(S_OK != DeleteFile(Path))
 {
  return FALSE;
 }
 return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
 if( ExtractDriver( "C:\\ABCD.SYS" ) )
 {
 //-------------------------------
 //드라이버 로드
 //-------------------------------

 CleanUp( "C:\\ABCD.SYS" );
 }
 return 0;
}


출처 : http://wezz.tistory.com/entry/Win32-%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84-%ED%8C%8C%EC%9D%BC-Resource%EC%97%90-%ED%8F%AC%ED%95%A8%EC%8B%9C%ED%82%A4%EA%B8%B0


'programming > windows' 카테고리의 다른 글

str ansi uni multi  (0) 2015.11.03
VC2010/2012에 WTL 설치  (0) 2013.10.11
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28
Win32 Ref.  (0) 2011.12.27

리소스 다루기 1

programming/windows 2012. 5. 23. 09:51

디버그뷰나 프로세스 익스플로러같은 프로그램을 보면 실행 파일 하나로 구성되어 있는데 프로그램을 실행하면 드라이버를 로딩하는 것을 볼 수 있습니다. 어떻게 하는 걸까요? 답은 간단한데요. 해당 드라이버 파일을 리소스에 포함시켜 놓고 런타임에 풀어서 사용하는 방식입니다. 리소스에 추가하는 방법은 간단합니다. Visual Studio 리소스 뷰에서 오른쪽 클릭하시고 임포트 하시면 됩니다. sys 파일 같은건 안보이시죠. *.*로 필터링한다음 추가하시면 됩니다. 그러면 어떤 타입을 추가할지 물어볼텐데요. 아무렇게나 이름을 지어 주시면 됩니다. Binary 이런 식으로요. 자 그렇다면 이제 이렇게 추가된 리소스 파일을 런타임에 어떻게 조작하는지를 알아보도록 합시다.

조작하는 API는 소 심플합니다. FindResource, LoadResource, SizeOfResource, LockResource라는 API가 사용됩니다. 각각의 함수 사용 방법을 알아보도록 합시다.

  1. HRSRC FindResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);  

FindResource 함수입니다. 이 함수는 우리가 분리해 내려고 하는 리소스를 찾는데 사용됩니다. hModule에는 리소스를 찾을 DLL의 모듈 핸들을 넣어주면 됩니다. NULL을 전달하면 현재 프로세스의 실행 파일 모듈에서 찾습니다. lpName에는 리소스 이름을 전달합니다. MAKEINTRESOURCE를 사용해서 리소스 ID를 문자열로 변환한 것을 대입해 주면 됩니다. 리소스 ID가 IDR_BINARY1이라면 MAKEINTRESOURCE(IDR_BINARY1)을 전달하면 되겠죠. lpType에는 리소스 타입을 넣어줍니다. 리소스 타입이 Binary라면 “Binary”를 전달하면 됩니다. 이렇게 넣어주면 리소스를 찾아서 해당 리소스의 핸들을 넘겨줍니다. 실패하면 NULL이 리턴되겠죠.

  1. DWORD SizeofResource(HMODULE hModule, HRSRC hResInfo);  

러소스의 크기를 구할 때 사용하는 함수입니다. hModule에는 모듈 핸들을 hResInfo에는 FindResource를 통해서 찾은 리소스 핸들을 넣어줍니다. 성공한 경우에는 리소스 크기를, 실패한 경우에는 0을 리턴합니다.

  1. HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);  

리소스를 로드하는 함수입니다. hModule에는 모듈 핸들을 hResInfo에는 FindResource로 찾은 리소스 핸들을 전달하면 되겠습니다. 해당 리소스의 포인터가 리턴됩니다.

  1. LPVOID LockResource(HGLOBAL hResData);  

마지막 함수입니다. LoadResource 한 메모리의 실제 포인터를 반환합니다. hResData에는 LoadResource에서 반환한 포인터를 넣어줍니다. 그럼 실제 포인터가 리턴됩니다.

종합해서 함수 하나로 만들어 봅시다. GetResourceInfo라는 함수입니다. module에서 type, name의 리소스를 찾아서 해당 리소스의 포인터를 data에 크기를 rsize에 있는지 없는지를 리턴 값으로 리턴해 주는 함수입니다.

  1. BOOL WINAPI GetResourceInfo(HMODULE module   
  2.                             , LPCTSTR type   
  3.                             , LPCTSTR name   
  4.                             , PVOID *data   
  5.                             , SIZE_T *rsize)   
  6. {   
  7.     DWORD size;   
  8.     HGLOBAL mem;   
  9.     PVOID ptr;   
  10.     HRSRC src;   
  11.   
  12.     src = FindResourceW(module, name, type);   
  13.     if(!src)   
  14.         return FALSE;   
  15.   
  16.     size = SizeofResource(module, src);   
  17.     if(!size)   
  18.         return FALSE;   
  19.   
  20.     mem = LoadResource(module, src);   
  21.     if(!mem)   
  22.         return FALSE;   
  23.   
  24.     ptr = LockResource(mem);   
  25.     if(!ptr)   
  26.         return FALSE;   
  27.   
  28.     __try  
  29.     {   
  30.         if(data)   
  31.             *data = ptr;   
  32.   
  33.         if(rsize)   
  34.             *rsize = size;   
  35.     }   
  36.     __except(EXCEPTION_EXECUTE_HANDLER)   
  37.     {   
  38.         return FALSE;   
  39.     }   
  40.   
  41.     return TRUE;   
  42. }  

여기까지만 설명하고 마칠까 하는데 아마 똑똑한 분들이라면 먼가 찜찜한 기분이 드실 거예요. 화장실가서 볼 일 보고 뭔가 정리하지 않고 나온 느낌이겠죠. 실컷 로딩하고 락하고 했는데 그것들을 해제하는 작업에 대해서는 하나도 설명하지 않았으니 말입니다. UnlockResource, FreeResource와 같은 함수들이 있긴 한데, 그것들은 사용하지 않아도 됩니다. 왜냐하면 여기서 사용하는 리소스 핸들을 구하고 하는 함수들은 로드된 모듈에서 포인터를 참조해 오는 일이거든요. 여러분이 획득한 모든 포인터 내지는 리소스는 hModule이 FreeLibrary 되는 시점에 같이 사라집니다. 따라서 별도로 해제할 필요가 없는 셈이죠. 참고로 그래도 나는 해제하겠다고 UnlockResource, FreeResource를 호출한들 실제 해당 함수에서 하는 일은 return 밖에는 없답니다.

출처 : http://www.jiniya.net/wp/archives/4366


'programming > windows' 카테고리의 다른 글

VC2010/2012에 WTL 설치  (0) 2013.10.11
리소스 다루기 2  (0) 2012.05.24
까먹지말자  (0) 2012.02.28
Win32 Ref.  (0) 2011.12.27
까먹까먹하는 PE rewrite  (0) 2011.09.16

까먹지말자

programming/windows 2012. 2. 28. 16:18
1. 유니코드, 멀티바이트

2. win32, console

3. UAC
 
4. 임플릭트 링킹
 

'programming > windows' 카테고리의 다른 글

리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
Win32 Ref.  (0) 2011.12.27
까먹까먹하는 PE rewrite  (0) 2011.09.16
LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR  (0) 2011.09.11

Win32 Ref.

programming/windows 2011. 12. 27. 16:03

http://winapi.freetechsecrets.com/

'programming > windows' 카테고리의 다른 글

리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28
까먹까먹하는 PE rewrite  (0) 2011.09.16
LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR  (0) 2011.09.11

까먹까먹하는 PE rewrite

programming/windows 2011. 9. 16. 11:07
트리
- 이미지_엔티_헤더
-- 이미지_파일_헤더

-- 이미지_옵셔널_헤더32
--- 이미지_데이터_디렉토리
---- 2번째 데이터디렉토리 버츄얼어드레스 (임포트 테이블 주소)
---- 임포트 테이블은 이미지_임포트_디스크립터
---- 이미지_임포트_디스크립터 {오리지날퍼스트텅크 - 이미지_텅크_데이터 구조체 배열}
---- 이미지_텅크_데이터 (이미지_임포트_바이_네임 구조체 포인터로 해석)
----- 이미지_임포트_바이_네임 

- 이미지_섹션_헤더


이미지_엔티_헤더
{
시그너쳐 4D 5A
파일헤더 이미지_파일_헤더
옵셔널헤더 이미지_옵셔널_헤더32
}


파일헤더 이미지_파일_헤더
{
머신 : i386
넘버오브섹션 : 섹션수
타임스템프 : 생성시간
캐릭터리스틱 : exe이냐, dll이냐
}


옵셔널헤더 이미지_옵셔널_헤더32
{
어드레스오브엔트리포인트 : PE파일 실행 시 실행될 첫 번째 명령의 RVA 주소
이미지베이스 : PE 파일을 위한 로드 주소, 로드 시작 주소
사이즈오브이미지 : 메모리에 풀린 PE이미지 전체크기
사이즈오브헤더스 : 헤더와 섹션 테이블을 합친 크기
이미지_데이타_디렉토리 (구조체의 배열) : 임포트 어드레스 테이블과 같은 중요한 데이터 구조체의 RVA 값을 갖고있음
}


이미지_섹션_헤더 - 이미지_파일_헤더 구조체 멤버의 넘버오브섹션 영역에 의해 결정
{
네임 : 섹션의 이름을 가지고 있음, 최대 길이가 8바이트
버츄얼어드레스 : 섹션RVA, 메모리 로딩시 RVA 1000h를 갖고있다면 이미지베이스+1000h에 위치하게 됨
사이즈오브로우데이타 : 한 섹션 데이터의 크기
포인터투로우데이타 : 섹션의 시작을 담고 있는 파일 오프셋
캐릭터리스틱 : 섹션의 실행코드, 초기/비초기화된 데이터와 플래그를 갖고 있음
}


이미지_데이터_디렉토리 - 이미지_옵셔널_헤더32의 멤버중 하나임, 임포트 테이블 설명
{
버추얼어드레스 : 데이터 구조체의 RVA
isize : 버추얼어드레스에서 참조된 데이터 구조체의 크기
}

데이터디렉토리에는 16개의 인덱스가 있음
데이터디렉토리는 PE파일의 중요한 데이터구조체의 위치와 크기를 가지고 있음

임포트 테이블에는 각 인덱스(멤버)와 정보(인포 인사이드)가 있음
ex)
0 Exprot symbols
1 Import symbols
2 Resources
5 Base relocation
11 Bound Import
12 Import Address Table


임포트 테이블의 주소
- 2번째 데이터 디렉토리의 버츄얼어드레스


임포트 테이블은 이미지_임포트_디스크립터 구조체의 배열임


각 구조체는 PE 파일이 심볼로 import해오는 DLL에 대한 정보가 있음
(dll 5 import - 5개의 요소가 있음)


이미지_임포트_디스크립터
{
union
캐릭터리스틱
오리지널퍼스트텅크
오리지널퍼스트텅크 - 이미지_텅크_데이터 구조체 배열의 RVA
(이미지_텅크_데이터는 이미지_임포트_바이_네임 구조체 포인터로 해석)
ends
타이스탬프
포워더체인
네임
퍼스트청크
}

이미지_임포트_바이_네임
{
힌트 : Import 한 함수가 추가될때마다 1씩 증가 (베이스는 0)
네임 : 실제 임포트 함수 이름
}


PE로더가 프로그램을 실행 시킬 때 관련 DLL을 해당 프로세스 주소공간에 로드
그 후 메인 프로그램의 임포트 함수에 대한 정보를 추출
이를 이용해 메인 프로그램 함수 주소를 구하기 위해 DLL을 찾음
PE로더가 그런 함수를 구하기 위해 DLL에서 찾는 부분이 바로 익스포트 테이블

'programming > windows' 카테고리의 다른 글

리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28
Win32 Ref.  (0) 2011.12.27
LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR  (0) 2011.09.11

LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR

programming/windows 2011. 9. 11. 20:40
C = const(constant)
W = wide char
T = t_char

LPSTR = long pointer string = char * 
LPCSTR = long pointer constant string = const char * 
LPWSTR = long pointer wide string = w_char * 
LPCWSTR = long pointer constant wide string = const w_char * 
 

'programming > windows' 카테고리의 다른 글

리소스 다루기 2  (0) 2012.05.24
리소스 다루기 1  (0) 2012.05.23
까먹지말자  (0) 2012.02.28
Win32 Ref.  (0) 2011.12.27
까먹까먹하는 PE rewrite  (0) 2011.09.16