逆向工程学习第一天--一个VC6编译的小程序
今天开始研究二进制了,开个文记录一下。下面是一个小程序的OD反汇编代码,自己尝试加了注释,本人逆向零基础,属于摸着石头过河的类型,有理解错误的地方,希望大牛不吝赐教。
源代码:
#include<stdio.h>
#include<string.h>
char name[] = "37000011111";
int main()
{
char output[8];
strcpy(output, name);
for(int i=0;i<8&&output[i];i++)
printf("\\0x%x",output[i]);
return 0;
}
汇编代码:
00401000 /$ 83EC 08 sub esp,0x8 //为output字符数组在栈上分配空间,以dword为单位进行分配。
00401003 |. 83C9 FF or ecx,-0x1 //ecx设为0xFFFFFFFF准备存放字符长度。
00401006 |. 33C0 xor eax,eax //eax清零
00401008 |. 8D5424 00 lea edx,dword ptr ss:[esp] //把output字符数组的首地址赋值给edx。
0040100C |. 56 push esi
0040100D |. 57 push edi
0040100E |. BF 30604000 mov edi,9_22.00406030 //把字符串常量的首地址赋值给edi。
00401013 |. F2:AE repne scas byte ptr es:[edi] //扫描edi指向的字符串是否等于al,当前al为0x00,同时累加edi和ecx。
00401015 |. F7D1 not ecx //ecx取反得到字符串长度。
00401017 |. 2BF9 sub edi,ecx //把edi恢复至原位,即字符串常量首地址。
00401019 |. 8BC1 mov eax,ecx //把字符串长度赋值给eax,因为下面要用ecx来控制循环。
0040101B |. 8BF7 mov esi,edi //把字符串常量首地址(源字符串)赋值给esi。
0040101D |. 8BFA mov edi,edx //把output字符数组的首地址(目标字符串)赋值给edi。
0040101F |. C1E9 02 shr ecx,0x2 //修改循环计数的值,因为以DWORD为单位进行复制,所以先复制整的,剩下的不足4字节的零头再以BYTE为单位复制。
00401022 |. F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi] //开始复制,循环2次。
00401024 |. 8BC8 mov ecx,eax //把字符串长度还给ecx。
00401026 |. 83E1 03 and ecx,0x3 //计算零头个数,相当于除以4取余数。
00401029 |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi] //复制零头
0040102B |. 33F6 xor esi,esi //清零esi
0040102D |> 8A4434 08 /mov al,byte ptr ss:[esp+esi+0x8] //这里开始循环调用printf函数了,首先把al定位至output首个字符。
00401031 |. 84C0 |test al,al //测试该字符是否为0x00.
00401033 |. 74 17 |je short 9_22.0040104C //如果为0则跳至printf下面的语句。
00401035 |. 0FBEC8 |movsx ecx,al //把al的值传递给ecx,因为源和目的操作数不等长,所以此处用movsx进行带符号扩展。
00401038 |. 51 |push ecx //把ecx入栈,准备函数调用,ecx为字符的ascii码。
00401039 |. 68 44604000 |push 9_22.00406044 //把格式字符串"\0x%x"入栈,此处可以看出函数参数由右向左入栈。
0040103E |. E8 1D000000 |call 9_22.00401060 //调用printf函数。
00401043 |. 83C4 08 |add esp,0x8 //调用函数之后恢复堆栈。
00401046 |. 46 |inc esi //递增指向output的指针。
00401047 |. 83FE 08 |cmp esi,0x8 //0x8为output的长度,判断是否把output中的字符已经全部输出。
0040104A |.^ 7C E1 \jl short 9_22.0040102D //如果小于0x8,继续循环。
0040104C |> 5F pop edi //恢复现场,和前面的push edi对应。
0040104D |. 33C0 xor eax,eax //eax清零,准备main函数的返回值。
0040104F |. 5E pop esi //恢复现场,和前面的push edi对应。
00401050 |. 83C4 08 add esp,0x8 //main函数恢复堆栈平衡,这里是被调用者恢复,前面的printf是调用者恢复,为__cdecl方式,此处为__stdcall方式。
00401053 \. C3 retn //退出main函数,返回启动函数。
逆向工程学习第一天--一个VC6编译的小程序的更多相关文章
- 07 python学习笔记-写一个清理日志的小程序(七)
#删掉三天前的日志 #1.获取到所有的日志文件, os.walk #2.获取文件时间 android 2019-09-27 log,并转成时间戳 #3.获取3天前的时间 time.time() - 6 ...
- 第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现
第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现 开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 实现一个servlet的helloworld小程序(不适用Eclipse)
实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...
- 反编译微信小程序
最近看了个微信小程序古诗词全集,想知道他的前后端是怎么实现的,所以就想到了反编译.小程序安装后会有个wxapkg格式的文件存在/data/data/com.tencent.mm/MicroMsg/** ...
- Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)
Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- 制作一个windows垃圾清理小程序
制作一个windows垃圾清理小程序: 把下列代码保存为.bat文件(如垃圾清理.bat) 双击它就能很快地清理垃圾文件,大约一分钟不到. 就是下面的文字(这行不用复制)=============== ...
- 两天快速开发一个自己的微信小程序
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...
随机推荐
- Looper.prepare()和Looper.loop()
什么时候需要 Looper Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建 ...
- Dojo: Quick Start
1.Dojo学习地址 2.Dojo快速开始 2.1.Dojo引入 2.2.指定Dojo模块的位置 2.3.模块加载require 3.查找Dom节点 3.1.根据id查找dom节点 3.2.根据c ...
- Linux运维之基础拾遗
第一部分 Linux常用文件管理命令 1.1 cp 文件复制 常用选项 -i # 覆盖之前提醒用户确认 -f # 强制覆盖目标文件 -r # 递归复制目录 -d # 复制符号链接本身而非其指向的源文件 ...
- 《Ansible权威指南》笔记(4)——Playbook
七.Playbook1.语法特性如下:(1)"---"首行顶格开始(2)#号注释(3)缩进统一,不同的缩进代表不同的级别,缩进要对齐,空格和tab不能混用(4)区别大小写,键值对k ...
- x01.CodeBuilder: 生成代码框架
根据 Assembly 生成代码框架. 这是学习 AvalonEdit 的一个副产品.学习时,照着源代码新建文件夹,新建文件,添加方法与属性,虽然只是个框架,也要花费大量时间.为什么不让它自动生成呢? ...
- 前端小菜鸟的Mobile之旅---开篇
背景:前段时间有幸参与了公司一个基于H5的手机APP项目,(我们用的React+ES6+Webpack+Cordova开发),由此开始接触一些关于H5开发手机APP方面的知识,下面Shar ...
- Linux的一些基本概述以及系统使用
GNU:项目名称(意指开发在类UNIX系统上的软件).POSIX:可移植(Portable)操作系统接口,便于程序在不同操作系统上运行. Linux是符合POSIX标准的操作系统: 完全兼容POSIX ...
- ttf,eot,woff,svg,字体格式介绍及使用方法
而由于网页中使用的字体类型,也是各浏览器对字体类型有不同的支持规格. 字体格式类型主要有几个大分类:TrueType.Embedded Open Type .OpenType.WOFF .SVG. T ...
- flex自适应高度内容高度超出容器高度自动出现滚动条的问题
在容器中设置 flex-grow:2; overflow-y:auto;overflow-x:hidden;容器高度自适应. 内容高度不固定,无法出现滚动条,然后在容器中添加height:0,出现滚动 ...
- 项目vue2.0仿外卖APP(七)
ratings评价列表页实现 在ratings.vue组件里开发 首先先引入seller数据: 书写模板结构: 由于评价页又有之前写过的star.vue组件,所以又要在ratings.vue组件引入: ...