在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的更多相关文章

  1. 试了下阿里云的OPEN Api

    逐渐理解open api的意义,试了下阿里云的续费接口,续费一个月 package com.test; /** * @author * @date 2018/12/05 */ import com.a ...

  2. 屏幕測试亮点,新买了一个显示器,使用web简单的測试下了亮点

    1,购买了一个新的显示器 趁着双11的时候价格廉价.入手了一个显示器. http://serve.netsh.org/pub/dead_pixel.bin 滚动下就能够换颜色了.把chrome最大化, ...

  3. 曹工改bug:centos下,mongodb开机不能自启动,systemctl、rc.local都试了,还是不行,要不要放弃?

    问题背景 最近装个centos 7.6的环境,其中,基础环境包括,redis.nginx.mongodb.fastdfs.mysql等,其中,自启动使用的是systemctl,其他几个组件,都没啥问题 ...

  4. Linux下反弹shell的种种方式

    [前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...

  5. iOS下Audio自动播放(Autoplay)音乐

    前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...

  6. 一次ie8模式下click无反应的小事

    想起了小学时候数不尽的一件小事,哎,那夕阳下的奔跑,是我逝去的青春啊. 言归正传,先上图: <select id="cardNoList" size="4" ...

  7. 使用Windbg在XP下Heap追踪失败的原因

    1.故事背景      最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...

  8. linux下使用多线程编写的聊天室

    自从开始学linux网络编程后就想写个聊天室,一开始原本打算用多进程的方式来写,可是发觉进程间的通信有点麻烦,而且开销也大,后来想用多线程能不能实现呢,于是便去看了一下linux里线程的用法,实际上只 ...

  9. myql数据库在cmd下,中文乱码的问题原因

    使用navicat把数据导入数据库,这些数据都是中文,导入成功,显式也正常,但是在mysql cmd下都是乱码.检查了我的mysql配置,字符编码都是utf8,包括navicat连接时候也设置过是ut ...

随机推荐

  1. gawk使用方法简介

    转载:gawk 使用方法简介 - 简书 (jianshu.com) gawk 是最初 Unix 系统上 awk 程序的 GNU 版本.相对于作为流式编辑器的 sed 而言,它提供了更为强大的编程语言特 ...

  2. Codeforces Round #747 (Div. 2)题解

    谢天谢地,还好没掉分,还加了8分,(8分再小也是加啊)前期刚开始有点卡,不过在尽力的调整状态之后,还是顺利的将前面的水题过完了,剩下的E2和F题就过不去了,估计是能力问题,自己还是得认真补题啦. E2 ...

  3. hdu 2191 珍惜现在,感恩生活(多重背包)

    题意: 有N元经费,M种大米,每种大米有单袋价格p元,单袋重量h,以及对应袋数c. 问最多可以买多重的大米. 思路: 经典多重背包,用二进制的方法. 看代码 代码: struct node{ int ...

  4. SpringCloud 2020.0.4 系列之 Gateway入门

    1. 概述 老话说的好:做人要有幽默感,懂得幽默的人才会活的更开心. 言归正传,今天我们来聊聊 SpringCloud 的网关组件 Gateway,之前我们去访问 SpringCloud 不同服务的接 ...

  5. upload-labs通关攻略(1-11关)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  6. Express 的基本使用(创建一个简单的服务器)

    Express 的基本使用(创建一个简单的服务器) const express = require('express') // 创建服务器应用程序 // 相当于 http.creatServer co ...

  7. 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)

    1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...

  8. HTTP1.1 Keep-Alive到底算不算长连接?

    在基础架构部沉浸了半年,有一些认知刷新想和童靴们交代一下, 不一定全面,仅代表此时的认知, 也欢迎筒靴们提出看法. 本文聊一聊口嗨用语:"长连接.短连接", 文章会按照下面的思维导 ...

  9. JSON实现序列化dump和dumps方法,JSON实现反序列化loads和load方法

    通过文件操作,我们可以将字符串写入到一个本地文件.但是,如果是一个对象(例如列表.字典.元组等),就无 法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里. 设计一套协议,按照某种 ...

  10. [bzoj5510]唱跳rap和篮球

    显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...