NSIS 사용 중에 다음과 같은 메시지가 뜰 때가 있다.

NSIS error
error launching installer

파일이 깨졌거나 등 다양한 이유가 있을 수 있지만...
설치된 OS가 사용자의 '국가 및 언어 옵션 > 고급'에 설정된
'유니코드를 지원하지 않는 프로그램용 언어'가 지원하지 않을 경우도 있다.

해당 프로그램이 윈도우2003 지원하지 않는 줄 알고 개삽질했네 ㅡㅜ

728x90
윈도우 메시지 루프에서 로직을 처리할 경우 메시지 루프를 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 시키는 경우도 고려하는 게 좋다.

728x90

클라이언트 분석을 어렵게 하기 위해 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된 코드가 릴리즈되는 실수를 막기 위해 사용

가장 이상적인 부분은 모든 것을 서버에서 처리하도록 해야하는데...
현실상 그럴 수 없으니 위와 같은 툴로 분석하게 힘들게라도 해서
해커를 귀찮게 해야한다. ㅡㅜ



728x90

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


728x90
아래와 같은 알수없는 LIBCMTD.lib와 LIBCMT.lib의 충돌

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
728x90

OS 버젼을 확인할 때 쓰던 _winmajor, _winminor 가 사라졌다.
이제는 GetVersionEx를 써야할 시간

728x90
000X:00ABCDEF [function description] [memory address] X X [obj file name]

특정 주소의 memory address를 Ctrl + F로 찾아서 function description을 보면 된다능

자세한 map file 설명은 http://kuaaan.tistory.com/102 참조
728x90
SQL Server 2008로 오면서 사라진 기능이 몇 개 있는데...
로그를 지우는데 사용했던 '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

728x90
SQL Server 2000 데이터를 SQL Server 2008에서 열고 나서 기존 사용자 계정을 제거하려고 하면 다음과 같은 오류가 발생할 수 있다.

메시지 15138, 수준 16, 상태 1, 줄 1
데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다.

SQL Server Management Studio를 이용한다면
보안 > 스키마 에서 해당 계정 이름으로 된 스키마를 제거하면 삭제 가능하다능 ;;

SQL 명령문을 이용한다면
drop schema schema_name

'sp_change_user_login'를 이용해서 기존 데이터베이스 사용자를 SQL Server 로그인에 매핑하는 게 더 올바른 사용인 것 같다.

728x90

베트남에서 베트남어 입력할 때는 대부분 unikey라는 외부 입력기를 사용한다.

공식사이트 : http://www.unikey.org/

728x90

+ Recent posts