首页
社区
课程
招聘
[旧帖] [原创]发一个x64版的C语言和汇编混合编程的例子 0.00雪花
发表于: 2011-11-8 18:33 3028

[旧帖] [原创]发一个x64版的C语言和汇编混合编程的例子 0.00雪花

2011-11-8 18:33
3028

通过一个例子证明了Windows xp x64版本是使用gs来获取线程块的。
由于微软的x64版本的编译器已经不支持嵌入汇编语句__ASM,所以写了两个小程序,一个c语言程序1.c,另一个汇编程序2.asm

1.c 源码如下:
#include <windows.h>

extern int GetPid();

int PrintGs(void *pid)
{
        printf("gs value = %ld\n",(long)pid);
        return 0;
}

int main(int argc, char* argv[])
{
        DWORD Pid;
        DWORD PidFromGs;

        Pid = GetCurrentProcessId();
        printf("pid=%d\n",Pid);
        PidFromGs = GetPid();
        printf("Pid from gs:[64]=%ld\n",(long)PidFromGs);
        return 0;
}
c语言编译命令:
cl /c 1.c

2.asm汇编程序源码如下:
include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC        GetPid
EXTRN        PrintGs:PROC

_TEXT        SEGMENT
GetPid        PROC
        mov        rcx,gs
        sub        rsp,8
        call         PrintGs
        add        rsp,8
        mov        eax,gs:[64]
        ret        0
GetPid        ENDP
_TEXT        ENDS
END

汇编编译命令:
ml64 /c 2.asm

链接命令:
link 1.obj 2.obj

执行结果,和预期的一样,通过API取到的进程号,和从TEB数据结构上的取到的进程号,是一样的。
pid=2884
gs value = 43
Pid from gs:[64]=2884


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 2503
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂 看看 溜达溜达 逛逛!!
2011-11-8 20:52
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
调用者清除退栈也用ret 0这样的代码么。。:)
我就看看。。
2011-11-8 22:23
0
雪    币: 106
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错学习了,感谢分享
2011-11-10 11:54
0
游客
登录 | 注册 方可回帖
返回
//