通过PEB寻找函数地址】的更多相关文章

  通过PEB的Ldr参数(结构体定义为_PEB_LDR_DATA),遍历当前进程加载的模块信息链表,找到目标模块.   摘自PEB LDR DATA: typedef struct _PEB_LDR_DATA { 0x00 ULONG Length; /* Size of structure, used by ntdll.dll as structure version ID */ 0x04 BOOLEAN Initialized; /* If set, loader data section…
其实分在逆向篇不太合适,因为并没有逆向什么程序. 在http://www.exploit-db.com/exploits/28996/上看到这么一段最简单的ShellCode,其中的技术也是比较常见的,0day那本书上也提到过,大神都用烂了.不过想来很久没有碰汇编了,就心血来潮,权当温习一下. /* User32-free Messagebox Shellcode for any Windows version ==========================================…
我们一般要获得一个函数的地址,通常采用的是明文,例如定义一个api函数字符串"MessageBoxA",然后在GetProcAddress函数中一个字节一个字节进行比较.这样弊端很多,例如如果我们定义一个杀毒软件比较敏感的api函数字符串,那么可能就会增加杀毒软件对我们的程序的判定值,而且定义这些字符串还有一个弊端是占用的字节数较大.我们想想如何我们的api函数字符串通过算法将它定义成一个4字节的值,然后在GetProcAddress中把AddressOfNames表中的每个地址指向的…
Delphi中使用@取函数地址的问题   例如以下代码:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;type  TForm1 = class(TForm)    procedure one();    function two(x,y:integer):integer;  private    { Private declar…
还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的代码抄抄,也玩玩符号文件解析获取未导出函数,可惜资料寥寥无 几,下了一些代码,发觉编译后问题不断,有的编译通过了却取不到任何地址,弄了半天白弄了,于是静下心来看dbghelp的说明文件(中文的都木有),发 觉dbghelp用起来很不爽,由于版本太多,又是32位和64位什么的,最要命的是dbghelp…
1. 查看函数地址     看函数在代码的哪一行,使用info line就可以看到类似下面这中输出 点击(此处)折叠或打开 (gdb) info line a.cpp:10 Line 10 of "a.cpp" starts at address 0x80487d4 <_ZN1B5test2Ev> and ends at 0x80487d7 <_ZN1B5test2Ev+3>. (gdb) p _ZN1B5test2Ev $1 = {void (B * cons…
在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法.C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数. // Thunk.cpp : Defines the entry point for the console applicatio…
C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以…
这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的. 其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2种方法(pointer_cast 和 union_cast). 至于:为什么要取成员函数的地址? 因为可以通过一定的手段 让成员函数作为回调函数, 而不再使用全局的静态函数. 天气热,话不多说, 使用方法见最后. 方法1: pointer_cast - 通过静态转换 template<typenam…
C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,熟悉内存模型) 1.复习开发知识 首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的…
这几天在分析一个性能未达预期的功能,使用gperftools cpu profiler生成后,使用pprof格式化的时候,发现pprof出的结果函数名未翻译.为函数地址,如下所示: 每个节点代表一个函数,节点数据格式: Class Name Method Name local (percentage) #不包含内部其他函数调用所消耗的CPU时间(内联函数除外) of cumulative (percentage) #整个函数消耗的CPU时间,包括函数内部其他函数调用所消耗的CPU时间,如果与lo…
1.GCC平台 GCC平台获取C++成员虚函数地址可使用如下方法[1]: class Base{ int i; public: virtual void f1(){ cout<<"Base's f1()"<<endl; } }; Base b; void (Base::*mfp)() = &Base::f1; printf("address: %p", (void*)(b->*mfp)); 上面的代码在Linux g++ (GC…
转自:“http://www.cnblogs.com/nbsofer/p/get_member_function_address_cpp.html” 这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的. 其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2种方法(pointer_cast 和 union_cast). 至于:为什么要取成员函数的地址? 因为可以通过一定的手段 让成员函数作为回调函数, 而…
C语言中可以用函数地址直接调用函数:   void print ()   {   printf ("function print");   }   typdef void (*fun)();   fun f = print;   f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用:   class test   {   public:   void print ()   {   printf ("function print");   }…
为什么要写这篇文章 1.      因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了KiFastCallEntry这个函数. 2.      碰巧前天又在网上看到了一篇老文章介绍xxx安全卫士对Windows系统调用的Hook,主要就是Hook到这个函数 3.      刚刚做完毕业设计,对使用中断来实现系统调用的方式记忆犹新. 以上原因导致我最近眼前总是出现系统调用这个词,脑海中总是出现系统…
通过以上3篇文章的学习,我们已经可以获取到kernel32.dll的地址了下一步 我们就是获取几个重要的函数 1.GetProcAddress 2.LoadLibrary 有了这两个函数很多函数都可以找到了,这节的目的最终就是找到这两个函数,为了便于测试和验证我们还要动态获取下MessageBoxA函数,最后弹出个对话窗口,还要安全退出那就要用到ExitProcess. 那么咱们就结合0day2第三章的知识,通过hash来查找的相应的函数名称,再间接获取函数地址 首先我们先来找到hash #in…
讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,熟悉内存模型) 1.复习开发知识 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数…
VS debug下为什么call 函数后,会jmp函数地址?多此一举? http://blog.csdn.net/viper/article/details/6332934 在写跑在main之前的时候,碰到了很奇怪的问题. [cpp] view plaincopy int initBreak() { DebugBreak(); return 0; } typedef int (*pInit)(); pInit start3 = initBreak; initBreak是函数名,start3 是指…
本次要做的尝试是通过修改导出表的函数地址,实现程序功能的更改,实现这个最大的限制就是堆栈平衡问题. 先写一个DLL和EXE为了测试. DLL代码如下: 这样的话有两个导出函数(我们假设是一个密码验证之后执行的函数): EXE测试代码如下: 也就是简单模拟下DLL调用,默认情况下因为密码错误,所以执行结果是这样: 然后开始一步一步分析处理问题: 1.确定需要替换函数堆栈平衡 首先IDA看下两个导出函数的调用堆栈,也就是看下参数是否一样,不然直接调换位置会导致函数调用之后堆栈不平衡: 可以确定,这两…
note 本基于c++11介绍一种使用map保存成员函数地址 可避免使用 if 和 switch 配置灵活 方便, 代码维护效率高 结果: 范例开始 头文件包含 #include <iostream> #include <map> #include <algorithm> 必要类型前置声明 class pop_input_ui; /// 前置声明 typedef void (pop_input_ui::*psend_cmd)(); /// ---------------…
刚刚看到一篇博客,说 std::bind 无法绑定正确的重载函数.这里的问题并不是 std::bind 能力不足,而是将函数名传递给 std::bind 时编译器无法取到这个函数的地址(也就是符号,编译器会先解析成符号,链接器再替换为地址),因为有多个重载函数都是这个名字.核心问题是无法通过函数名取到想要的重载函数地址.就像下面的代码无法编译通过: #include <iostream> void f() { std::cout << "f 1" <<…
同样也是寒江独钓的例子,但只给了思路,现贴出实现代码 原理是通过改变端口驱动中本该调用类驱动回调函数的地方下手 //替换分发函数 来实现过滤 #include <wdm.h> #include <ntddk.h> #include <Ntddkbd.h> #include <windef.h> // Kbdclass驱动的名字 #define KBD_DRIVER_NAME L"\\Driver\\Kbdclass" //ps2的端口驱动…
我想试验一个计算汇编指令长度的代码是否正确,因而写了如下code进行验证,但结果非常奇怪 #include <stdio.h> #include <Windows.h> int add(int a,int b) { return a+b; } extern ULONG GetOpCodeSize(PVOID Start); int main(int argc,char* argv[]) { ,); PVOID pFunc = (void*)add; ULONG ulResult =…
目的 看到群里有个朋友搞了好几天函数指针传递,没搞好.所以写一篇文章,旨在从cocos2dx中帮朋友们找到如何传递指针. 旧版本的函数指针传递 全局函数函数指针调用 一般在C++11之前,我们一般是这样定义一个函数指针类型. [cpp] view plaincopyprint? typede void(*pFunc)(int,...); 什么意思呢? [cpp] view plaincopyprint? typedef  void/*return type of function*/ [cpp]…
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function AllocateHWnd(Method: TWndMethod): HWND; 很多时候,我们想要创建一个窗口,而又不想因为这个参数而创建一个类,怎么办?换句话说,就是能不能使传入的参数是个普通的函数而不是类的方法呢?答案是肯定的!看看TWndMethod的声明: type TWndMethod = p…
#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test1; - (void)test2:(NSString *)str; @end @implementation Person - (void)test1 { NSLog(@"无参数的对象方法"); } - (void)test2:(NSString *)str { NSLog(@"带有参数的方法%@",str…
今天代码审核时确认了一个问题,理解了java中string和stringbuffer赋值问题,看到一个帖子很好,摘录如下: 理解这两个例子需要分清实参和形参的区别,引用和对象的区别 第一个例子的内部执行过程: 1.引用str1指向新对象new String("hello") 2.test( )刚刚开始调用时,形参(parameter)str复制了实参(argument)str1的值,这个值也就是对象new String("hello")的地址,所以这时候引用str和…
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function AllocateHWnd(Method: TWndMethod): HWND; 很多时候,我们想要创建一个窗口,而又不想因为这个参数而创建一个类,怎么办?换句话说,就是能不能使传入的参数是个普通的函数而不是类的方法呢?答案是肯定的!看看TWndMethod的声明: type TWndMethod = p…
转自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml 另外dl_iterate_phdr可以查到当前进程所装在的所有符号,每查到一个就会调用你指定的回调函数. 下面的代码示例如何使用dl_iterate_phdr和dladdr #define _GNU_SOURCE#include <link.h>#include <stdlib.h>#include <stdio.h> static …
首先简介梯度法的原理.首先一个实值函数$R^{n} \rightarrow R$的梯度方向是函数值上升最快的方向.梯度的反方向显然是函数值下降的最快方向,这就是机器学习里梯度下降法的基本原理.但是运筹学中的梯度法略有不同,表现在步长的选择上.在确定了梯度方向(或反方向)是我们优化目标函数值的方向后,我们不能够直接获得最佳的步长.常规的做法是选定一个固定的步长,而运筹学中的做法是将问题转化为一个一维搜索问题,进而通过求解这个一维问题(关于步长的函数)的最大最小值获得最佳步长. 一个好消息是若目标函…