首页 > 其他分享 >xp下GetLastError实现

xp下GetLastError实现

时间:2022-11-07 19:35:58浏览次数:42  
标签:GetLastError 实现 teb eax 000 dword xp ptr


    大家对这个win32 API一定很熟悉了,那就来看下他的实现:

0:001> x *!GetLastError  //搜索符号地址
7c830759 kernel32!GetLastError = <no type information>

0:001> uf 7c830759
kernel32!GetLastError:
7c830759 64a118000000 mov eax,dword ptr fs:[00000018h]
7c83075f 8b4034 mov eax,dword ptr [eax+34h]
7c830762 c3 ret

    先获得线程teb,然后从teb+0x34处获得DWORD值,这个值就是错误值。顺带看下线程TEB结构:

0:001> dt _teb @$teb
ntdll!_TEB
+0x030 ProcessEnvironmentBlock : 0x7ffdd000 _PEB
+0x034 LastErrorValue : 0xcb

    执行GetLastError验证一下结果是不是为0xcb:


    

0:000> g
GetLastError:203

    写到这,想到teb+0x34是个内存值,调试时修改这个值应该也会影响GetLastError的返回值吧。思路是这样:单步进入GetLastError,当获得teb的值以后修改teb+0x34处的值,最后GetLastError的值由eax返回,试一下:

0:000> l-t //逐指令运行
Source options are 0:
None
0:000> t //准备获得teb的地址
ntdll!RtlGetLastWin32Error:
7c92fe01 64a118000000 mov eax,dword ptr fs:[00000018h] fs:003b:00000018=7ffdd000
0:000> t //
ntdll!RtlGetLastWin32Error+0x6:
7c92fe07 8b4034 mov eax,dword ptr [eax+34h] ds:0023:7ffdd034=000000cb
0:000> r eax //获得teb地址
eax=7ffdd000
0:000> e 7ffdd000+0x34 ff //修改LastErrorValue
0:000> t
eax=000000ff ebx=00000000 ecx=00000001 edx=00000000 esi=00000001 edi=01003678
eip=7c92fe0a esp=0006ff50 ebp=0006ff7c iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!RtlGetLastWin32Error+0x9:
7c92fe0a c3 ret
0:000> r eax //GetLastError的返回值
eax=000000ff

最后看下OutputDebugString(buff);的输出:0xFF(Hex)=255


0:000> g
GetLastError:255






标签:GetLastError,实现,teb,eax,000,dword,xp,ptr
From: https://blog.51cto.com/u_13927568/5831059

相关文章

  • 23 种设计模式C++实现
    设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:​​单例模式​​、​​原型模式​​、​​工厂方法模式​​、​​抽象工厂模式​​、​​建造者模式​​。结构......
  • 数据解析:bs4与xpath
    数据解析原理概述:-解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储-1.进行指定标签的定位-2.标签或者标签对应的属性中存储的数据值进......
  • 后台管理系统-权限控制的实现
    ps:服务器返回用户的权限标识;主要在登录的时候判断用户的权限1.左侧菜单显示 2.路由的页面跳转-使用addRoutes增加动态路由规则并注入路由实例rout......
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
    (建议初学者把这个系列前面的都看看,那对于redis的基本使用操作及一些消息的订阅分布都是没问题的了)Redis,一个缓存数据库。不仅仅是能用于对数据的CRUD,也可以作为一个消息中间......
  • SECURITY_ATTRIBUTES 实现最低权限总结
    SetSecurityDescriptorDacl函数可以用来设置DACL中的信息。如果一个DACL已经在securitydescriptor中存在,那么此DACL将被替换。值得注意的是MSDN中的Remarks中有这样的描......
  • 在线升级:OTA升级的原理和实现方式
    在平常的项目开发和调试中,下载程序一般使用的是外部下载器或者串口的方式实现对单片机的程序下载和刷新,这种方法在项目的开发阶段是常用的方式。但是当项目开发完成推向市场......
  • vue实现展开收起
    通过设置css超出换行,监听是否超出所设置的值,重新对数据插入标识,并刷新dom树实现。<divclass="class-datas"> <pclass="datas-title">可排课专业:</p> <p:class="`${......
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
    前言 该篇介绍的内容如题,就是利用redis实现接口的限流( 某时间范围内最大的访问次数) 。正文 惯例,先看下我们的实战目录结构:首先是pom.xml核心依赖: <!--用于redis......
  • Springboot 自定义mybatis 拦截器,实现我们要的扩展
    前言相信大家对拦截器并不陌生,对mybatis也不陌生。有用过pagehelper的,那么对mybatis拦截器也不陌生了,按照使用的规则触发sql拦截,帮我们自动添加分页参数。那么今天,我们的实......
  • jQuery实现下拉选项框
    html文件:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><style>*{padding:0px;margin:0px;}.content{width:10......