最近在学习钱老师的<<c++反汇编与逆向分析技术揭秘>>,于是就想着逆向一下strcmp和strcat来试一试,由于水平很菜,希望得到大家的帮助.
首先,本人绝对菜鸟, 这是第一次发帖,发帖的主要目的只有一个:一直都是一个人在学习这些,每次想找人讨论都没有人,希望通过发此贴能够得到大侠的指导,或者和我有共同问题而没有人讨论的菜鸟一起学习,共同进步,非常期待认识你.(我的邮箱是用户名@163.com)
源代码:
#include<stdio.h>
#include <string.h>
void main()
{
char str1[30]="People's Republic of ";
char str2[]="China";
if(strcmp(str1,str2))
printf("yes\n");
printf(strcat(str1,str2));
}
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char *envp)
.text:00401000 _main proc near ; CODE XREF: start+AF p
.text:00401000
.text:00401000 var_28 = dword ptr -28h
.text:00401000 var_24 = word ptr -24h
.text:00401000 var_20 = byte ptr -20h
.text:00401000 var_A = dword ptr -0Ah
.text:00401000 var_6 = dword ptr -6
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 sub esp, 28h
.text:00401003 push ebx
.text:00401004 push esi
.text:00401005 push edi
.text:00401006 mov ecx, 5
.text:0040100B mov esi, offset aPeopleSRepubli ; "People's Republic of "
.text:00401010 lea edi, [esp+34h+var_20]
.text:00401014 rep movsd ; 因为ecx=5,所以esi指向of后面的 ,(这里有个空格);edi指向偏移量Ch
.text:00401016 mov ecx, dword_407038 ; ecx=chin
.text:0040101C mov dx, word_40703C ; dx=a\0
.text:00401023 xor eax, eax ; eax=0
.text:00401025 mov [esp+34h+var_28], ecx ; 偏移量28h到25h为chin
.text:00401029 movsw ; edi指向偏移量为Ah
.text:0040102B mov [esp+34h+var_A], eax ; A到7h为0
.text:0040102F mov [esp+34h+var_24], dx ; 24到23h为a\0
.text:00401034 mov [esp+34h+var_6], eax ; 6到3h为0
.text:00401038 lea esi, [esp+34h+var_28] ; esi指向china的开始;eax指向People的开始
.text:0040103C lea eax, [esp+34h+var_20]
.text:00401040
.text:00401040 loc_401040: ; CODE XREF: _main+62 j
.text:00401040 mov dl, [eax] ; dl=P
.text:00401042 mov bl, [esi] ; bl=c
.text:00401044 mov cl, dl ; cl=bl=p
.text:00401046 cmp dl, bl ; dl和bl比较
.text:00401048 jnz short loc_401068 ; 不等于则跳转
.text:0040104A test cl, cl ; 如果等于,则看cl是否为空
.text:0040104C jz short loc_401064 ; 为空则跳转
.text:0040104E mov dl, [eax+1] ; 将下一个字符给dl
.text:00401051 mov bl, [esi+1] ; 同上
.text:00401054 mov cl, dl
.text:00401056 cmp dl, bl ; 再次比较
.text:00401058 jnz short loc_401068 ; eax=0
.text:0040105A add eax, 2 ; 如果上面相等则偏移量加2
.text:0040105D add esi, 2 ; 同上
.text:00401060 test cl, cl ; 看cl是否为空,不为空则继续比较
.text:00401062 jnz short loc_401040 ; dl=P
.text:00401064
.text:00401064 loc_401064: ; CODE XREF: _main+4C j
.text:00401064 xor eax, eax
.text:00401066 jmp short loc_40106D ; 相当于跳出strcat
.text:00401068 ; ---------------------------------------------------------------------------
.text:00401068
.text:00401068 loc_401068: ; CODE XREF: _main+48 j
.text:00401068 ; _main+58 j
.text:00401068 sbb eax, eax ; eax=0
.text:0040106A sbb eax, 0FFFFFFFFh ; eax=-1
.text:0040106D
.text:0040106D loc_40106D: ; CODE XREF: _main+66 j
.text:0040106D test eax, eax ; 看eax是否为0
.text:0040106F jz short loc_40107E ; 为0则跳转
.text:00401071 push offset aYes ; "yes\n"
.text:00401076 call sub_4010C0 ; 输出yes
.text:0040107B add esp, 4
.text:0040107E;***********以上为strcmp部分,下面为strcat部分*****************
.text:0040107E loc_40107E: ; CODE XREF: _main+6F j
.text:0040107E lea edi, [esp+34h+var_28] ; edi指向china的开始
.text:00401082 or ecx, 0FFFFFFFFh
.text:00401085 xor eax, eax ; 清空eax
.text:00401087 lea edx, [esp+34h+var_20] ; edx指向20h处
.text:0040108B repne scasb
.text:0040108D not ecx ; ecx等于china 的长度
.text:0040108F sub edi, ecx ; ebx为china字符的个数
.text:00401091 push edx
.text:00401092 mov esi, edi ; esi指向china的开始
.text:00401094 mov ebx, ecx ; ebx为china字符的个数
.text:00401096 mov edi, edx ; 让edi指向20h处
.text:00401098 or ecx, 0FFFFFFFFh
.text:0040109B repne scasb ; 让edi指向People's Republic of 末尾
.text:0040109D mov ecx, ebx ; 将china的长度给ecx
.text:0040109F dec edi ; edi回退一个,因为scas在执行后,偏移量要马上加1或者减1,这里是加1
.text:004010A0 shr ecx, 2 ; 除以4
.text:004010A3 rep movsd ; 按双字移动
.text:004010A5 mov ecx, ebx ; 再次将china的长度给ecx
.text:004010A7 and ecx, 3 ; china的长度对3取余
.text:004010AA rep movsb ; 按字节移动
.text:004010AC call sub_4010C0 ; 输出结果
.text:004010B1 add esp, 4
.text:004010B4 pop edi
.text:004010B5 pop esi
.text:004010B6 pop ebx
.text:004010B7 add esp, 28h
.text:004010BA retn
.text:004010BA _main endp
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!