首页
社区
课程
招聘
[求助]是不是CreateRemoteThread的线程中不能使用VCL窗口?
发表于: 2010-9-29 21:47 8854

[求助]是不是CreateRemoteThread的线程中不能使用VCL窗口?

2010-9-29 21:47
8854
DWORD * Code;
DWORD * pRemote;
unsigned int InjectSize;
Code=(DWORD *)(GetModuleHandle(NULL));
InjectSize= PImageOptionalHeader((DWORD *)(int(Code)+PImageDosHeader(Code)->_lfanew+sizeof(DWORD)+sizeof(TImageFileHeader)))->SizeOfImage;
//ShowMessage(IntToStr(InjectSize));
//ShowMessage(IntToStr(DWORD(Code)));
DWORD Pid,Tid;
HANDLE ProcessHandle;
GetWindowThreadProcessId(FindWindow(NULL,"ok"), &Pid);
//ShowMessage(IntToStr(Pid));
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
pRemote=(DWORD *)VirtualAllocEx(ProcessHandle,Code,InjectSize,MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//ShowMessage("aa");
bool ret;
ret=WriteProcessMemory(ProcessHandle, pRemote, Code, InjectSize, &Tid);
//ShowMessage(IntToStr(ret));
// ShowMessage("bb");
CreateRemoteThread(ProcessHandle, NULL, 0x10000, (LPTHREAD_START_ROUTINE)0x58400000, Code, 0, NULL);
//CreateRemoteThread(ProcessHandle, NULL, 0,(LPTHREAD_START_ROUTINE)ok, NULL, 0, NULL);
// ShowMessage("cc");
CloseHandle(ProcessHandle);

下面是线程函数
void __stdcall  ok()
{//ShowMessage("ok");
MessageBoxA(NULL,"a","a",MB_OK);
ShowMessage("ok");    <-------------只要加了这句立即出错。
}

c++ builder写的
以上是无DLL注入进程的关键代码,就是直接EXE注入。编译前加上#include <windows.hpp>
是不是CreateRemoteThread的线程中不能使用VCL窗口?
如果我要线程中用VCL窗口有别的办法么?

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 251
活跃值: (300)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我修改了imagebase的起始地址也不行。
2010-9-29 21:51
0
雪    币: 2790
活跃值: (5240)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
这句成功执行吗?MessageBoxA(NULL,"a","a",MB_OK);
如果上面 成功执行则说明你的远程进程成功运行,
ShowMessage("ok");这里出错,请问是无效的内存访问错误码?
如果是估计是因为该函数未载入,或为静态库函数,而对于的函数体未
成功载入目标进程。
一般木马都是通过GetProcAddress获取API的函数指针再调用的,毕竟
其他进程环境可能有自己的进程不同。
       你可以用调试器载入到目标进程看下就知道是什么问题。
2010-9-29 22:14
0
雪    币: 251
活跃值: (300)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
ShowMessage("ok");只要加上这句,立即出错,ok( )函数根本得不到执行。错误好象是
某个地址不能writen
如果没有这句就可以执行。
2010-9-29 22:21
0
雪    币: 2790
活跃值: (5240)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
你附加进去调试下,看那个地址对应的内容是什么,我怀疑就是那个函数找不到导致的,因为没用过
c++ builder,所以不知道这个函数是DLL中的还是静态库形式的。如果动态库形式你可以通过LoadLibrary
加载DLL,然后通过GetProcAddress 获取对应地址后,然后调用获取到的函数指针即可。这个是远程线程
的通用之道,建议去下个带类似功能的木马学习下。
2010-9-29 22:37
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
6
C++ builder和Delphi中的ShowMessage确实是自带的静态库函数(封装了MessageBoxA),被注入的进程中没有相应的代码,当然call不了。看来楼主还不明白远程注入的代码需要注意什么。
2010-9-30 00:30
0
雪    币: 251
活跃值: (300)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我是整个代码一起注入的,按理说应该没有库文件的问题。而且imagebase我也换了。
2010-9-30 10:17
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
运行以后注入应该没什么问题,如果CreateProcess CREATE_SUSPENDED之后就注入可能引起ui的各种不正常
2010-9-30 11:35
0
雪    币: 2790
活跃值: (5240)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
你的源程序基址和复制到目标基址后的基址相同吗? BC远程线程应该没有问题,之前看过类似的木马。

       其实楼主将出错时的调用堆栈、出错指令汇编内容贴出来就容易帮你分析了。现在什么东西都没有就只能帮你猜。
2010-10-1 21:25
0
雪    币: 9947
活跃值: (6729)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼主,你注入delphi,c++builder的程序应该是可以运行的,如果注入其它的程序(比如Vc)肯定要出错的。
原因就是ShowMessage到底是个啥玩意?VC的程序怎么会知道!!!!!!!!!!!!!!!
2010-10-3 10:56
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
没有消息循环ShowMessage不工作的,VCL里Application负责这工作,先初始化
2010-10-6 23:49
0
雪    币: 251
活跃值: (300)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
10楼所言即是,我也认为VC的不行。
2010-10-7 22:57
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
11楼说的对,VCL函数要正常运行需要先进行初始化。
楼主应该看一下这2天很热的那个什么找茬的帖子,那里面分了2个dll来解决这个问题。
2010-10-9 22:53
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这个应该是正解
2010-10-10 21:03
0
雪    币: 224
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Delphi VCL中的ShowMessage是一个窗体,并没有封装MessageBox.
2010-10-11 17:21
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
看不懂~
努力学习~
希望有一天可以看懂~
楼主辛苦~
2010-10-28 06:12
0
雪    币: 230
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
试试这样可以不!
asm
push 0
push x
push x
push 0
call MessageBox
end
2010-10-28 06:33
0
游客
登录 | 注册 方可回帖
返回