首页
社区
课程
招聘
[求助]菜鸟尝试hook CreateProcess的一些问题
发表于: 2013-7-14 02:47 9712

[求助]菜鸟尝试hook CreateProcess的一些问题

2013-7-14 02:47
9712
小弟为了提高对逆向分析能力,最近在努力学习windows编程,因为只有知道咋写的才更好的知道咋逆向分析。
请各位前辈指教。
感觉从C到windows 编程,感觉难的主要就是数据类型,各种奇怪的关键字其实都是那么几个基本类型,但是我以前就是被这些可怕的关键字给吓住了。
前几天开始咬咬牙试着这学习写远程注入,虽然原理之前就了解了,但是到自己敲代码,感觉却是另外一回事,只有自己敲了,错误,调试,经历过这个过程,才知道自己的进步。
远程注入感觉自己能入门了,就开始试着学习hook,第一次全局hook住 按键,别提多高兴了,同时对输入输出表也开始从真正意义上了解了,以前提到输入输出表,就是字面意义上了解,但是具体是怎么一回事,还是有点懵,现在有点感觉了,很开心。
接前天晚上敲到3点钟,昨天早上8点又起来敲,敲打中午,也没敲出来,感觉脑袋有点蒙,北京的天气还闷热,住的地方条件就不说了,但是为了技术上的进步,向各位前辈们学习,这点难度又算什么呢。
罗嗦那么多,下面是我对这个的思路理解,参照了网上的一些资料和咱们伟大的看雪的。

主要是编写一个控制台,和一个dll文件。

dll文件有以下函数:

A.自己定义的安装和卸载全局键盘钩子函数(目的将自身dll通过系统注入到所有程序),利用键盘钩子,但是CALLBACK KeyboardProc啥都不做。

B.一个修改Createprocess入口地址的函数,同时把入口点跳到自己定义的函数。利用mov eax,自定义函数地址和push eax 和ret。

C.一个用于自定义函数,使Createprocess函数跳转到这个自定义函数。这个自定义函数完成的功能是当双击一个可执行程序时,弹出一个消息,有yes和no,当选择yes的时候原程序正常被执行,当选择no的时候,用ExitProcess来拒绝程序被执行。

D.利用 extern "C" _declspec(dllexport) 导出安装和卸载钩子的这俩函数。

E.会生成一个lib文件。然后把这个lib文件放到相应的位置。

控制台文件中:

A利用#pragma comment(lib, "我的lib.lib")和extern "C" _declspec(dllimport)来导入安装和卸载的钩子的函数。

B控制钩子的安装盒卸载。

小弟的问题是:
1.这个思路有问题吗?
2.CALLBACK KeyboardProc啥都不处理,这个啥都不处理有问题吗?
3.谁来处理这个yes和no的信息呢?是需要在dll文件中再添加一个处理yes 和no的函数吗?
4.如果点了yes后,谁来处理这个消息呢,收到yes消息后怎么才能让程序按照正常的流程启动呢?毕竟CreateProcess入口函数的几个byte已经被修改了。
5.自定义的那个功能函数不需要被导出吧?
啊啊,头有点大了,菜鸟一枚。。请各位走过路过的前辈们给菜鸟当头棒喝。。帮助学习。我爱看雪!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
头大,发现思路混乱的时候不适合敲代码,没有效率啊。不能心急,要随性而敲。
2013-7-14 02:48
0
雪    币: 207
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我刚接触windwos编程
2013-7-14 08:23
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
1.这个思路有问题吗?
2.CALLBACK KeyboardProc啥都不处理,这个啥都不处理有问题吗?
3.谁来处理这个yes和no的信息呢?是需要在dll文件中再添加一个处理yes 和no的函数吗?
4.如果点了yes后,谁来处理这个消息呢,收到yes消息后怎么才能让程序按照正常的流程启动呢?毕竟CreateProcess入口函数的几个byte已经被修改了。
5.自定义的那个功能函数不需要被导出吧?

1、这种hook建议采用IAT HOOK,不建议采用Inline hook.很麻烦的说。。
2、CALLBACK KeyboardProc啥都不处理,没有任何问题,但是返回的时候,要按照msdn上的要求返回。
3.谁来处理这个yes和no的信息呢?这个很简单,你
if(IDOK==MessageBox(0,"","",MB_OKCANCEL))
{
  //.........Continue
}
else
{
   ExitProcess();
}

4、这就是建议你用IAT HOOK的原因。因为inline hook要这样处理很麻烦,首先得还原hook,,然后再次调用,此时椎栈还没平衡,还需要手动平衡。,压力山大呀

5、自定义的函数,你有需要就导出,没需要就不导出了。
2013-7-14 10:48
0
雪    币: 86
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
的确,楼上说的对,IAT Hook只要遍历到需要的函数,然后改成自己的地址就是了,简单,明了。
2013-7-14 10:53
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
哦,好吧,我早上做梦,在梦中突然梦到了IAT hook是怎么个回事了。输入表和输出表有了更深入(其实也没那么深,只有有那么点感觉了)的了解后感觉有水到渠成的感觉。。之前感觉IAT hook好深奥我今天试试。 十分感谢。:)
2013-7-14 11:11
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
因为在网上搜到的一骗文字是64位下的inline hook,感觉能看的个大概明白就试着这种hook的方法,结果发现,嗯,怎么说呢,

大致的测试代码是这样的:
#include "windows.h"
#include "stdio.h"
int MyFunction();
BYTE szOldAPI[9]={0,0,0,0,0,0,0,0,0};
BYTE szNewAPI[9]={0xb8,0x71,0xEA,0x4F,0x77,0x50,0xc3,0x90,0x90};
DWORD CreateProcessAAddr;
DWORD MessageBoxAAddr;
DWORD dwJmpAddr=0;

int main(void)
{
        HMODULE hModule;
        HANDLE hHandle;
        int n=0;

        hModule=LoadLibrary("kernel32.dll");
        CreateProcessAAddr=GetProcAddress(hModule,"CreateProcessA");
        hModule=LoadLibrary("user32.dll");
        MessageBoxAAddr=GetProcAddress(hModule,"MessageBoxA");

       
        ReadProcessMemory((void *)-1,CreateProcessAAddr,szOldAPI,9,NULL);
        WriteProcessMemory((void *)-1,CreateProcessAAddr,szNewAPI,9,NULL);
        ReadProcessMemory((void *)-1,CreateProcessAAddr,szOldAPI,9,NULL);
       
        hHandle=CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,NULL,NULL);
    return 0;
}
在od中发现能够调到MessageboxA中,但是没有弹出Messagebox的对话框,
004010FB  |.  6A 00         push    0                                ; /pProcessInfo = NULL
004010FD  |.  6A 00         push    0                                ; |pStartupInfo = NULL
004010FF  |.  6A 00         push    0                                ; |CurrentDir = NULL
00401101  |.  6A 00         push    0                                ; |pEnvironment = NULL
00401103  |.  6A 00         push    0                                ; |CreationFlags = 0
00401105  |.  6A 00         push    0                                ; |InheritHandles = FALSE
00401107  |.  6A 00         push    0                                ; |pThreadSecurity = NULL
00401109  |.  6A 00         push    0                                ; |pProcessSecurity = NULL
0040110B  |.  6A 00         push    0                                ; |CommandLine = NULL
0040110D  |.  68 1CF04100   push    0041F01C                         ; |ModuleFileName = "c:\windows\notepad.exe"
00401112  |.  FF15 48414200 call    dword ptr [<&KERNEL32.CreateProc>; \CreateProcessA
00401118  |.  3BF4          cmp     esi, esp
0040111A  |.  E8 81000000   call    _chkesp
0040111F  |.  8945 F8       mov     dword ptr [ebp-8], eax
-----------------------------------------以上OD中内容--------------------------------------
在0040111A  |.  E8 81000000   call    _chkesp 中就显示这个:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!

Program: D:\VC6++CN\MyProjects\My_HooKOne\Debug\My_HooKOne.exe
Module:
File: i386\chkesp.c
Line: 42

The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

(Press Retry to debug the application)
---------------------------
中止(A)   重试(R)   忽略(I)   
---------------------------
这就是堆栈平衡的问题是吧。。
2013-7-14 11:26
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
没弹出messagebox对话框的原因是因为 MessageboxA中只是将ASCII 转化为UNICODE的一个过度函数,而真正执行的应该是 MessageboxW吗?(内核的那个还不会,暂时就不考虑了)
还是说是因为MessageboxA中没有给它参数?所以不弹框?
但是MessageboxA中不是有会调用MessageboxW的吗?
困惑!!!
2013-7-14 11:33
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
恩,慢慢来吧。
2013-7-14 11:52
0
游客
登录 | 注册 方可回帖
返回
//