能力值:
( LV9,RANK:280 )
|
-
-
2 楼
置入代码(xx,xx,xx)
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
__emit
|
能力值:
( LV7,RANK:110 )
|
-
-
4 楼
使用关键字_asm就行
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
这个是易语言的吧 c++不能用这个吧
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
如题!!
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
除了这个还有其他可用的吗 我是想直接写一串机器码 然后调用
|
能力值:
( LV9,RANK:140 )
|
-
-
8 楼
如果机器码不多,3楼4楼是正解。如果机器码很多,那你应该是有一个二进制的文件,用我那个小工具convert成.obj或.lib,链接进工程,__asm jmp xxxx,或者转换成某种类型函数指针,foo(...);——需要修改工具,把数据放到.text段,并且加上可执行权限。
|
能力值:
( 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编写的,其余的编译器大同小异!
|
能力值:
( LV7,RANK:110 )
|
-
-
10 楼
不用那么麻烦,将机器码放入一个新节,然后指定节的属性!指定为可写,可读,可执行就行!使用link指令指定新节的属性就行
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢老哥
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
汇编代码转换的二进制代码也可以执行吗
|
能力值:
( LV7,RANK:110 )
|
-
-
14 楼
只要字节码正确都可以执行,不过你得使用申请新内存的办法执行了,使用家新节的办法是没法执行的
|
能力值:
( LV13,RANK:420 )
|
-
-
15 楼
参考http://bbs.pediy.com/showthread.php?p=1456677
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
如果是call 的话 哪个参数也是ebp+8=参数1吗 ebp-4=变量1吗
|
能力值:
( LV9,RANK:140 )
|
-
-
17 楼
你这才几条指令啊。要是几十K或者更多呢,你定义一个硕大的数组?可行,但麻烦。
|
能力值:
( LV7,RANK:110 )
|
-
-
18 楼
这个要看调用方式咯
|
能力值:
( LV7,RANK:110 )
|
-
-
19 楼
你总该有一个放可执行代码的地方吧?不然你放哪?你也可以放一个文件里,但是这就得用内存的方式动态加载了!
|
能力值:
( LV7,RANK:110 )
|
-
-
20 楼
而且这本来就是一个例子,作为例子,这样做已经足够了!能说明问题就好
|