首页
社区
课程
招聘
[求助] c++ 如何坠入 机器编码 并且调用
发表于: 2017-1-2 16:13 4753

[求助] c++ 如何坠入 机器编码 并且调用

2017-1-2 16:13
4753
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
置入代码(xx,xx,xx)
2017-1-2 16:45
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
__emit
2017-1-2 16:56
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
使用关键字_asm就行
2017-1-2 17:47
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个是易语言的吧 c++不能用这个吧
2017-1-2 17:51
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如题!!
2017-1-2 18:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
除了这个还有其他可用的吗 我是想直接写一串机器码  然后调用
2017-1-2 18:03
0
雪    币: 353
活跃值: (57)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
8
如果机器码不多,3楼4楼是正解。如果机器码很多,那你应该是有一个二进制的文件,用我那个小工具convert成.obj或.lib,链接进工程,__asm jmp xxxx,或者转换成某种类型函数指针,foo(...);——需要修改工具,把数据放到.text段,并且加上可执行权限。
2017-1-2 18:28
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
这个是可以的啊!我写一段给你

#include "stdafx.h"
#include <Windows.h>
typedef VOID (WINAPI *PDebugProcess)();//定义一个函数类型
        PDebugProcess m_DebugProcess=0;//定义一个函数指针
int _tmain(int argc, _TCHAR* argv[])
{
        DWORD lpflOldProtect = 0;
        BYTE Code[]={0xcc,0xc3};//填写机器码,这是将要执行的机器码!0xcc是int 3的机器码,0xc3是 ret的机器码
        m_DebugProcess=(PDebugProcess)::VirtualAlloc(0,sizeof(Code),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//申请内存
        if(m_DebugProcess)
        {
                memcpy(m_DebugProcess,Code,sizeof(Code));//将机器码复制进入新申请的内存
        m_DebugProcess();//调用机器码
        ::VirtualFree(m_DebugProcess,sizeof(Code),MEM_DECOMMIT);//释放内存
        m_DebugProcess=NULL;
        }
        return 0;
}
这段代码将直接调用机器码!
我是采用VC++2010编写的,其余的编译器大同小异!
2017-1-4 09:03
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
不用那么麻烦,将机器码放入一个新节,然后指定节的属性!指定为可写,可读,可执行就行!使用link指令指定新节的属性就行
2017-1-4 09:34
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
这个是示例代码

// masm.cpp : 定义控制台应用程序的入口点。
//

//使用新节和新内存两种办法来执行字节码,这个字节码的功能是获取本进程的PID
#include "stdafx.h"
#include <Windows.h>
#define USERRUNDATASECTION //这个宏控制着是使用什么方法执行字节码
#ifdef USERRUNDATASECTION //如果定义这个宏,则使用建立新节的办法来执行字节码
#pragma data_seg("RunData")//建立一个叫“RunData”的数据段
#pragma comment(linker,"/SECTION:RunData,RE")//设置段RunData的属性为“可读可执行”
#else
#include <stdlib.h>
#endif
#if _WIN64//用宏区分64位,来分别执行不同的字节码!
        BYTE Code[]={0x65 ,0x48 ,0x8B ,0x04 ,0x25 ,0x40 ,0x00 ,0x00 ,0x00,0xc3,0x90,0x00};//字节码 功能是获取本进程的PID 这是64位程序需要执行的字节码
#else
        BYTE Code[]={0x64 ,0xA1 ,0x18 ,0x00 ,0x00 ,0x00 ,0x8B ,0x40 ,0x20 ,0xc3 ,0xcc,0xc3};//字节码 功能是获取本进程的PID 这是32位程序需要执行的字节码
#endif
#ifdef USERRUNDATASECTION
#pragma data_seg()
#endif
typedef DWORD (WINAPI *PGetCurrentProcessID)();
        PGetCurrentProcessID m_GetCurrentProcessID=0; //定义一个调用指针
int _tmain(int argc, _TCHAR* argv[])
{
        DWORD Write = 0;
        DWORD lpflOldProtect = 0;
#ifdef USERRUNDATASECTION //这个宏控制着是使用什么方法执行字节码
///////////////////////////////////////////////////////////////////
        //如果使用新节的办法执行字节码,那么将执行这个位置的代码
        m_GetCurrentProcessID=(PGetCurrentProcessID)&Code;
        m_GetCurrentProcessID();
//////////////////////////////////////////////////////////////////
#else
/////////////////////////////////////////////////////////////////
        //如果使用新内存的办法执行字节码,那么将执行这个位置的代码
        m_GetCurrentProcessID=(PGetCurrentProcessID)::VirtualAlloc(0,sizeof(Code),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
        if(m_GetCurrentProcessID)
        {
        ::memcpy(m_GetCurrentProcessID,Code,sizeof(Code));
        m_GetCurrentProcessID();
        ::VirtualFree(m_GetCurrentProcessID,sizeof(Code),MEM_DECOMMIT);
        }
/////////////////////////////////////////////////////////////////
#endif
        return 0;
}
2017-1-4 10:08
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢老哥
2017-1-4 11:36
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
汇编代码转换的二进制代码也可以执行吗
2017-1-4 12:54
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
只要字节码正确都可以执行,不过你得使用申请新内存的办法执行了,使用家新节的办法是没法执行的
2017-1-4 16:43
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
15
参考http://bbs.pediy.com/showthread.php?p=1456677
2017-1-4 18:47
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
如果是call 的话 哪个参数也是ebp+8=参数1吗 ebp-4=变量1吗
2017-1-4 19:14
0
雪    币: 353
活跃值: (57)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
17
你这才几条指令啊。要是几十K或者更多呢,你定义一个硕大的数组?可行,但麻烦。
2017-1-5 23:11
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
18
这个要看调用方式咯
2017-1-6 13:37
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
你总该有一个放可执行代码的地方吧?不然你放哪?你也可以放一个文件里,但是这就得用内存的方式动态加载了!
2017-1-6 13:39
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
20
而且这本来就是一个例子,作为例子,这样做已经足够了!能说明问题就好
2017-1-6 14:34
0
游客
登录 | 注册 方可回帖
返回
//