最近由于工作需要 需要做一个远程线程的例子 不知道为什么 每次创建远程线程的时候目标进程总是挂掉 我在网上找到一个类似的例子 在他的线程函数前面下了一个断点 反汇编出来的代码如下static DWORD WINAPI ThreadFunc (INJDATA *pData)
{
0042DB00 push ebp
0042DB01 mov ebp,esp
0042DB03 sub esp,44h
0042DB06 push ebx
0042DB07 push esi
0042DB08 push edi
int nXferred = 0; // number of chars retrieved by WM_GETTEXT
0042DB09 mov dword ptr [nXferred],0
而我的线程函数下了一个断点 反汇编出来的内容如下static DWORD WINAPI RemoteThreadProc(PRemotePara lpData)
{
00413870 push ebp
00413871 mov ebp,esp
00413873 sub esp,10Ch
00413879 push ebx
0041387A push esi
0041387B push edi
0041387C lea edi,[ebp-10Ch]
00413882 mov ecx,43h
00413887 mov eax,0CCCCCCCCh
0041388C rep stos dword ptr es:[edi]
0041388E mov eax,dword ptr [___security_cookie (421190h)]
00413893 xor eax,ebp
00413895 mov dword ptr [ebp-4],eax
char pStatckDebugString1[] = "进入远程线程";
00413898 mov eax,dword ptr [string "\xbd\xf8\xc8\xeb\xd4\xb6\xb3\xcc\xcf\xdf\xb3\xcc" (41DFF4h)]
根据我的猜想 我认为目标程序挂掉的主要原因就是编译器加了好多绝对地址的指令 因此 我想问 是什么编译器设置会产生这些不同的汇编代码?
{
0042DB00 push ebp
0042DB01 mov ebp,esp
0042DB03 sub esp,44h
0042DB06 push ebx
0042DB07 push esi
0042DB08 push edi
int nXferred = 0; // number of chars retrieved by WM_GETTEXT
0042DB09 mov dword ptr [nXferred],0
而我的线程函数下了一个断点 反汇编出来的内容如下static DWORD WINAPI RemoteThreadProc(PRemotePara lpData)
{
00413870 push ebp
00413871 mov ebp,esp
00413873 sub esp,10Ch
00413879 push ebx
0041387A push esi
0041387B push edi
0041387C lea edi,[ebp-10Ch]
00413882 mov ecx,43h
00413887 mov eax,0CCCCCCCCh
0041388C rep stos dword ptr es:[edi]
0041388E mov eax,dword ptr [___security_cookie (421190h)]
00413893 xor eax,ebp
00413895 mov dword ptr [ebp-4],eax
char pStatckDebugString1[] = "进入远程线程";
00413898 mov eax,dword ptr [string "\xbd\xf8\xc8\xeb\xd4\xb6\xb3\xcc\xcf\xdf\xb3\xcc" (41DFF4h)]
根据我的猜想 我认为目标程序挂掉的主要原因就是编译器加了好多绝对地址的指令 因此 我想问 是什么编译器设置会产生这些不同的汇编代码?
解决方案 »
- 使用BHO动态修改网页出现的错误
- 一个桌面管理程序禁用了部分功能
- 代码同步
- 怎么获取要使用的字体(API)
- 能否推荐几个下载较好版本VC++6.0的地址??谢了!!
- 随机产生浮点数???应该很容易了吧???
- 自定义工具栏的消息映射问题
- 在picture控件上画图,如何获的鼠标在picture控件上的坐标?
- 新建工程,什么都没作就出错: error RC2104 : undefined keyword or key name: DS_MODALFRAME
- 高手帮帮忙,怎么用vc对arcinfo 编程并且能使所创建的图形上网!
- 关于重绘的Menu在CXXXView里响应pop菜单,菜单项状态不更新
- 我的线程加载资源时常没有加载成功.
我想问的是 到底是什么编译器设置会产生这些不同的汇编代码?
NULL,(LPARAM)pData->str);
004136CD mov eax,dword ptr [pData]
004136D0 add eax,0Ch
004136D3 mov esi,esp
004136D5 push eax
004136D6 push 0
004136D8 push 0Ch
004136DA mov ecx,dword ptr [pData]
004136DD mov edx,dword ptr [ecx+8]
004136E0 push edx
004136E1 call dword ptr [mySendMessage]
004136E4 cmp esi,esp
004136E6 call @ILT+1600(__RTC_CheckEsp) (411645h) 程序在最后一个call的地方又挂掉了 又是绝对地址...
这个又是啥问题引起的呢
2.不用运行时库函数,要重定位
3.部分API可能也要重定位,可用LoadLibrary,GetProcAddress
4.常量字符串,可转为16进制数组
如DWORD sz[]={0x31323334, 0x00003536}表示ANSI的"432165"