还在为找内核未导出函数地址而苦恼嘛?
还在为硬编码通用性差而不爽吗?
还在为暴搜内核老蓝屏而痛苦吗?
请看这里:

最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的代码抄抄,也玩玩符号文件解析获取未导出函数,可惜资料寥寥无
几,下了一些代码,发觉编译后问题不断,有的编译通过了却取不到任何地址,弄了半天白弄了,于是静下心来看dbghelp的说明文件(中文的都木有),发
觉dbghelp用起来很不爽,由于版本太多,又是32位和64位什么的,最要命的是dbghelp的说明文件里所有升级了的函数一律找不到旧函数的说明
了,加之编译器里包含的相关文件版本不一,里面的函数用起来经常出现莫名其妙的问题,我估计也就是网上抄来的代码在自己机子上不能用的原因吧。于是自己写
了个Dll,放几个接口,保证在其他电脑上也可用。

先说下思路:
1、InitSymHandler(进行一些初始化)
1.1、先创建一个目录 symsrv.yes文件,没这个symsrv.dll不会自动下载符号文件
1.2、取自己进程句柄,用GetCurrentProcess取的没用,原因不明,网上的代码很多用这个,但我用死活不行
1.3、设置符号文件目录,调用SymInitialize进行初始化

2、LoadSymModule(加载符号文件)
2.1、使用SymGetSymbolFile来取得符号文件,如果搜索路径没有这个文件,那么将从微软服务器下载,然后调用SymLoadModule64加载它
2.2、路径设置如:srv* xxxx *http://msdl.microsoft.com/download/symbols

3、GetSymByName(获取未导出函数或变量地址)
3.1、上面2步好了后第一次运行时会下载符号文件,要等一会(机子一定要保持联网- - 当我白说),下载好后以后运行就快了
3.2、GetSymByName会调用SymGetSymFromName根据函数名称获取其地址,我用网上说的EnumSyms怎么也不行,不是调用失败就是得到的数据是0,蛋疼不已,不得已从dbghelp翻了这个函数出来了

4、CloseSym
不需要符号文件了后调用这个函数把符号文件打开的一些句柄什么的关闭,退出,没什么好说的

调用形式在SymbolAnalyzeDll.inc里已经定义了,用汇编的话直接包含就行了,其他自行改改就好,暂时不支持64位,虽然里面用的都是
64位的函数。折腾了1天多被莫名其妙的各种问题弄得筋疲力尽,结果弄了个这么个东西,离我的设想还好远,源码也附上,有兴趣的朋友可在此基础上增加更多
功能,暂时不想写了,所以有更好的版本记得发给楼主我也用用。

测试程序和调用示例都包含在附件里了,注意里面的ModuleBase_win32k内核基址我硬编码的,这个要自己改,ring3下怎么获取内核文件基
址还没实践过,内核下遍历下就可以了,所以就懒的写了,不过不传入内核基址也没关系,只不过返回的是相对基址的偏移,然后+下基址也没问题。

PS:如果网络不好可能会调用失败

源码-Dll-测试程序(更新了下,发现CloseSym有个错误,现在更新了调用LoadSymModule的ModuleBase为0也可以返回正确的地址,而不是偏移):

http://pan.baidu.com/share/link?shareid=4223498672&uk=3895584076

告别硬编码-发个获取未导出函数地址的Dll及源码的更多相关文章

  1. 告别硬编码,让你的POI导入导出拥抱变化

    GitHub地址 | 博客 | 中文 | English | 原文链接 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择 ...

  2. 告别硬编码,mysql 如何实现按某字段的不同取值进行统计

    上周我突然意识到,我在grafana上写的 sql 语句存在多处硬编码.这篇笔记将记录如何实现没有硬编码的sql语句,以及自学编程过程中如何应对自己的笨拙代码和难题不断的状况. 1.有效但粗笨的硬编码 ...

  3. highchart导出功能的介绍更改exporting源码

    本案利用highchar作为前端,展示数据的图形效果,结合spring+springmvc来完成数据图片的导出. jsp引入文件: <script src="${pageContext ...

  4. 【UE4】如何获取/下载虚幻4(Unreal Engine4)源码

    在官网中点击[获取虚幻引擎]可以看到,虚幻4完整源代码已经放在Github上,所以与其用百度搜别人的资源,当然是直接上Github下啊. 主要步骤如下: 注册一个Github帐号,这个没啥值得说的. ...

  5. Session获取不到的情况及解决办法(源码解析)

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处,请尊重他人努力成果,谢谢. 1. 当有连个sessionFactory时,容易产生获取不到session的情况 ...

  6. python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)

    今天我们来说一说rest framework 中的 版本 操作的详解 首先我们先回顾一下 rest framework的流程: 请求进来走view ,然后view调用视图的dispath函数 为了演示 ...

  7. 告别尬聊,解锁秀场+社交新玩法(内含源码+Demo)

    直播已成为用户的生活习惯之一 艾媒咨询数据显示:2021年直播用户规模达到6.35亿人,在线直播用户以年轻群体为主,24岁及以下用户占比49%,30岁以下用户接近8成. 众所周知,Z世代用户是一个社交 ...

  8. 利用pdb获取未导出符号

      BOOL InitSymHandler(HANDLE hProc)   {   CHAR SymPath[MAX_PATH], CurDir[MAX_PATH];       GetCurrent ...

  9. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

随机推荐

  1. 通过注解(annotation)配置Bean

    Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...

  2. Linux 中如何卸载已安装的软件

    Linux 中如何卸载已安装的软件. Linux软件的安装和卸载一直是困扰许多新用户的难题.在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序”来实现.与其相类似, ...

  3. Android控件之MultiAutoCompleteTextView(自动匹配输入的内容)

    一.功能 可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会自动去匹配,可用在发送短信,发邮件时选择联系人这种类型中 二.独特属性 android:comp ...

  4. python语法笔记(五)

    1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...

  5. 为什么要baidu/Google问题 尽量少在群里问问题

    群里问也是可以的 但是 不能指望群里的人详细的回答 有时候的回答会很到位 但是 也可以 应该更多的去网络上搜索信息 因为 那是别人已经写好的 我们为什么不顺便去获取呢 别人花费了精力 我们要尽量运用 ...

  6. phalcon: 上下文转义

    phalcon: 上下文转义 Phalcon\Escaper 转义特殊的字符 一:字符转义 $maliciousTitle = '</title><script>alert(1 ...

  7. 你必须知道的28个HTML5特征、窍门和技术

    注意:每周有那么几次,此列表会更新一些新的窍门,最终,本文会成为超级有用的资源.//zxx:丑话说在前头,我可没功夫更新,所以,即使到您女儿出嫁那天,本文还是28项内容 前端的发展如此之迅猛,一不留神 ...

  8. jQuery 请指出'.bind()','.live()'和'.delegate()'的区别

    http://kb.cnblogs.com/page/94469/网上好多类似的 简言之bind可以绑定页面上已有的,live和delegate可以绑定到还未存在于页面中的元素之上.delegate又 ...

  9. (15)odoo配置文件详解

    openerp-server.conf ---------------- [options]; addons模块的查找路径addons_path = E:\GreenOdoo8.0\source\op ...

  10. iisreset和w3wp的关系

    iisreset是iis自带一个命令行工具.用法: iisreset [computername] /RESTART          停止然后重新启动所有 Internet 服务. /START   ...