今天开始研究二进制了,开个文记录一下。下面是一个小程序的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编译的小程序的更多相关文章

  1. 07 python学习笔记-写一个清理日志的小程序(七)

    #删掉三天前的日志 #1.获取到所有的日志文件, os.walk #2.获取文件时间 android 2019-09-27 log,并转成时间戳 #3.获取3天前的时间 time.time() - 6 ...

  2. 第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现

    第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现 开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 ...

  3. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  4. 实现一个servlet的helloworld小程序(不适用Eclipse)

    实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...

  5. 反编译微信小程序

    最近看了个微信小程序古诗词全集,想知道他的前后端是怎么实现的,所以就想到了反编译.小程序安装后会有个wxapkg格式的文件存在/data/data/com.tencent.mm/MicroMsg/** ...

  6. Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)

    Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...

  7. 如何反编译微信小程序👻

    如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...

  8. 制作一个windows垃圾清理小程序

    制作一个windows垃圾清理小程序: 把下列代码保存为.bat文件(如垃圾清理.bat) 双击它就能很快地清理垃圾文件,大约一分钟不到. 就是下面的文字(这行不用复制)=============== ...

  9. 两天快速开发一个自己的微信小程序

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...

随机推荐

  1. RecyclerView如何消除底部的分割线

    最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线.   问题是:底部也会显示分割线,这很影响美观.   怎么解决这个问题呢?我想了很多办法,毫无头绪...   最后, ...

  2. Database first with EntityFramework (Migration)安装和升级

    最近看了国外几个项目,发现用EntityFramework做Code First的项目现在很流行. 最让我有兴趣的一个功能则是,EntityFramework对于数据库的安装和升级的无缝完美支持,且很 ...

  3. JAVA编程思想(第四版)学习笔记----11.10 Map

    之前学习的是Collection层次的List接口.List层次比较简单,除去与多线程安全相关的CoppyOnWriteArrayList<T>类,这一个类在集中涉及多线程相关知识时候再学 ...

  4. MySql踩坑总结

    衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈 转了那么多弯,才明白问题就在一个地方.睡觉之前想明白了问题,还是经验太少.王国维的治学三境界: 昨夜西风凋 ...

  5. inotify+rsync实现实时同步部署

    1.1.架构规划 1.1.1架构规划准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server-inotify-tools) 192.168.1.14 Cen ...

  6. redis 缓存技术与memcache的区别

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...

  7. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  8. 程序设计模式浅析(plain framework商业版设计模式)

    程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...

  9. 优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码)。

    在您阅读本文前,先需要告诉你的是:即使是本文优化过的算法,DCT去噪的计算量依旧很大,请不要向这个算法提出实时运行的苛刻要求. 言归正传,在IPOL网站中有一篇基于DCT的图像去噪文章,具体的链接地址 ...

  10. UI内侧错题

    此题考察的是JQuery UI下的menu插件的使用,ui-menu表示菜单的外层容器,如果菜单包含图标,该元素会另外带一个 ui-menu-icons class.故A B选项错误.ui-menu- ...