11 2019 档案
摘要:【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】 问题: 1. 内存断点的实现思路是什么? 2. 操作系统检测的流程是什么? 3. 如何设置与恢复内存断点? 1. 内存断点的设置 内存断点分为两类:访问断点与写入断点。 其本质是调用 VirtualP
阅读全文
摘要:【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】 问题: 1. INT 3 断点,操作系统检测到的处理流程是什么? 2. 系统设置的INT 3 断点我们应该如何处理? 3. 调试器如何下INT 3 断点? 4. 调试器如何恢复 INT 3 断点? 1
阅读全文
摘要:【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】 问题: 1. 被调试器如何表明是否处理了异常? 2. 异常处理器是什么? 3. 如果异常到最后都没有被处理,那应该怎么办? 1. 调试器是否处理异常的标志 调试器使用 WaitForDebugEven
阅读全文
摘要:当我们分析到 "int n;",说明其已经定义了一个变量,之后又遇到一个 "n=3",我们从哪里去找这个n并且赋值呢? 答案是:通过我们定义的 变量表(Table) 中查找。 其实,这变量声明定义与变量赋值一系列动作,都是由语义分析器负责的。 1. 当扫描到一个声明语句,比如 "string x;"
阅读全文
摘要:如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它。 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”。 解决方案: 在某个cpp文件中定义,然后在 common.h 中是用 extern 在外部声明这个变量。 建立:变量的定义建立放在cpp中,
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 调试事件的收集 一、被调试程序发送的第一个事件 - INT 3 断点 如果测试这个程序(一个简单的创建被调试进程的案例),会发现当调试程序被创建时,其发送的第一个事件
阅读全文
摘要:1. 点亮函数名 2.view - open subviews - cross references 注意:不要点击绘图那个
阅读全文
摘要:https://github.com/bootleg/ret-sync 使用注意事项:多次测试,最好现在IDA中启动,然后再在OD或WINDBG(.load sync)中启动。 这个工具还是相当给力的,感谢 火哥,HinderHear ,老毛子 的推荐与帮助。
阅读全文
摘要:通过这个简单的案例,我们可以明白以下几点: 1. 创建被调试进程之后,被调试进程的进程线程的句柄与ID如何获取(PROCESS_INFORMATION)。 2. DEBUG_EVENT 的数据结构,u是对应的事件种类的数据结构。 3. 等待被调试进程的大体流程:使用 WaitForDebugEven
阅读全文
摘要:这句话是说 lpImageName 和 hFile 存在关联(associated),不是一定指向! 继续读后面那句,“这个数字可能为NULL,或者包含着被调试进程空间中的一个字符串地址.这个地址,相反,也可能给空或者指向真正的文件名” 因此:必须从目标进程中读取两次,第一次读取字符串内存地址,第二
阅读全文
摘要:时间:2019/11/29 首先,词法分析器由一个扫描器与状态机组成。 一. 词法分析器整体设计流程 二、设计细节 1. code.txt: 我们假设读取下面文本 2.符号类型的设计 我们使用 enum 数据结构,其好处有两点: 1. 只能选取其成员中的一个。 2. 可以直接用符号的名字命名变量。
阅读全文
摘要:https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/3016/pid/1729 石子合并问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Proble
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 调试事件的派发 一、异常事件采集派发 查看这个案例 》一个简单的创建被调试进程的案例《,其中异常事件一共七种,调试器与被调试程序之间的通信就是根据内核的 DEBUG_
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 调试对象的构建 一、从感性角度来理解调试器与被调试程序建立的连接 1)调试程序与被调试程序通过什么来建立连接的呢? 答:DEBUG_OBJECT。 2)这 DEBUG
阅读全文
摘要:有这么一段反汇编代码: 根据参数识别信息,这里是进程句柄。 但是其使用 lea传入参数,ObReferenceObjectByHandle 是根据句柄来获取内核对象。 因此,当执行完成之后,该地址已经不再是进程句柄,而是转换成内核对象了。 在之后的代码分析过程中一定要注意这一点。
阅读全文
摘要:我们之前介绍了如果单独定义一个C结构体并转换为IDA中的结构体。 但是,在内核中有很多庞大的结构体,一环接着一环,手动导入不现实。 还存在一个问题,可能大小格式不匹配。 之前有一位老哥推荐我一个工具:利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件 发
阅读全文
摘要:在逆向内核时,发现了这么一个问题,传入参数明显不一致。 通过函数末尾 @16,明显需要四个函数,这里只是传入三个函数。 查看WRK源码,发现其确实需要四个参数。 排除IDA分析错误的前提下,则存在寄存器传入。 这种情况一般IDA会自动给出注释,可以根据注释判断是哪个寄存器传入。 但是,我们可以手动推
阅读全文
摘要:1. 双击变量 2. 按D转换类型(Word、Byte、Dword) 3. 按U删除变量名 4. 按N修改变量名
阅读全文
摘要:IDA系统自动注释的,如果按 ';',则不会修改成功。 应该按 Shift + ; 这样才可以修改。
阅读全文
摘要:该函数由 DbgUiConnectToDbg(ntdll.dll)函数 调用。 其调用时传入的参数如下: 函数作用:初始化被调试的内核对象,将被调试对象句柄放入调试对象的 [fs:f24]处。 1.现在我们了解到 [FS:F24]处存放的是被调试程序的调试对象句柄。 2.当被调试程序中断时,其会发送
阅读全文
摘要:暂时未解决问题: 1. [fs+0F24h]中存储着什么东西。 答案:其存放着被调试程序的DbgObject句柄。_NtCreateDebugObject(ntoskrnl.exe)函数逆向分析 该函数作用: 创建调试对象,将被调试对象加入到句柄,并将被调试对象放在fs:F24h。 该函数只是简单构
阅读全文
摘要:KiRaiseException函数是记录异常的最后一步,在这之后紧接着就调用KiDispatchException分发异常。 我们在逆向前,先看一下书中的介绍: 1. 概念认知: KiRaiseException 可以被看作 “处理前的最后一次异常记录”,异常记录的目的是:完善异常处理信息,在派发
阅读全文
摘要:在逆向_KiRaiseException(之后紧接着就是派发KiDispatchException)函数时,遇到一个 KeContextToKframes 函数,表面意思将CONTEXT转换为 TRAP_FRAME,但传进去的参数着实有点多,所以简单逆向一下这个函数。 因为能力有限,我们借助WRK源
阅读全文
摘要:今天在逆向时看到一个指令 "and esp, 0FFFFFFF8",则自然为 "111····1000",将末尾置位0. 考虑到应该是栈对齐,但是感觉二进制数基础不太好,有些欠缺,这不会破坏原来栈中的数据么? 我们继续来思考,这样进行的结果如何?结尾只能是8或0,如果为8则变为0.只有这一种情况能破
阅读全文
摘要:书中内容: 代码逆向: 1. CONTEXT是保存之前的函数(RaiseException)状态 2. 在逆向上一个函数时产生一个疑问:EXCEPTION_RECORD.ExceptionAddress 为什么仅填写了一个偏移? 答案:在该函数中,填写成 [ebp+4],上一个函数的返回地址。
阅读全文
摘要:书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址。 答案在下个函数中:rtlRaiseException函数的逆向
阅读全文
摘要:看书中给出的内容: 1:在栈中构建 EXCEPTION_RECORD 结构体 2. 根据函数传递参数逆推得到 "判断先前模式"的反汇编代码
阅读全文
摘要:使用Vmware虚拟机,Vmware Tools工具的复制粘贴一直无效,之后采用共享文件夹。 其默认的是在 \mnt\hgfs 下,在Vmware的设置中建立好文件夹,将文件传入进去,之后就可以去 \mnt\hgfs 下找。
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 该方法的一些原理暂时还不太了解,整理之后一定会补充的。 SEH hook 的一种方法 一、当函数中有try语句时编译器
阅读全文
摘要:1. 什么是增量链接? 答:采用Debug模式下,函数地址并不是该函数的开始部分,而是跳转到一个 jmp 函数地址。 比如,一个函数 test(),其地址 test 对应的汇编语句是 "jmp test真正的地址" 2. 为什么要关闭增量链接? 答:我们常常需要hook某个函数,此时如果存在增量链接
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 初识VEH链(用户异常派发的进一步探究) VEH链是进程处理异常的一个非常重要的机制。 前面我们分析到用户异常进入内核之后会再次返回到R3层调用KeException
阅读全文
摘要:直接选中最上边的结构体,使用ALT+Q来进行修改。
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 用户异常与模拟异常的派发 一、KiDispatchException函数处理流程图 无论用户模拟异常还是CPU异常,经过前面分析,在经过记录之后,最终都会经过KiDi
阅读全文
摘要:按 k 键 [ebp+var+arg_0] - > [ebp+value]
阅读全文
摘要:[ebp+0] - 保存旧的ebp的值 [ebp+4] - 保存该函数的返回地址 [ebp+8] - 保存第一个参数 在IDA如果涉及到内核函数,可以先查出WRK,然后分别将参数赋值,这样再分析起来就很好看了。
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 用户模拟异常的记录 这部分代码量太大,就先记录了一个基本的处理流程,如果有需要,之后会进行补充。 以 throw 1 之后的处理为例。
阅读全文
摘要:我们理解call原理,首先将返回地址压入栈中,之后执行调用。 因此,在一个函数开始部分,esp依旧是上一个栈帧的esp,此时esp指向返回地址。 这就意味着使用 mov ebx,esp,之后 [ebx]就是当前函数的返回地址。 我们应该意识到,SystemCall 就是通过这个 进入零环的,进入零环
阅读全文
摘要:使用代码 lea ecx, [ebp+4+参数长度] 就可以实现。 如下图,理解栈帧的结构,很好理解。 虽然也是 push param的,但这部分在恢复时被调用函数会恢复的,因此这并不算esp的值。 我们在有些函数中,需要_CONTEXT或者_KTRAP_FRAME保存之前的现场,就可以看到这段汇编
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html CPU异常的记录(trap00为例) 一、CPU检测到除零异常的执行流程 二、Trap00 函数的分析 当发生除零异常时,查IDT表会查到Trap00函数,该函数的目
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 用户APC的执行过程 一、一个启发式问题 有一个问题,线程什么时候检查自己的APC队列,答案前面已经介绍过,是执行KiServerExit函数时。 KiService
阅读全文
摘要:存储在栈中的局部变量,都是按照 [ebp-x]的表示的。 注意结构体偏移 + 与栈中的 - 不要搞混。 结构体按照从高往低排序,这里的 - 可以被认为偏移+。 如果想找到某结构体 + 0xa的位置,即找到该结构体第一个元素,在 - 0xa 的位置。 如下图,_CONTEXT+c4 表示 esp,因此
阅读全文
摘要:push a push b push c push d call xxx 则翻译过来为 xxx(d,c,b,a)。 我们分析时,将push从上往下看,push d 作为第一个参数。 因为你从下往上,你不确定一个push a到底是第几个参数,只能确定其右边最后一个参数。 而从上往下看,就能比较清楚了。
阅读全文
摘要:; 链表操作 将当前APC从用户队列中拆除eax表示该某个双向链表的节点struct node{ struct node * next struct node * last}mov ecx, [eax] [eax] Node->nextmov eax, [eax+4] [eax+4] Node->l
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 备用APC队列 占坑:这一节跟进程挂靠相关联,我们先把进程挂靠给学完,之后再来学习这里。
阅读全文
摘要:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html APC的本质 一、对于线程关闭问题的启发 线程,本身占据CPU,对CPU有直接控制权。 这就存在一个问题,如果一个线程不想关闭自己,则外界是无法干涉它的。 因此,线程
阅读全文
摘要:View - Open Subviews - Local Type - INSERT键 - 输入新结构体 - 右击"Synchornize to idb" 之后再分析处按 T 就可以看到该结构体,进行解析。
阅读全文
摘要:用户模拟异常的记录 我们现在来分析一下用户模拟异常 1. 测试代码 二、分析过程 1. 使用 visual Studio 在 "throw 1"处下断点启动调试 throw 1; 00D91808 mov dword ptr [ebp-0C8h],1 00D91812 push offset __T
阅读全文
摘要:解决 Visual Studio 符号加载不完全问题 工具 - 选项 - 搜索 "符号" - 选上服务器 | 加载所有符号, 之后符号就会显示完全
阅读全文
浙公网安备 33010602011771号