一段比较有用的代码,顺手还原了一下

今天在看一驱动的时候发现了一段比较有用的代码,主要功能就是用来确定ImageFileName成员在EPROCESS结构中的偏移的,如下 :

 FindNameOffset  proc near               ; CODE XREF: sub_10966+1Dp
.text:000107F0                 push    ebx
.text:000107F1                 push    esi             ; size_t
.text:000107F2                 push    edi             ; char *
.text:000107F3                 call    ds:IoGetCurrentProcess
.text:000107F9                 mov     ebxeax        ; EPROCESS
.text:000107FB                 xor     ediedi
.text:000107FD                 mov     esi, offset aRxrsdl ; "System"
.text:00010802
.text:00010802 loc_10802:                              ; CODE XREF: FindNameOffset+32j
.text:00010802                 push    esi             ; char * = "System"
.text:00010803                 call    strlen
.text:00010808                 push    eax             ; size_t = 6
.text:00010809                 lea     eax, [edi+ebx]
.text:0001080C                 push    eax             ; char *
.text:0001080D                 push    esi             ; char *
.text:0001080E                 call    ds:strncmp
.text:00010814                 add     esp, 10h
.text:00010817                 test    eaxeax
.text:00010819                 jz      short loc_1082A ; 找到
.text:0001081B                 inc     edi
.text:0001081C                 cmp     edi, 3000h
.text:00010822                 jl      short loc_10802 ; 未找到
.text:00010824                 xor     eaxeax
.text:00010826
.text:00010826 loc_10826:                              ; CODE XREF: FindNameOffset+3Cj
.text:00010826                 pop     edi
.text:00010827                 pop     esi
.text:00010828                 pop     ebx
.text:00010829                 retn
.text:0001082A ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? .text:0001082A
.text:0001082A loc_1082A:                              ; CODE XREF: FindNameOffset+29j
.text:0001082A                 mov     eaxedi
.text:0001082C                 jmp     short loc_10826
.text:0001082C FindNameOffset  endp

之所以说它有用,是因为我平时在写的时候会switch case来区分操作系统的版本,然而用这段代码就可以省掉这些了。由于这段代码比较简单,就顺手用C还原了一下:

DWORD FindImageNameOffset()
{
    char aRxrsdl[] = "System";
    UINT unIndex = 0, unNameLength;
    PVOID pEprocess = IoGetCurrentProcess();
    unNameLength = strlen(aRxrsdl);    
    for (; unIndex < 0x3000; ++unIndex)
    {
        if (!strncmp(aRxrsdl, pEprocess[unIndex], unNameLength )
            return unIndex;
    }
    return 0;
}
这段代码没有经过测试,不过应该是正确的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值