jmp

初识VEH链(用户异常派发的进一步探究)

╄→гoц情女王★ 提交于 2020-04-25 17:01:23
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html 初识VEH链(用户异常派发的进一步探究)   VEH链是进程处理异常的一个非常重要的机制。   前面我们分析到用户异常进入内核之后会再次返回到R3层调用KeExceptionDispatcher函数尝试处理。   该函数的主要目的就是搜索VEH找到异常的解决方案,如果未找到会再次向零环抛出异常。 一、通过C代码来实现VEH挂载   如下代码,VEH是一个进程全局异常处理链表。   VEH只能处理单个进程的,后面的SEH在内核中处理全局的。 1 // veh.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include " pch.h " 5 #include <iostream> 6 #include <Windows.h> 7 LONG NTAPI MyVeH( struct _EXCEPTION_POINTERS * ExceptionInfo) { 8 // 9 // 检测到 c0000094 错误并进行处理. 10 // 11 if (ExceptionInfo->ExceptionRecord->ExceptionCode = 0xc0000094 ) { 12 MessageBoxA

汇编语言系列Ⅱ 实现简单数学运算

大兔子大兔子 提交于 2020-04-24 15:35:07
软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。 5. 计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1 设计要求: 设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。数值N由加键盘输入,计算结果在显示终端输出。设计要求:计算结果不超过十六位寄存器的存储能力,如有溢出提示错误。 5.2 设计思路: 输入N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为十六进制,通过除以10得到十进制,存入堆栈再依次输出。 5.3 程序清单: DATA SEGMENT pkey DB 0dh,0ah, " pleas input N end by ';' :$ " over DB 0AH,0DH, " overflow! " ,0dh,0ah, ' $ ' result DB 0dh,0ah, ' result is: ' , ' $ ' DAT1 DB 8 DUP( 0 ) DATA ENDS STACK SEGMENT SSTACK DB 100 DUP( 0 ) STACK ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK STATE: MOV AX,DATA MOV DS,AX

计算机系统基础学习笔记(2)-数据的位运算操作

时光毁灭记忆、已成空白 提交于 2020-04-23 18:14:15
C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作。 逻辑运算操作 C语言提供了四种按位逻辑操作符,分别是按位取反,按位与,按位或,按位异或。在编译时,编译器会根据操作数的宽度分别转换为不同的指令。 操作 C语言操作符 汇编指令 按位取反 ~ notb、notw、notl 按位与 & andb、andw、andl 按位或 l orb、orw、orl 按位异或 ^ xorb、xorw、xorl 注意: C语言的逻辑与(&&)、逻辑或(||)、逻辑非(!)并没有对应的机器指令,而是由多条指令联合来实现这些功能,完成以变量为单位的逻辑操作。 下面我们以一个简单的C语言程序test.c来了解逻辑运算操作过程。 #include <stdio.h> void main() { int a=5; unsigned int b=3; short c=5; int d=0; a = ~a; b = ~b; c = ~c; d = a&b; d = a^b; d = a|b; return; } 利用gcc命令将其进行编译成可执行文件。 gcc -o0 -m32 -g test.c -o test 利用objdump命令进行反汇编并将其重定向到test.txt文件方便查看。 objdump -S test>test.txt main函数所对应的汇编指令如下所示。 000004ed <main>:

gdb 设置位置

隐身守侯 提交于 2020-04-13 18:19:47
【今日推荐】:为什么一到面试就懵逼!>>> 三种:行定位;反汇编后的地址; 行相关定位 行相关定位格式: [filename:][linenum|function] filename 文件名 如果有则是指明某个文件,可以是相对路径,也可以是绝对路径。如果匹配了多个匹配的文件,那么则会在多个文件设置多个断点。 linenum 或 function linenum 则就是在对应行设置断点 function 则是搜索当前文件的函数 label 则是搜索当前文件的 label:C++用于goto定位的 如果没有 filename : funcname 表示所有文件所有匹配的函数,包括重载,命名空间和类成员的函数 label 从当前栈帧进行搜索,如果程序没有执行不执行搜索 反汇编后的地址 break *address disassemble [/s /m /r] start,end disassemble start,end disassemble /m function disassemble /r function disassemble /s function 新版本支持 不支持文件名,搜索的是当前的断点所在栈帧。 int foo(int x) { switch(x) { case 1: return 2; case 2: return 3; default: return 42; }

脱壳->内存断点法脱壳

与世无争的帅哥 提交于 2020-04-12 18:41:02
目录 内存断点法,脱壳详解 一丶内存断点方法 1.何为内存断点法,以及原理 二丶内存断点实战演练 三丶OEP位置脱壳 内存断点法,脱壳详解 一丶内存断点方法 1.何为内存断点法,以及原理 内存断点就是在内存上下断点,然后进行下断.进而寻得我们脱壳位置处代码 脱壳和内存断点有啥关系 首先我们要明白一个壳, 常见的壳都是 先保存寄存器 保存OEP等.最后 跳转 到OEP 也就是入口点去执行代码 注意,跳转的方式很多种,只要能修改EIP即可.或者RIP. 例如 push + ret方法 jmp方法等 既然明白了会保存我们的寄存器以及恢复我们的寄存器,那么就可以使用 ESP定律 来进行脱壳了 但是这里是另一种方法 壳会读取内存,那么我们就在内存上设置 读取断点 而后读完之后最后会将数据写入到入口点(也就是Imagebase)所对应的节中,也就是 (Text)节.所以可以在 Text节上下一个内存写入断点 操作方法如下: 1.在 资源节或者 .data节中下内存访问断点(一次性) 2.shift + F9 进行执行代码,此时会断在访问数据的位置 3.继续切换到内存窗口 (Alt+ M) 在Text节上面设置一次性内存写入断点 4.shift + F9 进行执行 注意,在进行操作的时候,请务必讲异常进行忽略,以X64为例子 选型->设置->异常->添加区间 二丶内存断点实战演练 跳转到壳入口点

C和C++安全编码笔记:指针诡计

旧巷老猫 提交于 2020-04-12 10:21:12
指针诡计(pointer subterfuge) 是通过修改指针值来利用程序漏洞的方法的统称 。 可以通过覆盖函数指针将程序的控制权转移到攻击者提供的外壳代码(shellcode)。当程序通过函数指针执行一个函数调用时,攻击者提供的代码将会取代原本希望执行的代码而得到执行。 对象指针也可以被修改,从而执行任意代码。如果一个对象指针用作后继赋值操作的目的地址,那么攻击者就可以通过控制该地址从而修改内存其它位置中的地址。 3.1 数据位置: static int GLOBAL_INIT = 1; // 数据段,全局 static int global_uninit; // BSS段,全局 int test_secure_coding_3_1() // 栈,局部 { int local_init = 1; // 栈,局部 int local_uninit; // 栈,局部 static int local_static_init = 1; // 数据段,局部 static int local_static_uninit; // BSS段,局部 // buff_ptr的存储空间是栈,局部;分配的内存是堆,局部 int* buff_ptr = (int*)malloc(32); free(buff_ptr); return 0; } UNIX可执行文件包含data段和BSS段

Linux系统中隐藏掉你的rootkit的TCP连接

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-09 04:17:04
前文中,我描述了一种彻底隐藏进程的方法: https://blog.csdn.net/dog250/article/details/105292504 并且,我给出了如何恢复的方法: https://blog.csdn.net/dog250/article/details/105371830 但是不过瘾,一般而言,rootkit都是会偷偷建立一个TCP连接的,那么如何不让经理发现这些连接呢?虽然经理看不到进程,但是经理会netstat啊。 使用net namespace可以隐藏所有的连接,方法参见: https://blog.csdn.net/dog250/article/details/103182447 但是,如此一来,经理会懵的,经理会彻查这是怎么回事,所以这不妥。 必须要仅仅隐藏特定的TCP连接! 显然,将特定的TCP连接从ehash中摘除是一个彻底的方案,然而这需要hotfix tcp_v4_rcv函数,大规模二进制hook的手艺我已经发誓不再玩了,所以这次,我也俗套一把,我来hook掉TCP连接的显示接口,即 tcp4_seq_show! 和常规方法不同的是,我不使用替换operation指针的方法,而是稍微采用二进制hook的方法,我会在tcp4_seq_show的最前面调用下面的逻辑: void stub_func_tcp_seq_show ( struct seq

HOOK相关原理与例子

自作多情 提交于 2020-04-06 18:27:47
消息 HOOK 原理: 1. 用户输入消息,消息被放到系统消息队列。 2. 程序发生了某些需要获取输入的事件,就从系统消息队列拿出消息放到程序消息队列中。 3. 应用程序检测到有新的消息进入到程序消息队列中后,调用相应的事件去处理该消息。 所以在系统消息队列与程序消息队列的中间安装 hook,即可获取消息队列中的信息。 安装: SetWindowsHookEx(键盘消息(WH_xxx),Hook函数(处理键盘输入的函数),句柄(hook函数所在的DLL的句柄),线程ID(要hook的线程ID,0为所有线程)) API在简单高效的同时也有一个弊端,就是它只能监视较少的消息,如:击键消息、鼠标移动消息、窗口消息。 SEH(调试) HOOK 原理:与调试器工作方式类似,让进程发生异常,然后自己捕获到异常,对于除于被调试状态下的级进行操作。 1. 正常情况下,进程未被其他进程调试时,当进程发生异常事件,系统将捕获该事件,并进行事件处理。 2. 当进程被其他进程调试时,处理该进程的异常事件的工作则交给了调试进程。(调试进程未处理或不关心的调试事件由系统处理) 3. 调试 HOOK的核心思路就是将API的第一个字节修改为0xCC(INT 3,留给调试工具的中断,调试工具运行完后,会将下一条指令手动替换回原先的代码),当API被调用时,由于触发了异常,控制权就被转交给调试器(调试进程)。

LoardPe与Import REC X64dbg脚本 脱壳 Upx

有些话、适合烂在心里 提交于 2020-04-05 14:56:20
目录 LoardPe与Import REC X64dbg脚本 脱壳 Upx 一丶X64dbg调试器与脚本 1.1 起因 1.2 脚本的调试 1.3 Upx脱壳脚本 二丶LoardPe 内存Dump与Import Rec导入表修复工具 2.1 脚本执行到OEP 2.2 LoardPe Dump内存 2.3 Import Rec 进行修复 LoardPe与Import REC X64dbg脚本 脱壳 Upx 将要学习到的内容 x64脱壳脚本的编写 LoarPe 与Import 工具的使用 一丶X64dbg调试器与脚本 1.1 起因 在逛论坛的时候,发现别人发的CrackMe带有UPX压缩,直接进行脱壳. 使用EPS定律即可. 但是 x64Dbg下没有脱壳脚本,为什么使用脱壳脚本.原因是脚本方便.不用做重复动作. 正因为没有脱壳脚本呢.所以进行脱壳脚本的编写. 其实x64Dbg脚本特别简单.直接去官网去看就行. https://help.x64dbg.com/en/latest/commands/index.html 脚本就是模拟人的手工操作. 例如你在调试程序的时候, 单步步过(F8) 那么脚本的命令就是sti 你如果是步进(F7) 那么脚本的命令就是 sto, 例如你通过x64Dbg界面下硬件断点. 那么脚本命令就是(bph) 具体参数可以查一下命令手册. 1.2 脚本的调试

手脱ASProtect v1.23 RC1(有Stolen Code)

馋奶兔 提交于 2020-03-23 14:43:27
1.载入PEID ASProtect v1.23 RC1 常见ASprotect版本壳: ASProtect 1.23 RC4 按shift+f9键26次后来到典型异常 ASProtect 1.31 04.27 按shift+f9键36次后来到典型异常 ASProtect 1.31 05.18 按shift+f9键40次后来到典型异常 ASProtect 1.31 06.14 按shift+f9键38次后来到典型异常 2.载入OD,不勾选内存访问异常,其他异常全部勾选,然后使用最后一次异常法,应该是第26次,第27次就会跑飞 00401000 > 68 01C06D00 push SoWorker.006DC001 ; //入口点 00401005 E8 01000000 call SoWorker.0040100B 0040100A C3 retn 0040100B C3 retn 0040100C 74 23 je short SoWorker.00401031 0040100E C039 74 sar byte ptr ds:[ecx],74 00401011 0FD19CA4 0599E0>psrlw mm3,qword ptr ss:[esp+CFE09905] 00401019 AA stos byte ptr es:[edi] 3.落脚点在这个位置