C标准库——字符串函数反汇编分析

1、前置概念补充 

test:逻辑与,如果是1,zf就是1,如果是0,zf就是0 

可以还原成等价的高级语言,理解代码逻辑,但是不一定是源代码

大写的A:41,小写a:61

ascii:a:0x61        >16^2

unicode:a:0x0061        >16^4

unicode文件的开头是ff fe,0d 00 0a 00构成了一个换行符相当于\r\n回车+换行

 .txt代码段,.data数据段,.rdata只读常量区

char str[]="hello"

strlen算出的字符串长度是不包含最后一个字符\0的:5

sizeof(str)        >6

release下的strlen的反汇编代码

按a是以ascii呈现内存

strcpy函数逆向:

 main当中有两个全局的地址:

按下n可以对变量重命名

在release版本当中strcpy已经被内联了,被编译成内联函数的形式,并做了一些优化

ida当中右键进入主函数,点击去常量,按a变成字符串形式,然后按下esc来返回

ida打开会生成四个数据库文件,如果修改的话直接打包保存,到时候直接打开idb文件就好了

collect garbege:当ida文件比较大了,想节省空间,就选择这个选项,

相同返回0,不同返回-1

字符串chaz strstr返回下标

这样有利于在反汇编代码当中去识别字符串操作的函数,因为发布版他都是以内联的形式出现,不像在debug版本当中这么明显地显示出来,这样我们拿到一个陌生的程序就可以识别出来他是对字符串进行了什么样的操作是拷贝还是比较 

vs2019下的strcpy函数:直接以内联形式调用不具备参考意义

2、strlen函数逆向分析

test cl,cl的作用就是判断cl是否为0

00FA1040 >/$  55            push ebp
00FA1041  |.  8BEC          mov ebp,esp
00FA1043  |.  83EC 08       sub esp,0x8
00FA1046  |.  A1 0021FA00   mov eax,dword ptr ds:[0xFA2100]          ;  hello
00FA104B  |.  8945 F8       mov [local.2],eax
00FA104E  |.  66:A1 0421FA0>mov ax,word ptr ds:[0xFA2104]            ;  o
00FA1054  |.  66:8945 FC    mov word ptr ss:[ebp-0x4],ax
00FA1058  |.  8D45 F8       lea eax,[local.2]
00FA105B  |.  8D50 01       lea edx,dword ptr ds:[eax+0x1]
00FA105E  |.  66:90         nop
00FA1060  |>  8A08          /mov cl,byte ptr ds:[eax]
00FA1062  |.  40            |inc eax
00FA1063  |.  84C9          |test cl,cl
00FA1065  |.^ 75 F9         \jnz short 汇编代码.00FA1060
00FA1067  |.  2BC2          sub eax,edx
00FA1069  |.  50            push eax
00FA106A  |.  68 0821FA00   push 汇编代码.00FA2108                       ;  hhh%d\n
00FA106F  |.  E8 9CFFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00FA1074  |.  68 1021FA00   push 汇编代码.00FA2110                       ; /pause
00FA1079  |.  FF15 7820FA00 call dword ptr ds:[<&api-ms-win-crt-runt>; \system
00FA107F  |.  83C4 0C       add esp,0xC
00FA1082  |.  33C0          xor eax,eax
00FA1084  |.  8BE5          mov esp,ebp
00FA1086  |.  5D            pop ebp
00FA1087  \.  C3            retn

3、strcpy函数逆向分析

字符串赋值有时候一次性赋值不完,这种是使用字符数组来存储的

00DB104E  |.  45            inc ebp                                  ;  o
00DB104F  |?  FC            cld
00DB1050  |?  A1 0021DB00   mov eax,dword ptr ds:[0xDB2100]          ;  hello
00DB1055  |?  8945 F4       mov [local.3],eax
00DB1058  |.  66:A1 0421DB0>mov ax,word ptr ds:[0xDB2104]            ;  o

 

00DB1040 >/$  55            push ebp
00DB1041  |.  8BEC          mov ebp,esp
00DB1043  |.  83EC 0C       sub esp,0xC
00DB1046  |.  A1 0430DB00   mov eax,dword ptr ds:[__security_cookie_>;  hello
00DB104B  |.  33C5          xor eax,ebp
00DB104D  |?  8945 FC       mov [local.1],eax
00DB1050  |?  A1 0021DB00   mov eax,dword ptr ds:[0xDB2100]          ;  hello
00DB1055  |?  8945 F4       mov [local.3],eax
00DB1058  |.  66:A1 0421DB0>mov ax,word ptr ds:[0xDB2104]            ;  o
00DB105E  |.  66:8945 F8    mov word ptr ss:[ebp-0x8],ax
00DB1062  |.  33C0          |xor eax,eax
00DB1064  |?  0f1f40 00     nop dword ptr ds:[eax]
00DB1068  |?  0f1f8400 0000>nop dword ptr ds:[eax+eax]
00DB1070  |?  8A88 0821DB00 mov cl,byte ptr ds:[eax+0xDB2108]        ;  world
00DB1076  |?  8D40 01       lea eax,dword ptr ds:[eax+0x1]
00DB1079  |.  884C05 F3     mov byte ptr ss:[ebp+eax-0xD],cl         ; \system
00DB107D  |?  84C9          test cl,cl
00DB107F  |.^ 75 EF         jnz short 汇编代码.00DB1070
00DB1081  |?  8D45 F4       lea eax,[local.3]
00DB1084  |.  50            push eax
00DB1085  |?  68 1021DB00   push 汇编代码.00DB2110                       ;  hhh%s\n
00DB108A   ?  E8 81FFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00DB108F   ?  68 1821DB00   push 汇编代码.00DB2118                       ;  pause
00DB1094   ?  FF15 7820DB00 call dword ptr ds:[<&api-ms-win-crt-runt>;  ucrtbase.system
00DB109A   ?  8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]           ;  kernel32.BaseThreadInitThunk
00DB109D   ?  83C4 0C       add esp,0xC
00DB10A0   ?  33CD          xor ecx,ebp
00DB10A2   ?  33C0          xor eax,eax
00DB10A4   .  E8 04000000   call 汇编代码.__security_check_cookiepresent>
00DB10A9   .  8BE5          mov esp,ebp
00DB10AB   ?  5D            pop ebp                                  ;  kernel32.762D00C9
00DB10AC   ?  C3            retn

使用两个字符数组的情况:

#include <iostream>
#pragma warning (disable:4996)
using namespace std;

int main()
{
    int n;
    char str1[] = "hello";
    char str2[] = "world";
    strcpy(str1, str2);
    printf("hhh%s\n", str1);
    system("pause");
    return 0;
}

 反汇编:

009F1040 >/$  55            push ebp
009F1041  |.  8BEC          mov ebp,esp
009F1043  |.  83EC 14       sub esp,0x14
009F1046  |.  A1 04309F00   mov eax,dword ptr ds:[__security_cookie_>;  hello
009F104B  |.  33C5          xor eax,ebp
009F104D  |?  8945 FC       mov [local.1],eax
009F1050  |?  A1 00219F00   mov eax,dword ptr ds:[0x9F2100]          ;  hello
009F1055  |?  8945 F4       mov [local.3],eax
009F1058  |.  0FB705 04219F>movzx eax,word ptr ds:[0x9F2104]         ;  o
009F105F  |?  66:8945 F8    mov word ptr ss:[ebp-0x8],ax
009F1063  |.  A1 08219F00   |mov eax,dword ptr ds:[0x9F2108]         ;  world
009F1068  |?  8945 EC       mov [local.5],eax
009F106B  |?  0FB705 0C219F>movzx eax,word ptr ds:[0x9F210C]         ;  d
009F1072  |?  66:8945 F0    mov word ptr ss:[ebp-0x10],ax
009F1076  |?  33C0          xor eax,eax
009F1078  |?  0f1f8400 0000>nop dword ptr ds:[eax+eax]
009F1080  |?  8A4C05 EC     mov cl,byte ptr ss:[ebp+eax-0x14]
009F1084  |.  8D40 01       lea eax,dword ptr ds:[eax+0x1]
009F1087  \.  884C05 F3     mov byte ptr ss:[ebp+eax-0xD],cl
009F108B   ?  84C9          test cl,cl
009F108D   ?^ 75 F1         jnz short 汇编代码.009F1080
009F108F   ?  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]           ;  pause
009F1092   ?  50            push eax
009F1093   ?  68 10219F00   push 汇编代码.009F2110                       ;  hhh%s\n
009F1098   ?  E8 73FFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
009F109D   ?  68 18219F00   push 汇编代码.009F2118                       ;  pause
009F10A2   ?  FF15 78209F00 call dword ptr ds:[<&api-ms-win-crt-runt>;  ucrtbase.system
009F10A8   ?  8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]           ;  kernel32.BaseThreadInitThunk
009F10AB   ?  83C4 0C       add esp,0xC
009F10AE   .  33CD          xor ecx,ebp
009F10B0   .  33C0          xor eax,eax
009F10B2   ?  E8 04000000   call 汇编代码.__security_check_cookiepresent>
009F10B7   .  8BE5          mov esp,ebp
009F10B9   .  5D            pop ebp                                  ;  kernel32.762D00C9
009F10BA   ?  C3            retn

5、strcmp函数逆向

#include <iostream>
#pragma warning (disable:4996)
using namespace std;

int main()
{
    int n;
    char str1[] = "hello";
    char str2[] = "world";
    n = strcmp(str1, str2);

    printf("hhh%d\n", n);
    system("pause");
    return 0;
}

汇编代码:

00FD1040 >/$  55            push ebp
00FD1041  |.  8BEC          mov ebp,esp
00FD1043  |.  83EC 10       sub esp,0x10
00FD1046  |.  A1 0021FD00   mov eax,dword ptr ds:[0xFD2100]          ;  hello
00FD104B  |.  8D4D F0       lea ecx,[local.4]
00FD104E  |.  8945 F0       mov [local.4],eax
00FD1051  |.  0FB705 0421FD>movzx eax,word ptr ds:[0xFD2104]         ;  o
00FD1058  |.  66:8945 F4    mov word ptr ss:[ebp-0xC],ax
00FD105C  |.  A1 0821FD00   mov eax,dword ptr ds:[0xFD2108]          ;  world
00FD1061  |.  8945 F8       mov [local.2],eax
00FD1064  |.  0FB705 0C21FD>movzx eax,word ptr ds:[0xFD210C]         ;  d
00FD106B  |.  66:8945 FC    mov word ptr ss:[ebp-0x4],ax
00FD106F  |.  8D45 F8       lea eax,[local.2]
00FD1072  |>  8A11          /mov dl,byte ptr ds:[ecx]
00FD1074  |.  3A10          |cmp dl,byte ptr ds:[eax]
00FD1076  |.  75 1A         |jnz short 汇编代码.00FD1092
00FD1078  |.  84D2          |test dl,dl
00FD107A  |.  74 12         |je short 汇编代码.00FD108E
00FD107C  |.  8A51 01       |mov dl,byte ptr ds:[ecx+0x1]
00FD107F  |.  3A50 01       |cmp dl,byte ptr ds:[eax+0x1]
00FD1082  |.  75 0E         |jnz short 汇编代码.00FD1092
00FD1084  |.  83C1 02       |add ecx,0x2
00FD1087  |.  83C0 02       |add eax,0x2
00FD108A  |.  84D2          |test dl,dl
00FD108C  |.^ 75 E4         \jnz short 汇编代码.00FD1072
00FD108E  |>  33C0          xor eax,eax
00FD1090  |.  EB 05         jmp short 汇编代码.00FD1097
00FD1092  |>  1BC0          sbb eax,eax
00FD1094  |.  83C8 01       or eax,0x1
00FD1097  |>  50            push eax
00FD1098  |.  68 1021FD00   push 汇编代码.00FD2110                       ;  hhh%d\n
00FD109D  |.  E8 6EFFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00FD10A2  |.  68 1821FD00   push 汇编代码.00FD2118                       ; /pause
00FD10A7  |.  FF15 7820FD00 call dword ptr ds:[<&api-ms-win-crt-runt>; \system
00FD10AD  |.  83C4 0C       add esp,0xC
00FD10B0  |.  33C0          xor eax,eax
00FD10B2  |.  8BE5          mov esp,ebp
00FD10B4  |.  5D            pop ebp                                  ;  kernel32.762D00C9
00FD10B5  \.  C3            retn

大家直接对照源码,理解一下反汇编代码,感受一下自己探索的乐趣吧!

今天的内容就先到这里了,后面可能还会添加cstring库里的字符串处理函数噢!

喜欢的话记得多多点赞+收藏哦~💗💗💗🤞🤞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值