为了能到远方,脚下的每一步都不能|

园龄:粉丝:关注:

04 2021 档案

栈帧的作用
摘要:栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问栈内局部变量、参数、函数返回地址等的手段。 下面通过一个案例呈现: 先编写一个很简单的程序,但是这个程序一定要用到局部变量或参数,详细代码见下图 Test.cpp #include <stdio.h> #include <Windows.h>
144
0
0
X64位系统的函数调用方式
摘要:1.x64系统的调用方式统一使用一种变形的fastcall,即前四个参数在寄存器存储,由函数自己清理,后面的参数由栈存储,由调用者清理。具体存储位置见《逆向工程核心原理》p391 37.1.5 2.虽然前四个参数由寄存器存储,但是栈仍然预留了32个字节的空间。具体预留多少个栈空间由调用者约定,而将寄
445
0
0
调试错误 由于函数的调用约定造成的错误
摘要:当你在调试中遇到 Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function de
489
0
0
Windows编程中,Zw、Ke、Nt开头的函数代表什么
摘要:这些都代表着是Windows native(原生)系统服务(system services)例程(routines)。Ke - kernel的缩写,代表的是内核模式的API接口。Nt - Windows New Technology的缩写,代表的是Windows 系统服务功能API接口。 大部分以N
1535
0
0
vs2010静态生成exe
摘要:编译方式: 第1种: 设置:1、项目->配置属性->常规->MFC的使用:在静态库中使用MFC2、项目 -> 配置属性->C/C++->代码生成->运行库 :选择 多线程调试(/MTd)。 编译时,选择的是debug,win32然后执行编译生成方案,在该工程目录下的debug文件中,找到该.exe文
635
0
0
利用两个dll实现全局钩子
摘要:全局消息钩子的钩子函数一定要再dll中,然后启动安装钩子不能在dll中,要是我想在程序开始时安装钩子怎么办。很简单利用两个钩子就行了,只要安装钩子和钩子函数不在同一个dll就行了。 下面请看案例(编译 编译环境: vs2010 多字节 已在window7 32位测试通过 ) //mouseHook.
153
0
0
修改PE数据加载dll注意事项
摘要:如何加载dll网上有很多资料,我就不赘述了,我分享一下我在练习过程碰到的问题 1.IAT指向的地方不能为空 可能大家觉得IAT的地址是运行时系统赋予的,就指向了一个0字节的位置,但是PE装载器会认为你的IAT已经结束了,会造成这个dll加载失败 其实谁便写点什么都行 2.加载的dll一定要至少有一个
116
0
0
PE扩大节区的方法
摘要:PE结钩我就不多说了,网上有资料,这里只讲操作性的东西,也就是说本文适合有一定pe基础的学习者。 本次案例工具于原料有 ollydebug、CFF Explorer、WinHex以及本次用来修改的程序 下载地址:http://pan-yz.chaoxing.com/share/info/bb01f4
295
0
0
PE增加空白节区的方法
摘要:PE结钩我就不多说了,网上有资料,这里只讲操作性的东西,也就是说本文适合有一定pe基础的学习者。 本次案例工具于原料有 ollydebug、CFF Explorer、WinHex以及本次用来修改的程序 下载地址:http://pan-yz.chaoxing.com/share/info/bb01f4
233
0
0
文件数据加载至内存映射的一些问题
摘要:1.内存节区一定比文件节区大 2.到底复制多少数据取决于文件节区的大小,内存节区的多余部分全部为0
59
0
0
鼠标钩子的安装及钩取函数的参数解析
摘要:一、鼠标钩子的安装 SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInstance,0); WH_MOUSE 表明安装的是鼠标钩子 MouseProc 钩子函数的地址 g_hInstance 钩子函数所在dll的地址 0 为0表示是全局钩子 二、钩子函数解析 LRES
1209
0
0
逆向工程核心原理 使用代码钩取技术钩取ZwQuerySystemInformation达到隐藏进程的目的
摘要:因为我喜欢把功能封装成函数集中放在头文件中,要导入两个我自己编写的头文件 链接: http://pan-yz.chaoxing.com/share/info/e9683ebe7126a18f 首先是注入程序 他可以将dll注入至pid>100的进程中 也可以卸载dll 隐藏进程3.c #includ
321
0
0
代码钩取心得
摘要:今天碰到了三个问题 第一:vs 2010 的变量要在函数的开头声明 第二: 一点要注意函数的调用方式,已经是第二次错误了 第三:VirtualProtect的权限最好用最好权限PAGE_EXECUTE_READWRITE,不然有可能会出错。 通过这个代码钩取我学到遇到问题一定要冷静 ,不要太过贪心急
40
0
0
WinAPI ZwQuerySystemInformation的简要分析
摘要:NTSTATUS WINAPI ZwQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, //枚举类型,用户输入值选择要查询的信息 _Inout_ PVOID SystemInformation,
591
0
0
c语言 ZwQuerySystemInformation查看进程信息
摘要:#include <stdio.h> #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) #define STATUS_INFO_LENGTH_MISMA
315
0
0
c语言关于调用方式的不同
摘要:有些window API 是标准调用 如ZwQuerySystemInfoMation 要在函数名前加WinAPI 这样编译器就会在函数内部处理参数 有些window API 是c语言方式调用 如MessageBox 不用做特殊处理,这样编译器就会在函数调用后在外部处理参数
69
0
0
以类比的方式理解函数指针
摘要:函数指针对我来说一直是老大难得问题,今天我终于对于他有了一点点理解。 一般情况下,对于函数指针大多数是下面两种情况: 1.void (*PFN_SetProcName)(LPCTSTR szProcName); 2.typedef void (*PFN_SetProcName)(LPCTSTR sz
86
0
0
一步一步实现使用vs2010调试被注入的dll
摘要:其实调试dll的方式十分简单,你只到在dll的代码页上打断点,再用vs启动要加载dll的程序即可。 但是如果我们要调试被注入的dll怎么办呢? 假如我们要调试被注入notepad的dll怎么办呢? 第一步:在dll代码上打断点 第二步: 附加到notepad程序 点击调试 点击附加到程序 然后选择n
723
0
1
C++ - 纯C语言写的代码在C++中使用
摘要:此代码为转载:https://www.cnblogs.com/citrus/p/13322365.html#ifdef __cplusplus extern "C"{ #endif //C代码内容所在位置 #ifdef __cplusplus } #endif
94
0
0
c/c++ 生成debug函数,使用API会检查堆栈平衡
摘要:今天我使用的代码钩取的技术手段钩取了loadLibaryA,但是却报错了,查看汇编代码,发现在调用loadLibaryA后还会调用一个检查堆栈平衡的函数,这个是编译器在debug版本自动加的。 详细说明请看: 本次案例代码为钩取函数的代码,编译环境为:vs2010,字符集为unicode,运行环境w
255
0
0
不同进程导入的dll是否为共享
摘要:dll 中的代码是共享物理内存的, 数据是写时复制, 没有修改数据之前是共享的, 修改的时候会拷贝一份来修改, 之后就不会共享物理内存了.可以通过设置共享段来共享数据, 共享段里的数据在各个进程间共享物理内存(即使句柄不同也无所谓, 虚拟内存机制可以把不同的进程虚拟地址映射到相同的物理地址上) 详细
263
0
0
c语言 函数钩取的可行性
摘要:我一直觉得很奇怪,为什么仅仅是把API的前五个字节改成JMP指令就可以转到另外一个函数执行,难道另外一个函数的活动不会改变寄存器与栈从而影响程序的运行吗? 现在终于有了答案,编译器在编译函数时会自动帮我们保存和还原寄存器和栈 ,并且c语言的调用函数方式不会清理参数。这样就不会改变程序的运行状态。 详
79
0
0
c语言钩取函数 并奉上使用实例 2021-04-08 110
摘要:运行环境: Windows 7 32位 Visual Studio 2010 /** 名称:getAPIAddress 功能: 根据模块名称和函数名称获取函数地址 参数: TCHAR * moduleName 模块名称 TCHAR * funcName 函数名称 返回值:return 1 repre
175
0
0
c语言 将byte转化为二进制数值计算 2021.4.7
摘要:BYTE bytes1[4] = {0x00,0x10,0x40,0x00}; //创建4字节的字节数组 注意:字节是逆序的 BYTE bytes2[4] = {0x05,0x20,0x40,0x00}; DWORD b1 = *(DWORD *)bytes1; //先将bytes1转化成(DWOR
573
0
0
[汇编]JMP 指令 地址该写多少 2021.4.6
摘要:假如说要在00402000出写下跳转到00401000处用16进制该怎么写? 根据Intel x86 JMP指令的16进制为E9,所以地址为E9 XXXXXXXX,需要注意的是XXXXXXXX地址值不是要跳转的绝对地址值,而是从当前JMP命令到跳转位置的相对距离。 JMP指令转换为机器码时,需要计算
942
0
0
C语言 输出宽字符中文
摘要:#include <locale.h> void main(){ setlocale(LC_ALL, "chs"); printf("当前程序运行的工作目录:%ws",path); } 代码页编码 936 注意:setlocale(LC_ALL, "chs"); 一定要放在输出的前面 std::co
243
0
0
C语言 获取进程文件路径
摘要:DWORD GetModuleFileNameA( HMODULE hModule, // in 进程路径 LPSTR lpFilename, // out 存储文件路径的缓冲区首地址 DWORD nSize //in 缓冲区的大小); 头文件: windows.h 使用案例一:获取本进程的文件路径
718
0
0
C语言 dllMain的格式
摘要:/** 名称:DllMain 功能: dll被操作是系统会自动调用 参数:HANDLE hModule dll的句柄 DWORD ul_reason_for_call 调用原因 LPVOID lpReserved 如果是动态加载则为NULL 静态加载则为非NULL 返回值:BOOL 如果为False
269
0
0
C语言 导出函数的格式
摘要:#ifdef __cplusplus //如果是c++文件,就将endif内的代码用c编译器编译 extern "C" { #endif __declspec(dllexport) void SetProcName(LPCTSTR szProcName)//__declspec(dllexport)
1319
0
0
以类比的方式理解函数指针
摘要:函数指针对我来说一直是老大难得问题,今天我终于对于他有了一点点理解。 一般情况下,对于函数指针大多数是下面两种情况: 1.void (*PFN_SetProcName)(LPCTSTR szProcName); 2.typedef void (*PFN_SetProcName)(LPCTSTR sz
66
0
0
点击右上角即可分享
微信分享提示
深色
回顶
收起