NSIS 사용 중에 다음과 같은 메시지가 뜰 때가 있다.
NSIS error
error launching installer
파일이 깨졌거나 등 다양한 이유가 있을 수 있지만...
설치된 OS가 사용자의 '국가 및 언어 옵션 > 고급'에 설정된
'유니코드를 지원하지 않는 프로그램용 언어'가 지원하지 않을 경우도 있다.
해당 프로그램이 윈도우2003 지원하지 않는 줄 알고 개삽질했네 ㅡㅜ
해본 것/팁과 정보
- NSIS 오류 2009.11.06
- 윈도우 메시지 루프 Pause 막기 2009.11.05
- Themida 2009.10.23
- VS 2003에서 VS 2008로 이전 #3 2009.10.23
- VS 2003에서 VS 2008로 이전 #2 2009.10.22
- VS 2003에서 VS 2008로 이전 #1 2009.10.22
- map 파일에서 특정 주소의 함수 찾기 2009.09.18
- SQL Server 2000에서 SQL Server 2008로 이전 #2 2009.09.14
- SQL Server 2000에서 SQL Server 2008로 이전 #1 2009.09.14
- unikey 2009.07.10
NSIS 오류
윈도우 메시지 루프 Pause 막기
해당 시간 동안을 건너뛰는 효과를 가져온다.
사례 1. App 창을 윈도우 영역 밖으로 걸치게 하고 메뉴 키나 Shift + F10을 누르는 경우
; WM_CONTEXTMENU 를 무시하자.
사례 2. ALT 키나 시스템 메뉴를 이용하는 경우
; WM_SYSCOMMAND의 SC_KEYMENU, SC_MOUSEMENU, SC_PREVWINDOW, SC_NEXTWINDOW, SC_MOVE를 무시하자.
사례 3. 최대화, 최소화 버튼 등을 이용하는 경우
; WM_NCLBUTTONDOWN의 HTSYSMENU, HTMAXBUTTON, HTCAPTION, HTMINBUTTON, HTCLOSE를 무시하자.
; 각 버튼의 기능을 따로 구현하는 편이 안전하다.
사례 4. 캡션 영역을 이용하는 경우
; WM_NCRBUTTONDOWN을 무시하자.
로직 쓰레드는 메시지 루프와 분리시키는게 조금 더 안전하다는 ;;
프로세스 목록에서 해당 쓰레드를 찾아내서 Pause 시키는 경우도 고려하는 게 좋다.
Themida
클라이언트 분석을 어렵게 하기 위해 exe 암호화 툴이 필요하다.
써본 건 Asprotect랑 Themida 밖에 없는데...
요새 대세는 Themida 인 듯...
Asprotect는 USER_POLYBUFFER를 통해
특정 영역의 코드에 더미 코드를 집어넣는 방식이었다.
Themida는 분석하기 더 어렵게하기 위해 다음과 같은 기능을 추가로 제공한다.
## VM Macro
; VM_START ~ VM_END
; SecureEngine VM에서 코드 실행
* 주의
; iteration 피할 것
; switch 동작 안할 수 있음
; exception 동작 안할 수 있음
## VM Macro with v level
; VM_START_WITHLEVEL(x) ~ VM_END
; v level : 0 ~ 255
; 20 이상은 vm 코드가 커질 우려가 있음
; Dynamic Opcodes 옵션이 켜져 있어야 함
; for harder
## CodeReplace
; CODEREPLACE_START ~ CODEREPLACE_END
; application code를 garbage code로 변경
; 실제 코드는 secure engine 코드에 encrypt 해서 저장
; 실행될 때 dynamic하게 decrypt해서 실행
## Encode
; ENCODE_START ~ ENCODE_END
; ENCODE_START에서 코드 블럭 decrypt
; ENCODE_END에서 코드 블럭 encrypt
; ENCODE_END가 불리지 않고 return하지 않도록 주의
## Clear
; CLEAR_START ~ CLEAR_END
; 어플리케이션에서 한번 실행되는 코드에 사용
; 사용후 삭제됨
## Unprotected
; UNPROTECTED_START ~ UNPROTECTED_END
; unprotect 상태에서만 실행될 수 있는 코드
; unprotect된 코드가 릴리즈되는 실수를 막기 위해 사용
가장 이상적인 부분은 모든 것을 서버에서 처리하도록 해야하는데...
현실상 그럴 수 없으니 위와 같은 툴로 분석하게 힘들게라도 해서
해커를 귀찮게 해야한다. ㅡㅜ
VS 2003에서 VS 2008로 이전 #3
UAC 관련해서 2003에서는 Resource에 다음과 같은 manifest를 추가해줘야 했는데...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.1.0.0"
processorArchitecture="x86"
name="testApp"
type="win32"
/>
<description>Test App</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
2008에서는 프로젝트 속성에 추가되었다.
Property > Configuration Properties > Linker > Manifest File
VS 2003에서 VS 2008로 이전 #2
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc already defined in LIBCMT.lib(malloc.obj) LIBCMTD.lib(dbgheap.obj) : error LNK2005: __recalloc already defined in LIBCMT.lib(recalloc.obj) LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize already defined in LIBCMT.lib(msize.obj)
STL 때문인 것 처럼 보이고 해결책은 /NODEFAULTLIB:LIBCMT 라고 함
좀 야매인거 같아서 찜찜하다능
참조 : http://kign.blogspot.com/2008_06_01_archive.html : Visual Studio Tricks
VS 2003에서 VS 2008로 이전 #1
OS 버젼을 확인할 때 쓰던 _winmajor, _winminor 가 사라졌다.
이제는 GetVersionEx를 써야할 시간
map 파일에서 특정 주소의 함수 찾기
특정 주소의 memory address를 Ctrl + F로 찾아서 function description을 보면 된다능
자세한 map file 설명은 http://kuaaan.tistory.com/102 참조
SQL Server 2000에서 SQL Server 2008로 이전 #2
로그를 지우는데 사용했던 'backup log with no_log'가 사라졌다.
디스크 용량 때문에 로그 지우고 로그 파일 크기를 줄이는 식으로 처리하고 있었는데 난감 난감.
SQL Server 2008에서는 복구 모델을 '단순 복구 모델'로 바꾸는 식으로 처리해야 한다는...
* SQL Server 2000
backup log database_name with no_log -- 트랜잭션 로그 삭제
Go
use database_name
Go
dbcc shrinkfile (database_log, 0) -- 트랜잭션 로그 파일 줄이기
Go
* SQL Server 2008
alter database database_name set recovery simple -- 단순 복구 모델로
Go
use database_name
Go
dbcc shrinkfile (database_log, 0) -- 트랜잭션 로그 파일 줄이기
Go
alter database database_name set recovery full -- 기존 복구 모델로
Go
http://msdn.microsoft.com/ko-kr/library/ms144262.aspx
SQL Server 2000에서 SQL Server 2008로 이전 #1
메시지 15138, 수준 16, 상태 1, 줄 1
데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다.
SQL Server Management Studio를 이용한다면
보안 > 스키마 에서 해당 계정 이름으로 된 스키마를 제거하면 삭제 가능하다능 ;;
SQL 명령문을 이용한다면
drop schema schema_name
'sp_change_user_login'를 이용해서 기존 데이터베이스 사용자를 SQL Server 로그인에 매핑하는 게 더 올바른 사용인 것 같다.
unikey
베트남에서 베트남어 입력할 때는 대부분 unikey라는 외부 입력기를 사용한다.
공식사이트 : http://www.unikey.org/