首页
社区
课程
招聘
[求助]JMP跳转法 跳不回去...
发表于: 2016-4-12 12:59 7141

[求助]JMP跳转法 跳不回去...

2016-4-12 12:59
7141
JMP跳转法 HOOK  CreateProcessInternalW  跳不回去...    大牛指点下....

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD org_CreateProcessInternalW;

         
int __declspec(naked) __stdcall OrgCreateProcessInternalW(
        HANDLE hToken,
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation,
        PHANDLE hNewToken
        )

{
        __asm {               ///////////////内嵌汇编这里出错了?  小弟汇编不是很懂啊!!!

                        mov edi,edi
                        push ebp
                        mov ebp,esp
                        jmp [org_CreateProcessInternalW]
        }
}

BOOL __stdcall MyCreateProcessInternalW(
        HANDLE hToken,
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation,
        PHANDLE hNewToken
                                                                   )

{
int size1= WideCharToMultiByte(CP_ACP,0,lpApplicationName,-1, NULL, 0, NULL,0);
char * AsciiBuff =new char[size1];
WideCharToMultiByte(CP_ACP,0,lpApplicationName,-1,AsciiBuff,size1, NULL, 0);

MessageBox(NULL,AsciiBuff,"111111",MB_ICONINFORMATION);

BOOL ret=OrgCreateProcessInternalW(
        hToken,
lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation,
hNewToken
);

return ret; ///////////////////////这里直接崩溃
}

BOOL WINAPI DllMain(HINSTANCE hinstModule, DWORD dwReason, LPVOID lpvReserved)
{
        if(dwReason == DLL_PROCESS_ATTACH)
        {

                DWORD oldflag;
                DWORD pCreateProcessInternalW = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateProcessInternalW");
        VirtualProtect((PVOID)pCreateProcessInternalW, 5, PAGE_EXECUTE_READWRITE, &oldflag);
        *(PCHAR)pCreateProcessInternalW = '\xE9';
            *(DWORD*)(pCreateProcessInternalW+1) = (DWORD)MyCreateProcessInternalW - (pCreateProcessInternalW+5);
            org_CreateProcessInternalW = pCreateProcessInternalW+ 5;
        }

        return true;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 144
活跃值: (31)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
2
是不是64位下的问题。 在win7 64位下 kernel32.dll  的CreateProcessInternalW

76BE3BF3 >  68 24060000     push 0x624
76BE3BF8    68 9849BE76     push kernel32.76BE4998
76BE3BFD    E8 9205FFFF     call kernel32.76BD4194
76BE3C02    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
2016-4-12 13:05
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是 32位下也不能运行,  win7  64位还是 kernel32.dll    之后版本的才是kernelbase.dll.
2016-4-12 13:14
0
雪    币: 364
活跃值: (1741)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你能百分百确定,前面开头都是

mov edi,edi
      push ebp
      mov ebp,esp

吗?
2016-4-12 14:01
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
应该是多少?最好是通用的方法!
2016-4-12 14:25
0
雪    币: 364
活跃值: (1741)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
2楼那个图一看就明白了。
CreateProcessInternalW开头5个字是什么,不是每个函数是mov edi edi 这些指令。你在OrgCreateProcessInternalW函数中就默认是mov edi edi 这些指令。
2016-4-12 15:28
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
修改成 push  XX
           jmp [org_CreateProcessInternalW]

XX写成什么 才能通用呢?
2016-4-12 15:47
0
雪    币: 144
活跃值: (31)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
8
可以先 ReadProcessMemory 先读要HOOK的字节数。 保存下来 然后jmp 到你的函数 处理完毕后 这时先把刚才读取的字节数补回去, 再调用原来的。这样保证不管前几个字节是多少 补回去就得了。 调用完原来的再hook 上。

1:读取hook头部 5个字节保存起来 然后 hook跳转到自己的函数.
2:自己处理后 恢复刚才读取的五个字节 call CreateProcessInternalW
3:继续 hook跳转到自己的函数
2016-4-12 20:28
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个方法我知道,这样多线程下不能全部HOOK 的
2016-4-12 20:52
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
围观楼主
2016-4-12 21:09
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
HMODULE hHand= LoadLibrary("Kernel32.dll");  
    RealCreateProcessInternalW=(PFNCreateProcessInternalW)GetProcAddress(hHand,"CreateProcessInternalW");  
    ReadProcessMemory(INVALID_HANDLE_VALUE,(void *)RealCreateProcessInternalW,OldBytes,5,NULL);

OldBytes为原始函数前5字节 保存下来

汇编改为

_asm  
    {  
        mov eax,RealCreateProcessInternalW  
        add eax,5  
        pop edi                        
        pop esi  
        pop ebx  
        pop ebp  
        push XXXXXXXX
        jmp eax  
    }

OldBytes(保存下来的前5字节)怎么转换成 XXXXXXXX

也就是说汇编的话  该怎么写???
2016-4-13 10:57
0
雪    币: 786
活跃值: (3435)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
12
建议使用别人写好的库。
我写过一个,广告一下:http://www.jmpoep.com/thread-1053-1-1.html
这里有代码和注释:http://blog.csdn.net/yes2/article/details/50631268
2016-4-13 12:10
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
代码不好用。
2016-4-13 15:00
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
汇编大牛在哪里?
2016-4-14 14:50
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
DWORD oldflag;
                TrueCreateProcessInternalW = (_CreateProcessInternalW)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW");
      
                if(ReadProcessMemory(INVALID_HANDLE_VALUE,(void *)TrueCreateProcessInternalW,OldCode,5,NULL)==0)   
    {   
        MessageBox(0,"8888","000",0);  
    }
                VirtualProtect((PVOID)TrueCreateProcessInternalW, 5, PAGE_EXECUTE_READWRITE, &oldflag);
        *(PCHAR)TrueCreateProcessInternalW = '\xE9';
            *(INT*)((INT)TrueCreateProcessInternalW+1) = (INT)MyCreateProcessInternalW- ((INT)TrueCreateProcessInternalW+5);
                TrueCreateProcessInternalW = (_CreateProcessInternalW)VirtualAlloc(NULL, 10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);  
        memcpy(TrueCreateProcessInternalW, OldCode, 5);
*(DWORD*)((INT)TrueCreateProcessInternalW+5) = 0xE9;
*(INT*)((INT)TrueCreateProcessInternalW+6)= (INT)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW")+5;

这个代码哪里出错了???
2016-4-14 14:55
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
HOOK 根本没必要用到汇编   

函数头也不一定都是5个字节的  如果是其他字节   被你的相对跳5字节指令切断  肯定也会出错。  
要读函数头指令长度分析的      网上很多现成的HOOK例子
2016-4-14 15:12
0
雪    币: 49
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
CreateProcessInternalW函数头是5个字节 可以肯定。
2016-4-14 15:20
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
通用方法都告诉你了  还非要自己纠结函数头。
  
大概看了眼   这个代码的HOOK流程 我是真看不懂     
你构建的原始函数为org_CreateProcessInternalW     那么在执行了原函数头的5字节后 应该跳回真实函数+5的地址继续执行   而你的代码又JUMP回org_CreateProcessInternalW ?     这样岂不是无限循环了?
2016-4-14 15:35
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
楼主不能这样想当然的使用5个字节硬编码,姑且不论原来是不是5字节,如果这个坑事先被别人占了呢?HOOK要考虑很多情况,最好使用轻量的反汇编引擎动态解析要HOOK位置的指令,修改的时候使用原子操作。
2016-4-14 15:40
0
游客
登录 | 注册 方可回帖
返回
//