예전에 쓰던
암호화 관련된걸 해제하는 프로그램이 있는데요.
암호화 공식은 모르고 그거에 의존해서 쓰다가 ㄷㄷ
파일형태가 좀 바껴서 못쓰게됐어요..
그래서 그냥 만들어야겠다 라고 생각해서 만들고있는데요.
암호화 분석하다가 빡쳐서 예전에 있던 프로그램을 뜯어서 만들어보려고
RecStudio라는 걸로 디컴파일을 했습니다.
IDA, Bumerang 의 경우 제가 잘못한건지.. 32bit프로그램이라 그런지 에러가 나더군요 ㄷㄷ
어쨋던 디컴파일을 했는데.
java만 하고, C에 익숙하지않아서 그런지 전혀 이해가 안되는 것들이 보이더라고요 ㄷㄷ;
민폐가 안된다며 알고싶어서 여쭙습니다!
1. 함수 호출
//-- 메인 쓰레드 내용 中
_push( &_v552);
_push("Is %s encrypted file?");
_push(260);
_push( &_v292);
L00403620( &_v552, __eflags);
// 해당 함수
L00403620 (
_unknown_ __ecx, // r2
_unknown_ __eflags, // r9
signed char* _a4, // _cfa_4
intOrPtr _a8, // _cfa_8
intOrPtr _a12, // _cfa_c
char _a16 // _cfa_10
)
컴파일러가 이상한건지 리턴타입이 안적혀있더라고요.
그런데, 기본적으로 함수 인자는 6개인데,
_push()라는 함수로 인자를 넣고, 함수 기본 인자를 따로 넣는 식으로 돼 있는데,
이건 디컴파일러가 이상한건가요?
아니면 저런 함수가 원래 C에서 사용하는 함수인건가요?
사실 정확한 사용용도를 알고싶어서요.
어셈블리어 push처럼 사용하는것 같기도한데,.. 잘 이해가 안가더라고요.
그리고 _uknown_ 이라는 데이터타입은 디컴파일러가 만들어낸 구조체인가요? 아니면 보통 저렇게 쓰기도 하나요?
디컴파일 된 내용에도 start 가 있긴하지만, 인자를 어떤걸 받아오는지 모르겠어서 해당 내용이 어떤흐름으로 가는지 감이 안잡히네요...
2. 포인터?????
디컴파일된 내용중에 일부에
ShowWindow( *4271308, 5);
이런식으로 숫자에 포인터(*)를 사용한 경우가 보이는데요.
이경우에 0*숫자 라는 계산처리가 되나요? 아니면 4271308이라는 메모리 위치의 데이터를 포인터로 가지고오계되나요??
java유저라 이런 경우가 전혀 이해가 안되서요. 이렇게 단도직입적으로 메모리를 취하기도 하나요? (이건 컴파일러가 저렇게 조작한거같긴하지만..)
포인터는 언제나 햇갈리는데요..
int a = &value; // a는 주소값만
int b = *a; // b는 실제 값의 복제
이렇게 알고있고,
a += 1; //배열이 1증가
이런식으로 알고있습니다.
그리고 함수에서 인자로 받을때도 ( int &value) 이런식? 으로 받는걸로알고있는데.
FUNC( unsigned int _unkown1 ){
//중랼
_unkown1 += 2;
//중략
*(_unkown1) 어찌고저찌고
}
?! 초반까지만 해도 그냥 int로 생각하고 있던 녀석이 어느순간 포인터에 쌓여져서 쓰기 시작한것입니다.
이런 경우도 있나요? 선언은 unsigned int인데... 어떻게.. 갑자기 포인터로 ㄷㄷ
역시 C의 세계는 너무 복잡한 것 같습니다... ㅠㅠ
디컴파일을 해서 그런지 goto 문이 눈을 현혹함 ㄷㄷ.;