Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
심심해서 적어보는 ReverseMe ! 풀이 [2]
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2010. 8. 24. 01:46 ) | 신고


 



C 언어로 전부 해석했으니 참고 ' ' ;


 #include <windows.h>

 #define ERROR_TITLE "Key File ReverseMe"


 void main(void){

     // GetModuleHandleA, LoadIconA, LoadCursor 생략

     HANDLE                hFile;
     BYTE                    buffer[70];
     DWORD                 rCnt = 0;
     DWORD                 pbuf,Cnt;
 

     hFile = CreateFileA("Keyfile.dat",0xC0000000,0x03,0x00,0x03,0x05B9E0B9,0x00);

     if ( hFile == INVALID_HANDLE_VALUE ){
          MessageBoxA( NULL,
                                 "Evaluation period out of date. Purchase new license",
                                  ERROR_TITLE,
                                  0x00 );
           ExitProcess(0);
           return;
     }

     if ( !ReadFile(hFile,buffer,0x46,&rCnt,NULL) )
          goto INCORRECT_VALUE;

    pbuf = Cnt = 0;

     if ( rCnt < 0x10 )
          goto INCORRECT_VALUE;

     while(TRUE){
          if ( buffer[pbuf] == 0 )
               break;
          else if ( buffer[pbuf] == 0x47 )
               Cnt++;
          pbuf++;
     }
     if ( Cnt < 0x08 )
         goto INCORRECT_VALUE;

     MessageBoxA(NULL,"You really did it! Cngratz !!!",ERROR_TITLE,0x00);
     ExitProcess(0);
     return;

INCORRECT_VALUE:
     MessageBoxA(NULL,"Keyfile is not valid. Sorry.",ERROR_TITLE,0x00);
     ExitProcess(0);
     return;

 }


[API] 모든 드라이브 경로 구하기
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2010. 4. 11. 04:39 ) | 신고


문득, MSDN에서 놀다가 FindFirstVolume 함수가 보이길래 한번 써보도록 해보자~

일단, 모든 드라이브의 경로를 구하기 위해선 아래와 같은 함수가 필요하다.

FindFirstVolume, FindNextVolume, FindVolumeClose, GetVolumePathNamesForVolumeName

마지막에 무지하게 기네 . . .

일단, 하나하나 함수의 구조를 보자 'ㅅ'~




 HANDLE WINAPI FindFirstVolume(
   __out  LPTSTR lpszVolumeName,
   __in   DWORD cchBufferLength
 );


lpszVolumeName [out]
- GUID 볼륨 코드를 읽어온다.

cchBufferLength [in]
- 위 lpszVolumeName 의 문자열 메모리 크기를 집어넣으면 된다.

이 함수의 리턴값은 반드시 어떤곳에 저장해둬야 합니다.
실패하면, 리턴값은 INVALID_HANDLE_VALUE 으로 변하고,
GetLastError로 정확한 오류를 볼 수 있습니다.




 BOOL WINAPI FindNextVolume(
   __in   HANDLE hFindVolume,
   __out  LPTSTR lpszVolumeName,
   __in   DWORD cchBufferLength
 );


hFindVolume [in]
- FindFirstVolume 함수에서 구한 핸들값을 집어넣는다.

lpszVolumeName [out]
- GUID 볼륨 코드를 읽어온다.

cchBufferLength [in]
- 위 lpszVolumeName 의 문자열 메모리 크기를 집어넣으면 된다.


리턴값으로 다음 볼륨이 존재 유무를 확인할 수 있다.




 BOOL WINAPI FindVolumeClose(
   __in  HANDLE hFindVolume
 );


hFindVolume [in]
- FindFirstVolume 함수에서 구한 핸들값을 집어넣는다.




 BOOL WINAPI GetVolumePathNamesForVolumeName(
   __in   LPCTSTR lpszVolumeName,
   __out  LPTSTR lpszVolumePathNames,
   __in   DWORD cchBufferLength,
   __out  PDWORD lpcchReturnLength
 );


lpszVolumeName [in]
- GUID 볼륨 코드를 넣는다.

lpszVolumePathNames [out]
- 해당 GUID 볼륨 코드을 가진 볼륨의 메인 디렉토리 경로를 구한다.

cchBufferLength [in]
- lpszVolumePathNames의 문자열 메모리 크기를 집어넣으면 된다.

lpcchReturnLength [out]
- 해당 함수가 성공할 경우 디렉토리 경로의 문자열 갯수가 여기에 담긴다.




Ex ) 모든 드라이브의 경로를 구하는 소스


 // 2010. 04. 11 Volume Find
 // Coding by Fore ( http;//foreblog.tistory.com/ )

 #include <windows.h>

 #include <tchar.h>
 #include <stdio.h>


 // 유니코드 호환을 위해 printf 를 매크로 설정해둔다.
 #ifdef UNICODE
 #define lprintf wprintf
 #else
 #define lprintf printf
 #endif


 int main(void){

 HANDLE                    hVolume = NULL;                  // 볼륨 찾기 핸들
 DWORD                     RetnVal = 0;                         // 리턴값
 TCHAR                      VolumeName[MAX_PATH+1]; // 볼륨 저장 버퍼
 TCHAR                      Path[MAX_PATH+1];             // 디렉토리 버퍼

 // 버퍼 초기화
 ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
 ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));

 // 볼륨 이름 찾기 시작
 hVolume = FindFirstVolume(VolumeName,MAX_PATH);
 if ( hVolume == INVALID_HANDLE_VALUE )
      return 0;
 // 볼륨 이름을 통해 디렉토리 경로를 구해온다.

 GetVolumePathNamesForVolumeName(VolumeName,Path,MAX_PATH,&RetnVal);
 // 출력

 lprintf(_T("%s %s\n"),Path,VolumeName);

 // 버퍼 초기화
 ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
 ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));

 // 반복
 while(FindNextVolume(hVolume,VolumeName,MAX_PATH)){
    GetVolumePathNamesForVolumeName(VolumeName,Path,MAX_PATH,&RetnVal);
    lprintf(_T("%s %s\n"),Path,VolumeName);
    ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
    ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));
 }
 // 볼륨 찾기 종료

 FindVolumeClose(hVolume);

 // 핸들 초기화
 hVolume = NULL;
 RetnVal = 0;

 return 0;
 }


추가로, 해당 드라이브 경로가 하드디스크(HDD)인지 CD/DVD-ROM(ODD) 인지 확인하고자 하면

GetDriveType 을 쓰면 된다.
( 이거로 그냥 A드라이브부터 Z드라이브까지 경로 돌려도 위와 같은 결과를 얻을 수 있다. )




 UINT WINAPI GetDriveType(
   __in_opt  LPCTSTR lpRootPathName
 );


lpRootPathName [in, optional]
- 드라이브 경로를 적으면 된다.
만약, 이 값에 NULL 이 들어갈 경우, 현재 위치의 드라이브의 타입을 구하게 된다.

드라이브 타입을 확인은 리턴값으로 확인한다.

리턴값은 http://msdn.microsoft.com/en-us/library/aa364939(VS.85).aspx 에서 확인 가능하다.


Written by Fore  
http://foreblog.tistory.com

'Programming > Programming Talk' 카테고리의 다른 글

모처럼이니까 !  (0) 2011.08.07
심심해서 적어보는 ReverseMe ! 풀이 [2]  (6) 2010.08.24
[업데이트] Image Downloader Beta 1.1v  (4) 2010.02.10
Image Downloader Beta 1.0  (8) 2010.01.18
WAV 구조 (?)  (2) 2009.08.26
[업데이트] Image Downloader Beta 1.1v
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2010. 2. 10. 15:04 ) | 신고



 
Programming by Fore
http://foreblog.tistory.com


1.1v 에서 추가된 기능은 ?

> 이어 받기 기능 추가
> 제작자 정보 메뉴처리
> 인터넷 연결시 어이없이 다운완료 됐던 버그 수정
> 인터넷 속도식 조금 수정 ( 별반 차이 없을듯 ; )

[ 업데이트 예정 ]
1.2v 에서 추가될 기능은 ?

> 프로세서 우선 순위 변경 ( 고사양 게임에서 렉이 조금 줄어들거임 이거 쓰면 )
> 알림창 사용자 지정 수정
> 깨진 이미지 파일 검사 기능
> 잔버그 보이면 수정
> 의견 받아서 더 추가할 예정

지인 한정으로 필요한 사람은 네이트온 들어오셈

프로그램 자동 업데이트 기능은 넣을 생각 없습니다 [ . . . ]



 

'Programming > Programming Talk' 카테고리의 다른 글

심심해서 적어보는 ReverseMe ! 풀이 [2]  (6) 2010.08.24
[API] 모든 드라이브 경로 구하기  (8) 2010.04.11
Image Downloader Beta 1.0  (8) 2010.01.18
WAV 구조 (?)  (2) 2009.08.26
중단  (124) 2009.07.13
Image Downloader Beta 1.0
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2010. 1. 18. 12:02 ) | 신고





1. 프로그램을 켜서 원하는 사이트를 선택 ( 맨 위 ▼ ) 버튼 클릭

해당 사이트가서 원하는 태그 이름을 적고, 몇페이지부터 몇페이지까지 다운받고 싶나

적으면 된다.



위 스샷을 확대에서 왼쪽 위를 보면 " tree " 이게 태그명이다.



다운받기 시작하면 위와 같이 나온다.


현재 베타버전임. 정식으로 바뀌어도 지인 한정으로만 배포할 예정이고
( 이미 배포중이지만 . . . )

지인중에서 다른 사이트에 올린게 내 눈에 적발될시 프로그램 중단할 예정이다.
( 프로그램 안에 컨트롤 가능하게 해둠 )

그리고 프로그램 내에 버그가 좀 있다.

1. 다운로드 속도 변화
( 식을 다시 짜야할거 같다 - - ; 귀찮아서 대충 계산해서 적었더니 ; )
2. 중간에 원인 불명으로 다운로드가 멈추는 것 - -;
( 어떤 때에 발동하나를 몰라서 ; 가끔가다 그러던데 . . . )

그 외엔 없다. ( 적어도 내가 사용한 도중엔 . . . )

향후 귀찮지 않으면 지원해 볼 예정

1. 이어받기

2. 조금더 세심한 환경설정 구성

개발이 좀 늦은건, 귀. 찮. 아. 서. 다.
( 안그래도 허접한데 게으르기까지 해서 . . . )


'Programming > Programming Talk' 카테고리의 다른 글

심심해서 적어보는 ReverseMe ! 풀이 [2]  (6) 2010.08.24
[API] 모든 드라이브 경로 구하기  (8) 2010.04.11
[업데이트] Image Downloader Beta 1.1v  (4) 2010.02.10
WAV 구조 (?)  (2) 2009.08.26
중단  (124) 2009.07.13
WAV 구조 (?)
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2009. 8. 26. 21:22 ) | 신고





RIFF - Resource Interchange File Format
ChunkID - ID 정보를 ASCII 로 포함한다.
ChunkSize - 36 + SubChunk2Size fileSize 크기
Format - fmt 와 data로 이루어져있다.


FMT
Subchunk1ID - wave file의 정보를 가지고있다.
Subchunk1Size - 16 for PCM.
AudioFormat - 아날로그 - 디지털 변환 방법
NumChannels - Mono = 1, Stereo = 2 채널 숫자 : 스테레오/모노
SampleRate - 표본화율
ByteRate - SampleRate * NumChannels * BitsPerSample/8 용량
BlockAlign - NumChannels * BitsPerSample/8
BitsPerSample - 8 bits = 8, 16 bits = 16

DATA - data는 subchunk 자료(전체 데이터길이 정보)를 가지고있고 사실음의 크기를 포함한다Subchunk2ID
Subchunk2Size - NumSamples * NumChannels * BitsPerSample/8 이것은 자료에 있는 바이트 수이다. 또한 이 수 뒤에 subchunk의 크기로 이것을 생각할 수 있다.
data - The actual sound data.

◎ 원문

The canonical WAVE format starts with the RIFF header:
0 4 ChunkID Contains the letters "RIFF" in ASCII form  (0x52494646 big-endian form).
4 4 ChunkSize 36 + SubChunk2Size, or more precisely:
4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
 - This is the size of the rest of the chunk
 following this number. This is the size of the
 entire file in bytes minus 8 bytes for the
 two fields not included in this count:
 ChunkID and ChunkSize.
8 4 Format Contains the letters "WAVE"  (0x57415645 big-endian form).
 - The "WAVE" format consists of two subchunks: "fmt " and "data":
 The "fmt " subchunk describes the sound data's format:
12 4 Subchunk1ID Contains the letters "fmt "  (0x666d7420 big-endian form).
16 4 Subchunk1Size 16 for PCM. This is the size of the
 - rest of the Subchunk which follows this number.
20 2 AudioFormat PCM = 1 (i.e. Linear quantization)
 - Values other than 1 indicate some form of compression.
22 2 NumChannels Mono = 1, Stereo = 2, etc.
24 4 SampleRate 8000, 44100, etc.
28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8
32 2 BlockAlign == NumChannels * BitsPerSample/8
 - The number of bytes for one sample including
 all channels. I wonder what happens when
 this number isn't an integer?
34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.
2 ExtraParamSize if PCM, then doesn't exist X ExtraParams space for extra parameters
 - The "data" subchunk contains the size of the data and the actual sound:
36 4 Subchunk2ID Contains the letters "data"  (0x64617461 big-endian form).
40 4 Subchunk2Size == NumSamples * NumChannels *BitsPerSample/8
 - This is the number of bytes in the data.
 You can also think of this as the size
 of the read of the subchunk following this number.
44 * Data The actual sound data.

이건 C언어로 들어가야하나..

아무튼 참고자료


'Programming > Programming Talk' 카테고리의 다른 글

심심해서 적어보는 ReverseMe ! 풀이 [2]  (6) 2010.08.24
[API] 모든 드라이브 경로 구하기  (8) 2010.04.11
[업데이트] Image Downloader Beta 1.1v  (4) 2010.02.10
Image Downloader Beta 1.0  (8) 2010.01.18
중단  (124) 2009.07.13
Category
분류 전체보기 (605)
Notice (6)
Programming (79)
Release Program (19)
Release Patch (14)
Programming Talk (46)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total :
Today :
Yesterday :