首页
社区
课程
招聘
[求助]C#如何调用XEDParse实现汇编代码二进制编码?
2019-10-6 09:16 10516

[求助]C#如何调用XEDParse实现汇编代码二进制编码?

2019-10-6 09:16
10516
x64dbg上看到,XEDParse被用来把汇编代码转成二进制代码。调用"XEDParse.dll"文件中的一个函数“XEDParseAssemble”就可以了,使用起来非常简单,除了被C使用外,网上有不少用易语言实现的软件。

本人想用C#也实现一个,奈何调用XEDParse.dll的总是不成功,不知到有没有用C#调用过没有?

头文件如下:
#ifndef _XEDPARSE_H
#define _XEDPARSE_H

#include <windows.h>

//XEDParse defines
#ifdef XEDPARSE_STATIC
#define XEDPARSE_EXPORT
#else
#ifdef XEDPARSE_BUILD
#define XEDPARSE_EXPORT __declspec(dllexport)
#else
#define XEDPARSE_EXPORT __declspec(dllimport)
#endif //XEDPARSE_BUILD
#endif

#define XEDPARSE_CALL //calling convention

#define XEDPARSE_MAXBUFSIZE 256
#define XEDPARSE_MAXASMSIZE 16

//typedefs
typedef bool (XEDPARSE_CALL* CBXEDPARSE_UNKNOWN)(const char* text, ULONGLONG* value);

//XEDParse enums
enum XEDPARSE_STATUS
{
    XEDPARSE_ERROR = 0,
    XEDPARSE_OK = 1
};

//XEDParse structs
#pragma pack(push,8)
struct XEDPARSE
{
    bool x64; // use 64-bit instructions
    ULONGLONG cip; //instruction pointer (for relative addressing)
    unsigned int dest_size; //destination size (returned by XEDParse)
    CBXEDPARSE_UNKNOWN cbUnknown; //unknown operand callback
    unsigned char dest[XEDPARSE_MAXASMSIZE]; //destination buffer
    char instr[XEDPARSE_MAXBUFSIZE]; //instruction text
    char error[XEDPARSE_MAXBUFSIZE]; //error text (in case of an error)
};
#pragma pack(pop)

#ifdef __cplusplus
extern "C"
{
#endif

XEDPARSE_EXPORT XEDPARSE_STATUS XEDPARSE_CALL XEDParseAssemble(XEDPARSE* XEDParse);

#ifdef __cplusplus
}
#endif

#endif // _XEDPARSE_H


只需要调用函数XEDParseAssemble就好,参数构造和调用,我尝试了很久,也没搞定。


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (6)
雪    币: 768
活跃值: (226)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
zmrbak 2019-10-6 09:38
2
0
刚试了试,搞定了,分享一下。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)]
        public struct XEDPARSE
        {
            public int x64;                        // use 64-bit instructions
            public UInt64 cip;                         //instruction pointer (for relative addressing)
            public int dest_size;                   //destination size (returned by XEDParse)
            public int cbUnknown;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = XEDPARSE_MAXASMSIZE)]
            public string dest;                        //destination buffer
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = XEDPARSE_MAXBUFSIZE)]
            public string instr;                       //instruction text
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = XEDPARSE_MAXBUFSIZE)]
            public string error;                       //error text (in case of an error)
        };

[DllImport("XEDParse.dll", EntryPoint = "XEDParseAssemble",CallingConvention = CallingConvention.Cdecl)]
        static extern int XEDParseAssemble(ref XEDPARSE xedparse);

void Test()
        {
            XEDPARSE parse = new XEDPARSE();
            parse.x64 = 0;
            parse.cip = 0;
            parse.instr = @"mov esp, ebp";

            int result=XEDParseAssemble(ref parse);
            ;
        }

雪    币: 2656
活跃值: (3730)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 2019-10-6 10:57
3
0
   void Test()
        {
            XEDPARSE parse = new XEDPARSE();
            parse.x64 = 1;
            parse.cip = 0;
            parse.instr = "mov rax, 0x1234567ac";

            int result = XEDParseAssemble(ref parse);
            string tag = "";
            int l = parse.dest.Length;
            byte[] bytes = System.Text.Encoding.Default.GetBytes(parse.dest);
            for (int i = 0; i < parse.dest_size; i++)
            {
                tag += String.Format("{0:X2}", bytes[i]);
            }
            MessageBox.Show(tag);
        }
有问题啊··试试这代码
雪    币: 768
活跃值: (226)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
zmrbak 2019-10-6 19:24
4
0
值得怀疑 &nbsp;&nbsp;&nbsp;void&nbsp;Test() &nbsp;&nbsp;&nbsp;&nbsp;&nbs ...
编译通过,数据正常获取。大功告成。谢谢!
雪    币: 2656
活跃值: (3730)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 2019-10-6 21:54
5
0
zmrbak 编译通过,数据正常获取。大功告成。谢谢!
你试试我上面那个汇编 mov rax, 0x1234567ac   64位模式的
雪    币: 1042
活跃值: (455)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Rookietp 2019-10-7 12:17
6
0
asmjit好像也可以?
雪    币: 63
活跃值: (703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_kppjdiod 2022-11-15 08:20
7
0
zmrbak 刚试了试,搞定了,分享一下。[StructLayout(LayoutKind.Sequential,&nbsp;CharSet&nbsp;=&nbsp;CharSet.Ansi ...
问下有没有 XEDParse,机器码转汇编的例子
游客
登录 | 注册 方可回帖
返回