简单逆向某平台驱动
emmm今天在玩某平台的时候,发现重启电脑后驱动会自动加载(并没有运行平台),我就发现这是一个很流氓的行为,因为你不知道他驱动在干些啥,于是决定简单逆向一下用到的工具:IDA,PChunter,CE
首先定位驱动入口,将驱动dump出来,首先看一下入口
说实话IDA这个默认配色还是看得不太舒服,上CE看吧,后边的图除了反编译的图我都用ce
这个就舒服太多了,很明显可以看到入口被vm了
既然被vm了索性就不分析入口了
我们首先看看驱动干了啥吧 用ark工具也就是pchunter来看
创建了三个系统回调用来收集信息 分别是进程,线程,最后一个比较少见,跟图片有关,盲猜是截图或者是检测透视窗口的
创建了一个obj钩子一般都是用来保护游戏,防止被第三方读写
我就只分析一个进程的吧,要具体分析太杂太累,只是简单带过几笔
首先上IDA
这就是有关进程的回调,如果一句一句看,得累死
我们简单看看具体框架就行
我们很明显发现两条绿色的线,点进去F5看看
很明显可以看到
if ( !KeGetCurrentIrql() )
{
if ( a3 )
{
就是这两个判断
在内核中,KeGetCurrentIrql()是返回当前的IRQL
然后进行取反操作,也就是KeGetCurrentIrql()返回值为0时才往下执行。
再下来就是a3,a3为一个参数,这里应该是一个开关,而负责a3的应该是对战平台或者游戏,与驱动进行通讯修改a3的值
逆向思路:直接jmp,找到游戏或者平台通讯处,使其一直写入a3=0等等
一张一张图截图有点累,直接cv大法吧
if ( !KeGetCurrentIrql() )
{
if ( a3 )
{
Process = 0i64;
ProcessHandle = 0i64;
v11 = 0;
P = 0i64;
if ( PsLookupProcessByProcessId(a2, &Process) >= 0 )// 返回指向进程的EPROCESS结构的引用指针
{
if ( ObOpenObjectByPointer(Process, 0x200u, 0i64, 0, 0i64, 0, &ProcessHandle) >= 0 )// 返回对象的句柄
{
if ( ZwQueryInformationProcess( // 收集进程信息
ProcessHandle,
ProcessBasicInformation,
ProcessInformation,
0x30u,
&ReturnLength) >= 0 )
{
_mm_lfence();
一直到这里 下面
if ( (int)sub_FFFFF8028D19D748(a2, &P) >= 0 )
我们进入这个函数看看
__int64 __fastcall sub_FFFFF8028D19D748(void *a1, PVOID *a2)
{
NTSTATUS v3; // ebx
PVOID PoolWithTag; // rax
PEPROCESS Process; // BYREF
ULONG ProcessInformationLength; // BYREF
HANDLE ProcessHandle; // BYREF
v3 = PsLookupProcessByProcessId(a1, &Process);
if ( v3 >= 0 )
{
v3 = ObOpenObjectByPointer(Process, 0, 0i64, 0, 0i64, 0, &ProcessHandle);
if ( v3 >= 0 )
{
v3 = ZwQueryInformationProcess(ProcessHandle, ProcessImageFileName, 0i64, 0, &ProcessInformationLength);
if ( v3 == -1073741820 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPool, ProcessInformationLength, 0x66667061u);
*a2 = PoolWithTag;
if ( PoolWithTag )
{
v3 = ZwQueryInformationProcess(
ProcessHandle,
ProcessImageFileName,
PoolWithTag,
ProcessInformationLength,
&ProcessInformationLength);
if ( v3 < 0 )
{
ExFreePoolWithTag(*a2, 0x66667061u);
*a2 = 0i64;
}
}
}
ZwClose(ProcessHandle);
}
ObfDereferenceObject(Process);
}
return (unsigned int)v3;
}
没什么好看的,主要是看一下
if ( v3 == -1073741820 )
v3是ZwQueryInformationProcess的返回值
在ZwQueryInformationProcess的返回值中-1073741820也就是STATUS_INFO_LENGTH_MISMATCH输入参数长度不匹配
也就是说这个函数是检测ZwQueryInformationProcess状态的
下边到分析完感觉也没有什么地方要单独拎出来将直接cv分析结果把
**** Hidden Message *****
其他几个地方就不分析了,知道了他的执行过程,逆向就很简单了,有很多可以过掉这个的方法
具体也不多说了,想分析的朋友可以自己去分析一下,这只是驱动层,他平台或者游戏本身也有检测的
那个比较简单,挂钩一些重要的函数即可。
最后祝大家身体健康,疫情期间勤带口罩少外出,也希望疫情早点结束
谢谢分享 火前留名!我相信一定会火! 谢谢分享 感谢楼主 谢谢分享 回复,顶帖,赚币,谢谢楼主 被标题吸引进来了,回复看看 谢谢分享 感谢楼主