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库里的字符串处理函数噢!
喜欢的话记得多多点赞+收藏哦~💗💗💗🤞🤞