3. 본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 3
4. 배포용 문서
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 4
5. 배포용 문서 (Cont’d)
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 5
[배포용 문서로 저장]는 고쳐선 안 될 문서에 대하여
내용을 변경하지 못하도록 만들어 줍니다.
http://help.hancom.com/hoffice/webhelp/9.0/ko_kr/hwp/file/send_to_mail/publish(save).htm
6. 배포용 문서 (Cont’d)
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 6
[배포용 문서로 저장]는 고쳐선 안 될 문서에 대하여
내용을 변경하지 못하도록 만들어 줍니다.
http://help.hancom.com/hoffice/webhelp/9.0/ko_kr/hwp/file/send_to_mail/publish(save).htm
7. 내용 변경하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 7
한/글 자체의 버그를 사용하기
파일을 직접 변경하기
8. 한/글 자체의 버그 사용하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 8
http://850530.tistory.com/185
9. 한/글 자체의 버그 사용하기 (Cont’d)
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 9
http://850530.tistory.com/185
10. 본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 10
11. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 11
12. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 12
13. 기초 지식
CompoundFileBinaryFormat
objidl.h의IStorage,IStream사용
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 13
IStorage *storage,*substorage;
IStream *header,*info;
StgOpenStorageEx(path,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,STGFMT_STORAGE,0,NULL,0,IID_IStorage,(void**)&storage);
storage->OpenStream(L"FileHeader",NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,&header);
header->Seek(li(36),STREAM_SEEK_SET,NULL);
header->Read(buffer,1,NULL);
header->Seek(li(36),STREAM_SEEK_SET,NULL);
header->Write(buffer,1,NULL);
storage->OpenStream(L"DocInfo",NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,&info);
storage->DestroyElement(L"BodyText");
storage->RenameElement(L"ViewText",L"BodyText");
storage->OpenStorage(L"BodyText",NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,0,&substorage);
substorage->EnumElements(0,NULL,0,&enumstat);
storage->OpenStorage(L"Scripts",NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,0,&substorage);
storage->OpenStorage(L"DocHistory",NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,0,&substorage);
li : int → LARGE_INTEGER / uli : int → ULARGE_INTEGER
14. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 14
15. SEED 찾기
HWPTAG_DISTRIBUTE_DOC_DATA의첫4바이트
SectionN스트림에서의 구조
0~3바이트:레코드헤더
4~7바이트:SEED
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 15
stream->Seek(li(4),STREAM_SEEK_SET,NULL);
stream->Read(data,256,NULL);
seed=(data[3]<<24)+(data[2]<<16)+(data[1]<<8)+data[0];
16. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 16
17. 난수 배열 만들기
srand(seed)
a=rand()&0xFF, b=rand()&0x0F+1→배열에a값을 b번횟수만큼삽입
배열크기가 256이될때까지 반복
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 17
for(i=0;i<256;++i)
{
if(b==0)
{
a=rand()&0xff;
b=(rand()&0x0f)+1;
}
random[i]=a;
b--;
}
18. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 18
19. 해시코드 추출하기
offset=(Seed&0x0f)+sizeof(UINT)
난수배열과 배포용문서 데이터를 XOR연산
offset부터80바이트가해시코드,2바이트가옵션플래그
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 19
for(i=0;i<256;++i)data[i]=data[i]^random[i];
offset=(seed&0x0f)+sizeof(unsigned int);
for(i=0;i<80;++i)hash[i]=data[offset+i];
for(i=0;i<2;++i)flag[i]=data[offset+80+i];
*해시코드는비밀번호의SHA-1값을문자열(UTF-16LE)으로변환한것
20. 기초 지식
Seed 찾기
난수 배열 만들기
해시코드 추출하기
해시코드로 복호화하기
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 20
21. 해시코드로 복호화하기
복호화할스트림
ViewText/SectionN→BodyText/SectionN
Scripts/JScriptVersion
Scripts/DefaultScript
DocHistory/HistoryLastDoc
DocHistory/VersionLogN
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 21
22. 해시코드로 복호화하기 (Cont’d)
해시코드의 처음16바이트로 AES-128ECB알고리즘을 사용해본문 레코드를복호화할 수있음
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 22
#include<openssl/ssl.h>
for(i=0;i<16;++i)key[i]=hash[i];
stream->Stat(&stat,STATFLAG_NONAME);
inp=(unsigned char*)malloc(stat.cbSize.QuadPart-260);
outp=(unsigned char*)malloc(stat.cbSize.QuadPart-260);
stream->Read(inp,stat.cbSize.QuadPart-260,NULL);
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit(&ctx,EVP_aes_128_ecb(),key,NULL);
EVP_DecryptUpdate(&ctx,outp,&outlen,inp,stat.cbSize.QuadPart-260);
EVP_DecryptFinal(&ctx,outp+outlen,&tmp);
outlen=outlen+tmp;
stream->Seek(li(0),STREAM_SEEK_SET,NULL);
stream->SetSize(uli(outlen));
stream->Write(outp,outlen,NULL);
storage->Commit(STGC_OVERWRITE);
23. 결과
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 23
24. 본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 24
25. 사용 목적에 따른 문서 처리 방법 차별화
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 25
문서 내용 변경 방지
문서 내용 복사 방지
26. 문서 내용 변경 방지
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 26
27. 문서 내용 복사 방지
본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 27
28. 본 제 품 은 한 글 과 컴 퓨 터 의 한 / 글 문 서 파 일 ( . H W P ) 공 개 문 서 를
참 고 하 여 개 발 하 였 습 니 다 . 28