strcpy의 구조

or ecx, FFFFFFFF
xor eax, eax
lea edx, dword ptr ss:[esp]
push esi
push edi
mov edi, example.00407034
repne scas byte ptr es:[edi]
not ecx
sub edi, ecx
mov eax, ecx
mov esi, edi
mov edi, edx
shr ecx, 2
rep movs dword ptr es:[edi], dword ptr ds:[esi]
mov ecx, eax
and ecx, 3
rep movs byte ptr es:[edi], byte ptr ds:[esi]
lea ecx, dword ptr ss:[esp+8]
push ecx
push example.00407030
call example.00401230

 

1. 문자열 길이를 구함 (1 ~ 8)

2. 출발지를 esi에 넣고, 목적지를 edi에 넣음 (9 ~ 12)

3. 문자열 길이에 해당하는 값을 4로 나눠서 몫을 구함 (13)

4. 4 x (3.에서 구한 값) 만큼을 복사함 (14)

5. 문자열 길이에 해당하는 값을 4로 나눈 나머지를 구함 (15 ~ 16)

6. (5.에서 구한 값) 만큼을 복사함 (17)

 

 rep 

 ecx>0인 동안 명령어 반복 

 repz, repe

 ZERO 플래그가 1이고, ecx>0인 동안 명령어 반복 

 repnz, repne 

 ZERO 플래그가 0이고, ecx>0인 동안 명령어 반복

 

 scasb 

 BYTE 단위로 비교

 scasw

 WORD 단위로 비교

 scasd

 DWORD 단위로 비교

 

 movs 

 출발지에서 목적지로 데이터를 복사한다. (movs destination, source) 

 movsb

 BYTE 단위로 복사

 movsw

 WORD 단위로 복사

 movsd

 DWORD 단위로 복사

 

strcat의 구조

or ecx, FFFFFFFF
xor eax, eax
lea edx, dword ptr ss:[esp+C]
repne scas byte ptr es:[edi]
not ecx
sub edi, ecx
mov esi, edi
mov ebx, ecx
mov edi, edx
or ecx, FFFFFFFF
repne scas byte ptr es:[edi]
mov ecx, ebx
dec edi
shr ecx, 2
rep movs dword ptr es:[edi], dword ptr ds:[esi]
mov ecx, ebx
lea eax, dword ptr ss:[esp+C]
and ecx, 3
push eax
rep movs byte ptr es:[edi], byte ptr ds:[esi]

 

1. src 문자열 길이 구함, 값 저장 (1 ~ 9)

2. dest 문자열 길이 구함 (10 ~ 12)

3. dest 문자열의 null뺀 부분부터 src로부터 복사해넣음 (13 ~ 20)

'리버스 엔지니어링 바이블' 카테고리의 다른 글

07 MFC 리버싱  (0) 2018.11.11
06 흔히 사용하는 패턴  (0) 2018.11.10
05 PE 헤더 (PE Header)  (0) 2018.11.10
04 DLL 분석  (0) 2018.10.17
03 C++ 클래스와 리버스 엔지니어링  (0) 2018.10.14
02 C 문법과 디스어셈블링  (0) 2018.10.14

+ Recent posts