## LEA의 주소값 연산
LEA의 오른쪽 대괄호 안은 일반적으로 주소자리로 인식되나 실제로는 안에 연산해서 이루어진 값이 ECX로 전해진다.
## 연산에서 1가지 인자 처리 방법
ADD ECX는 EAX값에 저장된 값과 더하여 그 결과값을 저장한다.
## 연산에서 2가지 인자 처리 방법
SUB EAX, ECX 에서 EAX= EAX-ECX로 결과값을 저장한다.
## 연산에서 3가지 인자 처리방법.
IMUL ECX, ECX, 0A의 경우 2,3번째 값을 연산한 값을 ECX에 저장한다.
3-5 len 함수를 대신하는 문자열 확인 for문
for문은 밖에서 초기값을 지정해주고 검은색 화살표가 그려져있는 부분으로 들어와서 조건을 만든 후, 안에 있는 내용을 JMP가 나타나기 전까지 실행한다. 그리고 JMP가 맨 위로 올리면 ++을 하기 위해서 mov, add, mov를 한다.
if(int i= 0; lpCmd[i];i++)
3-6 new 동적 할당.
void AA;
{
MessageBoxA(0, "Analysis this", ittank, 0);
for(i = 0; lpCmd(AA + i) != 0; i ++) { }
name = new char[i + 1];
for(i = 0; lpCmd(AA + i) != 0; i ++) {
*(BB + i) = lpCmd(AA + i);
}
*(BB + i) = 0;
return 0;
}
3-7 답 = lpCmd[] 부분에 대문자 두개, 나머지 소문자로 넣으면 된다.
CHAR * A10;
{
MessageBoxA(0, "Insert Argument", ittank, 0);
for(K = 0; *(A10 + K) != 0; K = K + 1) {
}
J = K + 1;
for(K = 0; 1; K = K + 1) {
if(*(A10 + K) == 0) {
goto A;
}
if(*(A10 + K) < 0x41 || *(A10 + K) > 0x5a) {
if(*(A10 + K) < 0x61 || *(A10 + K) > 0x7a) {
if(*(A10 + K) != 0x20) {
break;
}
*(J + K) = *(A10 + K);
K = K + 1;
continue;
}
i = 0x61;
} else {
i = 0x41;
}
eax = *(A10 + K) - i + 3;
asm("cdq");
ecx = 0x1a;
edx = 0x1a / 0x1a % 0x1a / 0x1a + i;
*(J + K) = dl;
}
MessageBoxA(0, "Insert An Alphabet", "ITBANK", 0);
eax = 0;
goto B;
A:
*(J + K) = 0;
if(strcmp(J, "LWedqn") == 0) {
MessageBoxA(0, A10, "ITBANK", 0);
}
eax = 0;
B:
}
3-8
http://www.backerstreet.com/rec/recdload.htm //REC 디코더
strSrc.compare("Test strinG...") vs _stricmp( strSrc.c_str(), "Test strinG...")
'리버싱' 카테고리의 다른 글
9일차, 시저암호화 (0) | 2013.04.18 |
---|---|
8일차, malloc, strcmp (0) | 2013.04.17 |
6일차, (0) | 2013.04.15 |
5일차, 점프, Argument(arguv, arguv) (0) | 2013.04.13 |
4일차 역공학, 어셈 & register & stack & dumpwindow에서 내용수정 (0) | 2013.04.11 |