首页
社区
课程
招聘
一种CreateRemoteThread的另类用法?
发表于: 2010-7-18 00:03 5765

一种CreateRemoteThread的另类用法?

2010-7-18 00:03
5765
此函数格式如下
HANDLE CreateRemoteThread(
HANDLE hProcess,                          // handle to process
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize,                       // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
LPVOID lpParameter,                       // thread argument
DWORD dwCreationFlags,                    // creation option
LPDWORD lpThreadId                        // thread identifier
);

一般的用法是需要自己写个线程函数,再复制到对方进程的内存来执行。但是我想直接lpStartAddress指向远程进程自己的一个CALL,顺便做些修改,现在问题是这么做的话这个远程线程的终止标志是什么?是RET一类的吗?求高人解答

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
lpStartAddress指向的地址就是目标进程中的函数的RVA,所以你在自己进程共调用CreateRemoteThread时,只要填好自己需要的lpStartAddress就行了。只要这个地址在目标进程中存在,windows才不会管这个函数是原来程序就有的还是你自己写进去的。
2010-7-18 12:44
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
1、线程终止运行的最好方法是让线程函数返回,即RET;
2、如果你的设计不能满足第一条,可以让线程调用ExitThread函数,以便强制线程终止运行。但如果你的程序使用C++编写,那你绝不应该调用ExitThread,因为使用它C + +资源(如C + +类对象)将不被撤消。如使用Visual C++编译器,可使用函数 _endthreadex;如果不是使用 Visual C++ 编译器,你的编译器提供商有它自己的 ExitThread 的替代函数。不管这个函数是什么,都必须使用。
2010-7-18 13:54
0
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
理解错意思了...

和一般线程吧应该.
2010-7-18 16:50
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
用RET返回那应该是哪一个RET呢?是线程遇到的第一个RET吗?我想跨越多个CALL,RET怎么办啊
调库函数应该可以但有点小题大做,还要改导入表,IAT什么的
主要是改成Inline汇编太长了,所以不想自己提供线程函数,如下
                MOV EBP,DWORD PTR DS:[EAX]
                PUSH EDI
                LEA ECX,DWORD PTR SS:[ESP+0x14]
                MOV DWORD PTR SS:[ESP+0xC],EBP
                MOV DWORD PTR DS:[ESI+0x20C],0

                MOV EBX,0x004D2251
                CALL EBX
               
                MOV EAX,DWORD PTR DS:[ESI+0x214]
                CMP EAX,-1
                JE 0x00416090
                LEA ECX,DWORD PTR SS:[ESP+0x24]
                PUSH EAX
                PUSH ECX
                MOV ECX,ESI

                MOV EBX,0x004158B0
                CALL EBX

                MOV EDX,DWORD PTR DS:[EAX]
                PUSH 0
                MOV DWORD PTR SS:[ESP+0x18],EDX
                MOV ECX,DWORD PTR DS:[EAX+0x4]
                MOV DWORD PTR SS:[ESP+0x1C],ECX
                LEA ECX,DWORD PTR SS:[ESP+0x18]
                MOV EDX,DWORD PTR DS:[EAX+0x8]
                PUSH ECX
                MOV DWORD PTR SS:[ESP+0x24],EDX
                MOV ECX,ESI
                MOV EAX,DWORD PTR DS:[EAX+0xC]
                MOV DWORD PTR DS:[ESI+0x214],-1
                MOV DWORD PTR SS:[ESP+0x28],EAX

                MOV EBX,0x004CBF7D
                CALL EBX

                MOV EAX,DWORD PTR DS:[ESI+0xE8]
                CMP EAX,-1
                JE 0x00416112
                MOV EDI,DWORD PTR DS:[ESI+0xEC]
                CMP EDI,-1
                JE 0x00416112
                LEA EDX,DWORD PTR SS:[ESP+0x24]
                PUSH EAX
                PUSH EDX
                MOV ECX,ESI

                MOV EBX,0x004158B0
                CALL EBX

                MOV ECX,DWORD PTR DS:[EAX]
                PUSH 0
                MOV DWORD PTR SS:[ESP+0x18],ECX
                MOV EDX,DWORD PTR DS:[EAX+0x4]
                MOV DWORD PTR SS:[ESP+0x1C],EDX
                MOV ECX,DWORD PTR DS:[EAX+0x8]
                MOV DWORD PTR SS:[ESP+0x20],ECX
                MOV ECX,ESI
                MOV EDX,DWORD PTR DS:[EAX+0xC]
                LEA EAX,DWORD PTR SS:[ESP+0x18]
                PUSH EAX
                MOV DWORD PTR SS:[ESP+0x28],EDX

                MOV EBX,0x004CBF7D
                CALL EBX

                LEA ECX,DWORD PTR SS:[ESP+0x24]
                PUSH EDI
                PUSH ECX
                MOV ECX,ESI

                MOV EBX,0x004158B0
                CALL EBX

                MOV EDX,DWORD PTR DS:[EAX]
                PUSH 0
                MOV DWORD PTR SS:[ESP+0x18],EDX
                MOV ECX,DWORD PTR DS:[EAX+0x4]
                MOV DWORD PTR SS:[ESP+0x1C],ECX
                LEA ECX,DWORD PTR SS:[ESP+0x18]
                MOV EDX,DWORD PTR DS:[EAX+0x8]
                PUSH ECX
                MOV DWORD PTR SS:[ESP+0x24],EDX
                MOV ECX,ESI
                MOV EAX,DWORD PTR DS:[EAX+0xC]
                MOV DWORD PTR SS:[ESP+0x28],EAX

                MOV EBX,0x004CBF7D
                CALL EBX

                MOV ECX,DWORD PTR SS:[ESP+0xD]
                MOV EAX,EBP
                MOV EDI,ECX
                AND EAX,0xFF
                AND EDI,0xFF
                LEA EDX,DWORD PTR SS:[ESP+0x24]
                MOV BYTE PTR DS:[EAX+ESI+0x40],0
                PUSH EAX
                MOV BYTE PTR DS:[EDI+ESI+0x40],CH
                PUSH EDX
                MOV ECX,ESI
                MOV DWORD PTR DS:[ESI+0xE8],EAX
                MOV DWORD PTR DS:[ESI+0xEC],EDI

                MOV EBX,0x004158B0
                CALL EBX

                MOV ECX,DWORD PTR DS:[EAX]
                PUSH 0
                MOV DWORD PTR SS:[ESP+0x18],ECX
                MOV EDX,DWORD PTR DS:[EAX+0x4]
                MOV DWORD PTR SS:[ESP+0x1C],EDX
                MOV ECX,DWORD PTR DS:[EAX+0x8]
                MOV DWORD PTR SS:[ESP+0x20],ECX
                MOV ECX,ESI
                MOV EDX,DWORD PTR DS:[EAX+0xC]
                LEA EAX,DWORD PTR SS:[ESP+0x18]
                PUSH EAX
                MOV DWORD PTR SS:[ESP+0x28],EDX

                MOV EBX,0x004CBF7D
                CALL EBX

                LEA ECX,DWORD PTR SS:[ESP+0x24]
                PUSH EDI
                PUSH ECX
                MOV ECX,ESI

                MOV EBX,0x004158B0
                CALL EBX

                MOV EDX,DWORD PTR DS:[EAX]
                PUSH 0
                MOV DWORD PTR SS:[ESP+0x18],EDX
                MOV ECX,DWORD PTR DS:[EAX+0x4]
                MOV DWORD PTR SS:[ESP+0x1C],ECX
                LEA ECX,DWORD PTR SS:[ESP+0x18]
                MOV EDX,DWORD PTR DS:[EAX+0x8]
                PUSH ECX
                MOV DWORD PTR SS:[ESP+0x24],EDX
                MOV ECX,ESI
                MOV EAX,DWORD PTR DS:[EAX+0xC]
                MOV DWORD PTR SS:[ESP+0x28],EAX

                MOV EBX,0x004CBF7D
                CALL EBX

                LEA EDX,DWORD PTR SS:[ESP+0x38]
                PUSH EBP
                PUSH EDX
                MOV ECX,ESI

                MOV EBX,0x00416910
                CALL EBX

                MOV EAX,DWORD PTR DS:[EAX]
                MOV ECX,DWORD PTR DS:[0x553630]
                PUSH EAX

                MOV EBX,0x00411F20
                CALL EBX

                POP EDI
                POP ESI
                XOR EAX,EAX
                POP EBP
                ADD ESP,0x28
                RETN 0x8
2010-7-18 19:46
0
雪    币: 73
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
自己ExitThread了
2010-7-18 20:45
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
call和ret是成对出现和起其作用的,每个ret都和最近的未返回的call对应,你的CreateRemoteThread也是一个call,执行时和这个call配对的ret结束该线程,中间你是否跨越多个call什么的没影响,对于这种硬编码同一个ret也可以和多个call配对,硬编码要仔细处理每一个细节,包括call和ret的配对、资源的分配、释放。。。。。,一不小心就会出错,高难!
2010-7-18 21:48
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
call把IP压入栈,然后执行等效于jmp的转移功能到子程序处,在ret时,从栈中恢复最后压入的数据到IP(如call和ret不配对,就不知道把什么恢复成IP了,程序就会跑飞),然后从IP处执行,正常的话就相当于执行了call 子程序名后的那条指令。
2010-7-18 22:01
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我已经改成注入自己的线程函数了,调好堆栈,程序工作正常。但是发现移植到VC2008就有问题,WriteProcessMemory写进去的内存是乱码,不是线程函数。VC6就没这问题,难道VC2008里需要改什么地方吗?附上代码

线程函数:
DWORD __stdcall threadProc(LPVOID lParam){
        _asm {
                MOV EAX,0x0041601A
                MOV ECX,0x027D7C78
                PUSH 0
                PUSH 0x0013FAA4
                MOV EBX,0x00416015
                CALL EBX
        }
        return 0;
}

主代码:
void ImplementInject(BYTE aFrom, BYTE aTo, BYTE aChessman, HANDLE hProcess){
DWORD nBytesWrite;
void* pRemoteThread = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        printf("pRemoteThread = 0x%08x\n", pRemoteThread);
        getchar();
        if (!WriteProcessMemory(hProcess, pRemoteThread, &threadProc, 0x1000, &nBytesWrite)){
                printf("Write data to target process failed !\n");
        }
        else
                printf("Write data to target process succeeded! 0x%08x bytes writen\n", nBytesWrite);
        getchar();
        DWORD TID;
        CreateRemoteThread(hProcess, NULL, 0x1000, (LPTHREAD_START_ROUTINE)pRemoteThread , NULL, 0, &TID);
        printf("TID = 0x%08x\n", TID);
        getchar();

}
2010-7-19 12:25
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
问题不一定出在这些代码中,你把hProcess赋值的那段代码贴出来,看看。。。
VC6和VC2008权限控制不太一样。
2010-7-19 13:21
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
不一样吗,我确实没改。。

HANDLE PrepareProcess(){
        HWND hWnd = FindWindow(NULL, L"neuchess");
        DWORD PID;
        GetWindowThreadProcessId(hWnd, &PID);
        return OpenProcess(PROCESS_ALL_ACCESS, false, PID);
}
2010-7-19 13:27
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
应当是OpenProcess(PROCESS_ALL_ACCESS, false, PID)他有问题,试试:
OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION | PROCESS_VM_WRITE,false, PID)
2010-7-19 13:36
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
好像没区别啊。。
毕竟我已经写进去了,只是不知道写的什么东西
2010-7-19 13:55
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
不会吧?不知道写的什么东西 ?看看这里(【已解决】VC2008写内存一夜未成功 ):
http://bbs.pediy.com/showthread.php?t=99424
2010-7-19 14:01
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
嗯嗯,学习了,不过我没在那里下断啊。只是at而已,而且我得到的是大片的乱码

我现在还是改回VC6了,线程注入后确实起到我需要的效果了,但是会崩,现在用的是VC6的MFC
其实我的共嫩用VC6 Console已经试验成功了,也不会崩,是不是在MFC中线程注入需要注意什么呢?
2010-7-19 14:26
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
在网上查了一下,有这么一段话

“其次就是CreateRemoteThread在MFC程序下不能用debugger模式启动,启动后还是会让目标程序崩溃。。。网上查了,牛人说CreateRemoteThread在调试时会在目标进程多加入调试信息,导致崩溃。于是这个函数只能在Release下运行。”

但是我改成RELEASE后,WriteProcessMemory写线程函数又失败了,而写BUFFER就没问题,看来MFC6.0 BUG还是不少的,后来查到debug下多加入调试信息其实就是chkesp,于是去掉/GZ编译选项,程序运行正常
2010-7-19 15:28
0
游客
登录 | 注册 方可回帖
返回
//