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