- 博客(24)
- 资源 (17)
- 收藏
- 关注
原创 从未放弃过
从未放弃过 在工作中偶尔遇到自己难以解决的问题似乎是再正常不过的事了,要说近期让我最记忆犹新的一次就应该是解决“弹出提示格式化框”的问题了。当自己刚接手这个问题时,感觉应该不难,于是和领导说很快能搞定。让我万万没有想到的是在我解决此问题的过程中,却发现这个“小问题”涉及了太多底层的相关知识,这其中当然也包括了一些自己从未接触过的知识,这些从未接触过的知识让我产生了很强的忙中失措的感觉,此时一想到自己那么坚定地和领导说很快能搞定这话,就感觉是自己把自己推进了充满压力的深渊中,是那么的彻底。。。...
2021-02-20 10:01:58
237
2
原创 应用层和驱动层的同步与异步的处理逻辑及底层实现
应用层的实现:1ReadFile、WriteFile、DeviceIoControl等,这些都有两种操作方式,一种是同步,一种是异步。操作设备的Win32API主要是这3个函数ReadFile、WriteFile、DeviceIoControl以DeviceIOControl为例,它的同步&异步操作如下:同步操作时,它的内部会创建一个IRP_MJ_DEV
2021-02-20 09:54:11
2758
原创 自己对面向对象开发的理解
【抽象】指“数据抽象”和“代码抽象” 数据抽象:指对象的属性(用类的成员变量来实现)代码抽象:指对象的行为(用类的成员函数来实现) 【封装】将抽象得到的“成员变量”和“成员函数”相结合,形成一个有机的整体 用类来实现 【继承】体现在代码的重用性&派生类不一样的扩展上,派生类继承后可有除基类公有的的属性和方法外,也可拥有自己独有的属性和方法。如基类是动物,子类有猫、鸟等,猫和鸟都会走,走...
2016-08-01 10:57:05
661
原创 缓冲区溢出的例子
缓冲区攻击1.代码如下:#include<stdio.h>#include<string.h>root (){printf("your have a root!\n");}main (){char passwd[16]; char login[16];printf("login :"); gets(login);printf("passwd:"); gets(passwd)...
2013-09-29 09:50:46
1759
1
原创 分页机制
一:启动一个计算器程序calc.exe,输入一个字符串123456789二:启动WinDBG,并附加到计算器程序上开始调试(选择File>Attach to a process…..)三:在WinDBG的命令区输入xcalc!g*命令列出计算器程序中以g开头的所有符号(先要设置好XP系统的符号路径)四:在WinDBG的命令区输入ddcalc!gpszNum l1命令,查看该符号地址的内容五:...
2013-09-29 09:47:48
753
原创 中断和异常
【归纳】 1、中断和异常机制会产生向量号。(中断的向量号:通过8259A可编程中断控制器产生的IRQ与向量号相关联) 2、向量号会作为IDT中的索引来取出门描述符。向量号与IDT表一一对应。如向量号0对应着IDT表中的第一个门描述符。 3、软中断指令“INT n”和“INTO”也归类于异常而不称为中断。(CPU外部的叫中断,CPU内部的叫异常) 异常分为3类:故障& 陷阱 & 中止...
2013-09-29 09:41:44
1049
原创 两个内部函数体之间的HOOK
#include <iostream>#include <windows.h>using namespace std;typedef void(*pF)(); void test(){ cout<<"this is a pFtest!"<<endl;}void fun(){ cout<<"funfunction!!"&
2013-09-27 11:18:04
959
原创 HOOK 系统 API
一调用系统函数 MessageBoxA VCMessageBoxA(NULL,NULL,NULL,MB_OK)CALL dword ptr [0040d244]VC作了优化ASMinvoke MessageBoxA,NULL,NULL,NULL,MB_OKCall 401abc401abc :jmp dword ptr [0040d244]未优化时,函数名代表了jmp dword ptr [00...
2013-09-27 11:17:03
1198
原创 逆向虚函数
对象结构体 虚函数表 xxxxx 0x800Jmp sub_xxxxxx xxxxx xxxxx 0x800 0x250Jmp sub_xxxxxx xxxxx 0x800x250 ObjectAD0x20 0x80 虚函数表存在了.rdata节区...
2013-09-27 11:15:09
698
原创 自己对栈帧的理解
1 当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈。当函数返回时,系统栈会弹出该函数所对应的栈帧。 2 ESP总是指向系统栈的顶部,EBP指向的是系统栈最上面一个栈帧的底部,底部存的第一个是ebp,这个ebp是上一个栈帧的底部 栈帧从底到高依次为:ebp(上一个栈帧的底部) ->当前函数的局部变量 ->要调用函数的实参 ->要调用函数的返回地址 3 修改邻接变量...
2013-09-27 11:12:14
1178
原创 条件判断 & 循环语句的逆向
【重点:当判断大于&小于时】(根据执行体是否紧贴着跳转指令来判断是那个条件语句) 一:执行体紧贴着跳转指令时,代码中的条件判断都会编译成否决条件的形式,原因如下: 如判断:if (a>5) printf("OK"); 1为真时是让它往下继续执行printf,可是为真的跳转指令都会跳转而不会向下执行,所以才会用否决条件的跳转指令 2这样原本的JG会编译成否决条件的跳转指令,即:JLE...
2013-09-27 11:08:01
1332
原创 指针的逆向
指针操作技巧 1 运算时一定要先把地址存入指向单字节指针中,这样指针运算时的+1才是加上一个地址 2要取单字节就将地址存入指向单字节指针中,要取四字节就将地址存入指向四字节的指针中,之后用指针[0]输出即可 3 指针的感觉: 一级指针存了变量 &结构体的地址OnePoint输出变量&结构体的地址OnePoint->Var输出结构体变量的某个成员OnePoint[5]输出变...
2013-09-27 11:03:11
1192
原创 逆向for语句
注释:1、ebp减的越多则位置越靠下,结构体中的第一个成员(cpu_num)的位置是最底下的位置,即:ebp-0D4H2、第二个成员cpu_name,字符串所占的14个字节+ 36(9次4字节的填充0的操作) + =cpu_name[50],之后省去了两个地址9E和9D,这样从地址9C开始的4个字节就是cpu_speed(9C+9B+9A+99)3、虽然在堆栈上分配空间是向下扩展的,但是设置数据...
2013-09-27 11:00:38
944
原创 定位到驱动中的分派函数
计算方法就是用IDA中的数减去38,再除以4即可。注意整个计算过程在十六进制上进行 edx+38就是函数指针数组MajorFunction的第一个数据元素 38h = 38h- 38h = 0 / 4(每个数据元素是一个函数指针,占4个字节) = 0 40h = 40h - 38h= 8h / 4 = 2 44h = 44h - 38h= ch / 4 = 3...
2013-09-27 10:54:19
759
原创 VA转换FileOffset
将VA转换成FileOffset地址,先用VA-400000得到RVA,RVA-RVA所在节的起始地址[虚拟地址](RVA所在节的起始地址通过PEID软件获得),得到偏移地址。通过PEID软件获得获得RVA所在节的起始地址[文件偏移地址]。用这个地址和前面获得的偏移地址相加即可得到最终需要的地址。用HexWorkshop对这个地址进行修改即可。 EXAMPLE:401010(VA)-400000=...
2013-09-27 10:53:12
1270
原创 驱动中设备符号名写法
/创建设备名称UNICODE_STRING devName;RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice"); //创建设备status =IoCreateDevice(pDriverObject,//驱动对象sizeof(DEVICE_EXTENSION),//自定义的扩展结构的大小&(UNICODE_
2013-09-27 10:48:06
1983
原创 StackSize & CurrentLocation & StackCount & IopfCallDriver内部设置当前堆栈单元的代码
StackSize:共几个IO空间:在每个设备对象中,有个StackSize子域,表明操作这个设备对象需要几层才能到达最下层的物理设备。(若共四个设备,最顶端的设备的StackSize = 4,最底下的设备的StackSize = 1 HighFiDO -> FDO -> LowFiDO ->PDO )CurrentLocation :IRP头中的CurrentLocation字
2013-09-27 10:46:20
1086
原创 通过测试实例详细分析 IoMarkPending 的原理
使用IoMarkPending的原因及原理 为了使系统吞吐量最大化,I/O管理器希望驱动程序推迟其耗时IRP的完成。驱动程序通过在某个派遣例程中调用IoMarkIrpPending函数并返回STATUS_PENDING来表示完成操作被推迟。 I/O管理器在处理推迟完成时有下面类似的逻辑: Irp->UserEvent =pEvent;// don't do thisyou
2013-09-27 10:33:37
1523
原创 ListEntry 链表图解,及解析 InsertTailList & RemoveHeadList&RemoveEntryList函数
一:NPROT_INSERT_TAIL_LIST(&pOpenContext->PendedReads, &pIrp->Tail.Overlay.ListEntry); #define NPROT_INSERT_TAIL_LIST(_pList, _pEnt)InsertTailList(_pList, _pEnt) 二:pIrpEntry =pOpenContext->Pe
2013-09-27 10:15:11
4658
原创 详细分析CONTAINING_RECORD宏
该宏的作用是:用结构成员中的ListEntry的地址(0x108)减去结构体成员ListEntry到首地址的距离(8)得到结构体首地址(0x100) pEntry中的值就是结构成员中的ListEntry的地址。即:0x108ListEntry0x108 结构成员中的ListEntry的地址,也是RemoveHeadList函数函数的
2013-09-27 10:10:23
1014
原创 嵌套的 CONTAINING_RECORD 宏
第一个CONTAINING_RECORD&NPORT_RECV_PACKET_RSVD得到了NPROT_RECT_PACKET_RSVD.link的地址,因为NPROT_RECT_PACKET_RSVD存于NDIS_PACKET.ProtocolReserved处,所以NPROT_RECT_PACKET_RSVD.link的地址就NDIS_PACKET结构中最后一个成员ProtocolReserv
2013-09-27 10:04:59
712
DLL互引用的代码(汇编y引用VC的DLL,C引用ASM的DLL)
2008-12-23
Window_Control,win32asm版本的,基于Static,Edit,ListBox,ComBox,Button
2008-10-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人