范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

通过调用栈对软件爆破,以后不用总是搜索字符串了

  基础知识栈
  栈是操作系统在运行时自动初始化的一块区域,是数据暂时存储的的动态内存区域。它的大小在Windows操作系统下由PE文件结构中PE文件头中IMAGE_OPTIONAL_HEADER结构中SizeOfStackReserve字段所定义。在OD中,要想顺利分析软件的功能,在单步需要关注的便是寄存器和栈空间。下面,我们来看一下软件是怎么利用栈的。 函数的调用过程
  我们用一个充满函数的小软件来研究函数的调用,源代码如下:  复制代码 隐藏代码 #include #include #include #include using namespace std; int function(int a,int b);//这是第一个函数,揭示控制台应用程序函数调用过程 int WINAPI winfunction(int a,int b);//winapi调用方式  int _cdecl cfunction(int a,int b);//c函数方式 int _stdcall cppfunction(int a,int b);//c++函数方式 int _fastcall ffunction(int a,int b);//寄存器函数方式  int _stdcall stdfunction(int a,int b);//其实就是WINAPI调用方式  int myfunction(int a,int b);//递归调用演示  int main(){         int a;int b;     printf("定位汇编代码");         scanf("%d",&a);         scanf("%d",&b);//scanf方便找汇编代码         winfunction(a,b);         cfunction(a,b);         cppfunction(a,b);         ffunction(a,b);         stdfunction(a,b);         myfunction(a,b);         return 0; } int function(int a,int b){         int c = a + b;//加法运算最简单          return c; } int WINAPI winfunction(int a,int b){         int c = a + b;//加法运算最简单          return c; } int _cdecl cfunction(int a,int b){         int c = a + b;//加法运算最简单          return c; } int _stdcall cppfunction(int a,int b){         int c = a + b;//加法运算最简单          return c; } int _fastcall ffunction(int a,int b){         int c = a + b;//加法运算最简单          return c; } int _stdcall stdfunction(int a,int b){         int c = a + b;//加法运算最简单          return c; } int myfunction(int a,int b){         a++;     b++;     myfunction(a,b); }
  将编译出的软件用OD载入,通过API定位至调用语段:
  简单分析一下,易得:  复制代码 隐藏代码 0040159A    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 0040159D    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015A0    895424 04       mov dword ptr ss:[esp+0x4],edx       ; 将EDX内容压入栈,就是我输入的b(=2) 004015A4    890424          mov dword ptr ss:[esp],eax           ; 将EAX内容压入栈,就是我输入的a(=1) 004015A7    E8 81000000     call 未命名1.0040162D                   ; WINAPI调用方式 004015AC    83EC 08         sub esp,0x8                          ; 恢复堆栈 004015AF    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 004015B2    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015B5    895424 04       mov dword ptr ss:[esp+0x4],edx       ; 将EDX内容压入栈,就是我输入的b(=2) 004015B9    890424          mov dword ptr ss:[esp],eax           ; 将EAX内容压入栈,就是我输入的a(=1) 004015BC    E8 84000000     call 未命名1.00401645                   ; c函数方式 004015C1    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 004015C4    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015C7    895424 04       mov dword ptr ss:[esp+0x4],edx       ; 将EDX内容压入栈,就是我输入的b(=2) 004015CB    890424          mov dword ptr ss:[esp],eax           ; 将EAX内容压入栈,就是我输入的a(=1) 004015CE    E8 88000000     call 未命名1.0040165B                   ; c++函数方式 004015D3    83EC 08         sub esp,0x8                          ; 恢复堆栈 004015D6    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 004015D9    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015DC    89C1            mov ecx,eax                          ; 将EAX寄存器的值放入ECX 004015DE    E8 90000000     call 未命名1.00401673                   ; 寄存器方式 004015E3    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 004015E6    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015E9    895424 04       mov dword ptr ss:[esp+0x4],edx       ; 将EDX内容压入栈,就是我输入的b(=2) 004015ED    890424          mov dword ptr ss:[esp],eax           ; 将EAX内容压入栈,就是我输入的a(=1) 004015F0    E8 9A000000     call 未命名1.0040168F                   ; stdcall调用方式 004015F5    83EC 08         sub esp,0x8                          ; 恢复堆栈 004015F8    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]      ; 将scanf的结果放入EDX(b) 004015FB    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       ; 将scanf的结果放入EAX(a) 004015FE    895424 04       mov dword ptr ss:[esp+0x4],edx       ; 将EDX内容压入栈,就是我输入的b(=2) 00401602    890424          mov dword ptr ss:[esp],eax           ; 将EAX内容压入栈,就是我输入的a(=1) 00401605    E8 9D000000     call 未命名1.004016A7                   ; 递归调用
  然后我们随意跟进一个函数,如图(我选择的是C函数方式)
  简单分析,易得:  复制代码 隐藏代码 00401645    55              push ebp                             ; ebp入栈保护现场 00401646    89E5            mov ebp,esp                          ; 保存栈指针 00401648    83EC 10         sub esp,0x10                         ; 设置栈指针 0040164B    8B55 08         mov edx,dword ptr ss:[ebp+0x8]       ; 从栈中读入edx(a) 0040164E    8B45 0C         mov eax,dword ptr ss:[ebp+0xC]       ; 从栈中读入eax(b) 00401651    01D0            add eax,edx                          ; 将eax和ebx相加,读入eax 00401653    8945 FC         mov dword ptr ss:[ebp-0x4],eax       ; 保存eax的值入栈准备引用(c) 00401656    8B45 FC         mov eax,dword ptr ss:[ebp-0x4]       ; 将c作为返回值放入eax 00401659    C9              leave                                ; 恢复栈 0040165A    C3              retn                                 ; 函数返回
  综上所述,我们可以得到以下几点:
  1.大多数调用协定都将栈作为参数传递的途径
  2.在进入一个函数时执行call指令就是做了两步:
  (1)将下一行指令地址压入栈
  (2)跳转到call后的地址
  3.将eax作为返回值
  4.return指令实际做的事:
  (1)跳转到栈顶的那个地址
  (2)栈顶中的地址出栈
  所以,函数为了返回必定要用栈,分析栈也就可以知道函数是从哪调用的。 正式开始调用栈
  栈不止可以用于函数调用,临时数据的存储都是用栈,但是,栈中为了函数调用的部分称为调用栈,用调用栈可以分析函数是从哪里调用的。 OD对调用栈的支持
  快捷键(Alt+K)
  如图便是OD的调用栈窗口
  第一行是Main函数里的函数
  第二行是Main函数 调用栈找地址法原理
  通过调用栈,我们可以知道函数是从哪里调用的,便可以知道是哪里触发了函数,便可轻易找到是哪里判断了注册码是正确还是错误的。 实战调用栈法
  我又写了一个小程序,源码如下(验证部分和我上次发帖的一样):  复制代码 隐藏代码 #include #include #include #include #include using namespace std; int check(string username,string sn);//检测注册码正确性  int registe();//注册界面  int help();//帮助界面  int main(){         cout<<"1.注册"<>choose;         if(choose==1){                 registe();         }          else if(choose==2){                 help();         }         else{                 cout<<"没有这个选项!"<>username;     cout<<"请输入序列号:"<>sn;     check(username,sn);     system("pause");     return 0; } int check(string user,string sn){     for(int i=0;i
零食一哥良品铺子失宠了?被资本和消费者双抛弃编者按你上次踏进良品铺子的门店,是什么时候?最近,一向以高端定位在零食界闻名的良品铺子,迎来了被资本抛弃的噩耗。是资本变心了,还是市场赛道变了?推荐你看这篇文章,看良品铺子如何从零恒大教训不基于核心竞争力的扩张就是作死01hr恒大价值2万亿的教训最近皮带哥的日子不太好过,甚至还有没有多少日子都不好说了。昨天一天下来,先是广州越秀公安微博一石激起千层浪然后就是跳了吧,没跳,跳了,没跳的反转再反转。我是个妈妈,我需要铂金包纽约上东区妈妈圈的焦虑与竞争前言当妈妈对于女性来说,是人生的一次重要转折,很多女性在生完孩子之后,既体会了为人母的幸福,也遇到了各种各样的焦虑,像是,重新回归工作会不会有困难?跟老公的分工合作会不会产生矛盾?11月份我国电商物流指数为106。6点,总业务量小幅回升12月3日,中国物流与采购联合会和京东集团联合调查的2022年11月中国电商物流指数为106。6点,比上月回落0。3个点。从9个分项指数看,总业务量指数农村业务量指数满意率指数和成诺淇奢品洗护丨那件被你洗坏的Moncler羽绒服,后来怎么样了?你今天出门被虐了吗?全国各地陆续开启了降温模式,气温随着雪花急速下降,街头上也开始出现一波波冬日虐狗的景象。不是变着花样的情侣羽绒服LOOK,就是像杜江和霍思燕那样的互相取暖现场,Dart知识点混入Mixin头条创作挑战赛本文同步本人掘金平台的文章httpsjuejin。cnpost7128957843314573349推荐使用线上编辑器dartpad。cn进行学习,测试什么是混入Mi退休养老好去处建水常看到有人讨论哪里最适合退休后养老,要我说,退休后就去云南的建水古城去养老。去年五月我去云南旅游,也到建水游玩了一下,对它留下了深刻的印象。建水地处云南,那里气候宜人,风景秀丽,四2022GV最新GoogleVoice转移教程大家好,今天来更新一下关于2022GV最新GoogleVoice转移教程,相信很多小伙伴都玩过GoogleVoice,但是很多人都不会转移到自己的帐号上,但是现在更新了最新的政策,魅族太猛了骁龙870OLED直屏Flyme9,跌至1449元魅族的成立时间比小米早,但是却被后来居上,有网友归咎于魅族一直扶持联发科导致体验受到质疑,直到魅族Pro7之后,就彻底爆发,被网友嫌弃了,发布价2880元的魅族Pro7,最终以12今年第1000亿件快递已送达作者丨费心懿编辑丨林曦图源丨新华社大浪淘沙,多重挑战下的2022年,快递业再次坚韧地走进千亿件时代。国家邮政局快递大数据平台实时监测数据显示,2022年12月1日,今年我国快递业务四川攀枝花风景名胜区1。二滩国家森林公园4A二滩国家森林公园地处成都峨眉山西昌昆明这条旅游热线上,既有美丽的自然风光,如高山峡谷湖泊森林,也有壮观的人工建筑,二滩水电站。景区内为高山峡谷地貌,交通不是
球队是否该交易?利拉德我们必须做任何需要的事情来赢得比赛直播吧1月23日讯今日NBA常规赛,开拓者遭遇逆转112121不敌湖人。赛后,开拓者球星利拉德接受了媒体采访。记者问道球队是否应该在交易截止日前完成一笔交易(IftheBlazer亲历者讲述入境韩国经历机场工作人员坚持让我们戴上黄牌机场等待区图片来自受访者红星新闻记者丨宋昕泽蓝婧实习生严瑾编辑丨王禾此前,中国旅客入境韩国被发放黄牌一事引起热议。韩国除了对自中国入境持短期签证的旅客发放黄牌,还采取了暂停发放自中印度贸易部长苹果希望将其印度产品份额提高到25,目前仅57IT之家1月23日消息,苹果公司希望印度占其产量的比例从目前的57提高到25,印度贸易部长PiyushGoyal在本周一的一次会议上说道。苹果,另一个成功故事,PiyushGoya在virtmanager的主机和客户机之间共享文件夹在本指南中,你将学习如何在virtmanager的KVMQEMU和libvirt的主机和客户机之间共享文件夹。virtmanager应用或软件包使用libvirt库来提供虚拟机管理哪个厂商更宠粉儿?看看雷军对小米11用户的态度,答案显而易见在手机行业进入存量市场以后,厂商无法获得爆发性增长,所以粉丝群体显得极为重要,厂商费只能尽心思留下客源。在所有厂商中,哪个品牌的老板更宠粉呢?大多数人可能会下意识回答雷军,从近两年现代人类起源在哪自从进入基因研究后,欧美学者就提出了现代人类起源于非洲的假说。然而,这个假说漏洞百出,其所依据的则是现代非洲黑人,其身上的DNA中保留的Y染色体,比其他任何人种都更古老而杂乱,例如谷歌gmc购物广告自动促销显示技巧今天我将解释如何从谷歌购物广告的自动促销功能中获得最大的收益。哪些属性是用来创建自动促销的?涉及的谷歌feed属性销售价格和有效日期salepriceeffectivedate价格游戏停运补偿也是一门学问,真有游戏大厂愿意直接退款吗游戏停服以后玩家怎么办,这是一个老生常谈的话题。要知道虽然很多玩家在游戏还在运营时,被GM甚至策划当爹哄,但是一旦游戏停服,他们立刻就成为了游戏公司的弃子。所以游戏停服时,玩家是最AirPodsMax新颜色要来?苹果官网拉长交货日期至1个月后IT之家1月24日消息,苹果中国官网显示,AirPodsMax的交货时间为1个月之后。今天(1月24日)下单,预估交货日期为2月15日至2月22日。苹果中国官网AirPodsMax移动电子商务的概念对现代社会的影响重要意义及未来发展趋势互联网技术的应用是没有边界的,电子商务的商业运用范围不应该有局限。现阶段,电子商务如何突破仅仅服务于网上交易的局限,进而服务于线下交易?移动电子商务为这种突破提供了可能通过交易者信神马搜索如何提升搜索的时效性?小叽导读什么是搜索的时效性?有哪些特征?如何优化?本文分享神马搜索在搜索排序时效性问题上的实践和探索,从基础特征优化开始,通过标注数据进行排序和召回模型优化,以及时效性排序的召回体