Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
너무나 뛰어난 최적화 기능.
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2015. 9. 6. 01:15 ) | 신고

 

 

Visual Studio 2013 의 너무나 뛰어난 최적화 기능에 감탄을 금치 못했습니다.

( 작년까지만해도 2008 을 사용하고 있어서 전혀 몰랐습니다만... )

 

Thread Local Storage(TLS) 를 넣었는데, 이것이 최적화되어 사라져버리는 현상이 일어났습니다 !

 

문제의 코드

 

 

 #include <windows.h>

 

 #pragma comment(linker,"/INCLUDE:__tls_used")

 

 void __stdcall callback_func(...){

     MessageBoxA(NULL,"Hello world",NULL,MB_OK);

 }

 

 #pragma data_seg(".CTR$XLB")

   PIMAGE_TLS_CALLBACK p_tls = callback_func;

 #pragma data_seg()

 

 int main(void){

   system("pause");

   return 0;

 }

 

 

혹시 문제를 발견하셨나요 ?

 

문제는 . . .

 

프로그램 진입점(main) 함수 이하로 p_tls 변수가 사용된 흔적이 없어

 

p_tls 변수와 callback_func 함수가 최적화로 사라집니다 !!

 

이 너무나 훌륭한 최적화 기능에 1시간동안 씨름에 붙었습니다 -_- ; ; ;

 

 

해결 방법은 ?

 

 

솔루션 탐색기 창을 통해 단일 파일의 경우 위와 같이 파일 하나를 오른쪽 마우스 클릭하거나

 

프로젝트 혹은 솔루션 크기일 경우 프로젝트나 솔루션을 오른쪽 마우스 클릭해서

 

속성을 들어간 후

 

 

'C/C++ > 최적화 > 전체 프로그램 최적화' 를 '예(/GL)' 에서 '아니요' 로 변경하시면 됩니다.

 

오시오키나마이키갸루 암호화 루틴
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2015. 8. 31. 18:16 ) | 신고

 

 

 

"""

 Python 2.7 pseudo-code

 Present by FORE

 http://foreblog.tistory.com/

"""

 

decode_key = []


def create_key_map(adlr):
 if len(decode_key):
  del decode_key[:]
 adlr = adlr&0x7FFFFFFF
 adlr |= (adlr<<0x1F)
 for i in range(0x1F):
  decode_key.append(adlr&0xFF)
  adlr = (adlr>>0x08) | ((adlr&0xFFFFFFFE)<<0x17)

 

def decode(buf,adlr):
 create_key_map(adlr)
 buf = list(struct.unpack('B'*len(buf),buf))
 j = 0
 for i in range(len(buf)):
  buf[i] ^= decode_key[j%0x1F]
  j += 1
 buf = struct.pack('B'*len(buf),*buf)
 return buf

 

 

 

gotoxy in windows python
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2015. 8. 30. 22:50 ) | 신고

 

[ありがとうございます!!]

 

 

 

import ctypes


def gotoxy(x,y):
 return ctypes.windll.kernel32.SetConsoleCursorPosition(ctypes.windll.kernel32.GetStdHandle(-11),(((y&0xFFFF)<<0x10)|(x&0xFFFF)))

 

class CUSTOM_CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
 _fields_ = [ ('dwSize',ctypes.c_uint),
   ('dwCursorPosition',ctypes.c_uint),
   ('wAttributes',ctypes.c_ushort),
   ('srWindow',ctypes.c_ulonglong),
   ('dwMaximumWindowSize',ctypes.c_uint)
    ]

 

def GetConsoleCursorPos():
 ccsbi = CUSTOM_CONSOLE_SCREEN_BUFFER_INFO()
 ccsbi.dwSize = 0x16
 ctypes.windll.kernel32.GetConsoleScreenBufferInfo(ctypes.windll.kernel32.GetStdHandle(-11),ctypes.byref(ccsbi))
 pos = ccsbi.dwCursorPosition
 return (pos&0xFFFF), ((pos>>0x10)&0xFFFF)


 

 

일단 검색해서 제대로 안나오길래 어렵지 않을거 같아서 직접 구현함.

 

언젠가 또 이걸 찾을 날이 오겠지, 으 . . .

 

p.s > 왜 from ctypes import * 을 날리지 않았냐 라고 묻는다면

이렇게 길어질줄 몰랐다고 답하겠습니다.

 

네○파라 vol.0 암호화 루틴
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2015. 8. 20. 20:58 ) | 신고

 

 

 

 

"""

 Python 2.7 pseudo-code

 Present by FORE

 http://foreblog.tistory.com/

"""

class neko(Structure):

 _fields_ = [ ('Signature',c_uint), # "neko"

 ('ullStructSize',c_ulonglong),

 ('dwAdlr32',c_uint),

 ('wFileName',c_ushort),

 ('FileName',c_wchar_p) ]

 

def get_key(adlr):
 adlr ^= 0x1548E29C
 first_one_byte_key = adlr & 0x000000FF
 default_key = ((adlr) ^ (adlr>>0x18) ^ (adlr>>0x10) ^ (adlr>>0x08)) & 0x000000FF
 if first_one_byte_key == 0:
  first_one_byte_key = 0x9C
 if default_key == 0:
  default_key = 0xD7
 return first_one_byte_key, default_key

 

def decode(buf,adlr):
 first_key, def_key = get_key(adlr)
 buf = list(struct.unpack('B'*len(buf),buf))
 buf[0] ^= first_key
 for i in range(len(buf)):
  buf[i] ^= def_key
 buf = struct.pack('B'*len(buf),*buf)
 return buf

 

 

이전이랑 달라진게 몇개 있다면

 

1. Signature 이 바뀜.

2. 첫 바이트를 두 번 XOR 암호화시킴.

 

정도인 덧 . . . . . . ?

 

 

if 와 매크로와 세미콜론의 위험성.
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2015. 7. 27. 19:07 ) | 신고

 

 

간만에 프로그램에 손대고 있는데, 함정에 빠져버렸다 -_- ;;;

 

 

 if ( nTest )

   ListView_SetItemText(hListView,~);

 else

   ListView_SetItemText(hListView,~);

 

[ 문제의 구문 ]

 

위와 같이 적어주면

 

 error C2181: if와 짝을 이루지 않는 잘못된 else문입니다. 

 

신나는 문구를 띄워주신다.

 

제일 먼저 ListView_SetItemText 매크로는 매크로란 점이다 -_- ;

 

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775105(v=vs.85).aspx

 

을 보면 알겠지만, 매크로지만 함수와 같이 완벽히 작동하는거처럼 보여주신다.

( 위 MSDN 에도 매크로 뒤에 세미콜론이 붙어있다. )

 

하지만, 매크로는 매크로일 뿐 . . .

 

 

 #define ListView_SetItemText(hwndLV, i, iSubItem_, pszText_) \
 { LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 }

 

 

위 매크로를 보면 { } 저주받을 중괄호가 존재한다.

 

이 매크로를 따라 맨 처음 구문을 다시 적어보면

 

 

 if ( nTest )

{ LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 };

 else

{ LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 };

 

 

대충 이와 같이 적용된다.

 

if 문의 중괄호 끝에 아름답게 빨간색으로 빛나는 세미콜론이 보이신다.

 

즉, if ( ~ ){ }; 으로 이미 if문이 끝나버린 상태에서 else 문이 선언되어 앞에 있는 if 문이 인식을 못하는 부분이다.

 

따라서, 매크로를 사용시엔 반드시 if, while, for 와 같은 구문에는 중괄호 안에 매크로를 적거나

 

if, while, for 가 아닌 구문에만 사용하거나, 적당히 경우를 봐서 세미콜론을 안붙히는게 방법일 수 있겠다.

 

결론적으로 그냥 닥치는데로 중괄호 붙히는게 답일 듯 하다.

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/05   »
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 31
Total :
Today :
Yesterday :