资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

go语言程序加壳 go语言开发文档

Go语言基础语法(一)

本文介绍一些Go语言的基础语法。

目前创新互联建站已为1000多家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、宁海网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

先来看一个简单的go语言代码:

go语言的注释方法:

代码执行结果:

下面来进一步介绍go的基础语法。

go语言中格式化输出可以使用 fmt 和 log 这两个标准库,

常用方法:

示例代码:

执行结果:

更多格式化方法可以访问中的fmt包。

log包实现了简单的日志服务,也提供了一些格式化输出的方法。

执行结果:

下面来介绍一下go的数据类型

下表列出了go语言的数据类型:

int、float、bool、string、数组和struct属于值类型,这些类型的变量直接指向存在内存中的值;slice、map、chan、pointer等是引用类型,存储的是一个地址,这个地址存储最终的值。

常量是在程序编译时就确定下来的值,程序运行时无法改变。

执行结果:

执行结果:

Go 语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及指针相关运算符。

算术运算符:

关系运算符:

逻辑运算符:

位运算符:

赋值运算符:

指针相关运算符:

下面介绍一下go语言中的if语句和switch语句。另外还有一种控制语句叫select语句,通常与通道联用,这里不做介绍。

if语法格式如下:

if ... else :

else if:

示例代码:

语法格式:

另外,添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true。

示例代码:

执行结果:

下面介绍几种循环语句:

执行结果:

执行结果:

也可以通过标记退出循环:

--THE END--

go语言web框架beego安装(go mod方式)

go语言web框架beego安装(go mod方式)_不忘初心,方得始终-CSDN博客

重要:将bee命令放到GOROOT/bin目录下,这步很关键

cp bee /usr/local/go/bin/

注:或者可以将GOPATH/bin设置为环境变量

echo ’export PATH=" PATH"' ~/.bashrc

source ~/.bashrc

router路由下方法名要大写,访问权限

wq保存

生效环境变量: source /etc/profile

go build -o abc.exe可指定编译后的文件名

Golang常用环境变量说明与设置详解

环境变量GOBIN表示我们开发程序编译后二进制命令的安装目录。

当我们使用go install命令编译和打包应用程序时,该命令会将编译后二进制程序打包GOBIN目录,一般我们将GOBIN设置为GOPATH/bin目录。

export GOBIN=$GOPATH/bin

Go get包管理mod

windows下默认项目路径在go安装目录的src下(beego)

为什么加壳后,杀毒说有毒

一般病毒的伪装都是加壳了,我想应该是杀软误认为加壳后的程序无论什么都算是病毒了吧。楼主要不就把杀软关了调试程序吧,要不就在沙箱里做。

谁能详细解说下脱壳步骤和软件

【目标软件】WINME下的记事本

【加壳方式】Armadillo3.60 CopyMem-ll Debug-Blocker

【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC 1.6F

1.前言

为了练习脱壳,前一段时间从网上下了一个Armadillo3.60,然后给记事本加壳,当然本人初学破解,参考了很多大虾们的文章,然后自己模仿脱壳,可是当我修改了Magic Jump后,用401000段“内存断点”大法想到达那个盼望已久的OEP的时候,意外出现了:程序终止,退出!是我做法错误,然后我又实验了N遍,依然如此,为什么?随后又在论坛不停的搜索着,想找一些有关的知识,终于找到了(抱歉,忘记了作者是谁),而且解决了这个问题,为了使象我一样初学者不要重蹈覆辙,我决定详细的写一写,也许你认为很简单,那么请略过。

2.脱壳过程(分以下几步进行)

设置Ollydbg忽略所有的异常选项,用IsDebug 1.4插件去掉Ollydbg的调试器标志。

(1)查找OEP

用OD中载入程序,下bp WaitForDebugEvent,F9运行,中断如下:

77E93A07 k 55 push ebp ====中断在此处,清除断点

77E93A08 8BEC mov ebp,esp

77E93A0A 83EC 68 sub esp,68

77E93A0D 56 push esi

77E93A0E FF75 0C push dword ptr ss:[ebp C]

查看堆栈窗口:

0012DAC0 00423D67 /CALL 到 WaitForDebugEvent 来自 NOTEPAD.00423D61

0012DAC4 0012EB84 |pDebugEvent = 0012EB84 ====注意这里

0012DAC8 000003E8 \Timeout = 1000. ms

在0012EB84所在的行上点击右键选“转存中跟随”。

然后再下bp WriteProcessMemory,F9运行

77E41A90 k 55 push ebp ====中断在此处

77E41A91 8BEC mov ebp,esp

77E41A93 51 push ecx

77E41A94 51 push ecx

77E41A95 8B45 0C mov eax,dword ptr ss:[ebp C]

看数据转存窗口:

0012EB84 01 00 00 00 40 07 00 00 ...@ ..

0012EB8C 5C 01 00 00 01 00 00 80 \ .. ..

0012EB94 00 00 00 00 00 00 00 00 ........

0012EB9C CC 10 40 00 02 00 00 00 ?@. ...

0012EBA4 00 00 00 00 CC 10 40 00 ....?@.

0012EBAC CC 10 40 00 00 00 00 00 ?@.....

红色字体的4010CC就是OEP,这样我们接着来第2步

(2)dump文件

现在我们重新用OD中载入程序,下硬件断点,he WaitForDebugEvent,F9运行,中断如下:

77E93A07 k 55 push ebp ====中断在此处,删除断点

77E93A08 8BEC mov ebp,esp

77E93A0A 83EC 68 sub esp,68

77E93A0D 56 push esi

77E93A0E FF75 0C push dword ptr ss:[ebp C]

Alt F9返回,搜索常数FFFFFFF8,来到(004243D6处):

0042438A \83BD D0F5FFFFcmp dword ptr ss:[ebp-A30],0====参考文章里提到的关键代码

00424391 . 0F8C A9020000 jl NOTEPAD.00424640====跳转到00424640处,因此在00424640处下断点

00424397 . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

0042439D . 3B0D E4454500 cmp ecx,dword ptr ds:[4545E4]

004243A3 . 0F8D 97020000 jge NOTEPAD.00424640

004243A9 . 8B95 44F6FFFF mov edx,dword ptr ss:[ebp-9BC]

004243AF . 81E2 FF000000 and edx,0FF

004243B5 . 85D2 test edx,edx

004243B7 . 0F84 AD000000 je NOTEPAD.0042446A

004243BD . 6A 00 push 0

004243BF . 8BB5 D0F5FFFF mov esi,dword ptr ss:[ebp-A30]

004243C5 . C1E6 04 shl esi,4

004243C8 . 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]

004243CE . 25 07000080 and eax,80000007

004243D3 . 79 05 jns short NOTEPAD.004243DA

004243D5 . 48 dec eax

004243D6 . 83C8 F8 or eax,FFFFFFF8=====搜索来到这里,向上看

004243D9 . 40 inc eax

004243DA 33C9 xor ecx,ecx

004243DC . 8A88 802A4500 mov cl,byte ptr ds:[eax 452A80]

004243E2 . 8B95 D0F5FFFF mov edx,dword ptr ss:[ebp-A30]

004243E8 . 81E2 07000080 and edx,80000007

004243EE . 79 05 jns short NOTEPAD.004243F5

004243F0 . 4A dec edx

004243F1 . 83CA F8 or edx,FFFFFFF8

004243F4 . 42 inc edx

004243F5 33C0 xor eax,eax

004243F7 . 8A82 812A4500 mov al,byte ptr ds:[edx 452A81]

004243FD . 8B3C8D 60E244mov edi,dword ptr ds:[ecx*4 44E260]

00424404 . 333C85 60E244xor edi,dword ptr ds:[eax*4 44E260]

0042440B . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

00424411 . 81E1 07000080 and ecx,80000007

00424417 . 79 05 jns short NOTEPAD.0042441E

00424419 . 49 dec ecx

0042441A . 83C9 F8 or ecx,FFFFFFF8

0042441D . 41 inc ecx

0042441E 33D2 xor edx,edx

00424420 . 8A91 822A4500 mov dl,byte ptr ds:[ecx 452A82]

00424426 . 333C95 60E244xor edi,dword ptr ds:[edx*4 44E260]

0042442D . 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]

00424433 . 99 cdq

00424434 . B9 1C000000 mov ecx,1C

00424439 . F7F9 idiv ecx

0042443B . 8BCA mov ecx,edx

0042443D . D3EF shr edi,cl

0042443F . 83E7 0F and edi,0F

00424442 . 03F7 add esi,edi

00424444 . 8B15 D4454500 mov edx,dword ptr ds:[4545D4]

0042444A . 8D04B2 lea eax,dword ptr ds:[edx esi*4]

0042444D . 50 push eax

0042444E . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

00424454 . 51 push ecx

00424455 . E8 FF1F0000 call NOTEPAD.00426459

0042445A . 83C4 0C add esp,0C

0042445D . 25 FF000000 and eax,0FF====从这里开始修改

00424462 . 85C0 test eax,eax

00424464 . 0F84 D6010000 je NOTEPAD.00424640

在0042438A处下 硬件执行 断点,F9运行到0042438A处,得到ebp-A30=12EB70,这样上述的修改地方修改为:

0042445D FF05 70EB1200 inc dword ptr ds:[12EB70]

00424463 90 nop

00424464 ^ E9 21FFFFFF jmp NOTEPAD.0042438A

把12EB70处置0,去掉所有断点,并在00424640处下断,F9运行,断住。好了,所有代码都强制解压完成。

运行LordPE,有2个关于NOTEPAD的进程,选择第2个,即可完全dump出来了。

(3)修复IAT表

因为Armadillo的壳使得ImportREC的"IAT AutoSearch"失效,所以必须确定IAT的RAV以及大小,为此我们用OD载入刚刚DUMP出来的文件,来确定IAT的RAV以及大小,载入之前先修改入口点为10CC,然后载入:

004010CC d 55 push ebp

004010CD 8BEC mov ebp,esp

004010CF 83EC 44 sub esp,44

004010D2 56 push esi

004010D3 FF15 F4734000 call dword ptr ds:[4073F4]====注意这里

004010D9 8BF0 mov esi,eax

我们可以随便找一个CALL入手确定IAT的RAV以及大小(不妨找看到的第一个CALL)。光标定位到数据转存窗口中,然后 Ctrl G,4073F4,可以看到:

004072E4 BE 7D 00 00 00 00 00 00 缄......

004072EC D7 23 DA 77 46 BA 3C 00 ?赵F?.

004072F4 F0 59 DA 77 CC 5E DA 77 餣赵蘜赵

..........(省略若干)

004073DC 7D 15 F5 77 90 9B 3C 00 } 鮳悰.

004073E4 03 38 E5 77 67 31 E5 77 8鍂g1鍂

004073EC 3C 51 E5 77 97 2D E5 77 Q鍂?鍂

004073F4 C7 C3 3C 00 45 9A E5 77 敲.E氩w====到达这里,由此处向上和向下看

004073FC 91 B2 3C 00 8D B8 3C 00 懖.嵏.

00407404 50 88 3C 00 CE 8A 47 77 P?.螉Gw

..........(省略若干)

00407504 EC 72 D1 77 11 9A D1 77 靣褀 氀w

0040750C 06 81 D1 77 D3 3D D1 77 布w?褀

00407514 37 89 3C 00 B3 22 32 76 7?.?2v

0040751C 39 DC 33 76 3B C2 32 76 9?v;?v

00407524 10 1D 34 76 D6 8B 32 76 4v謰2v

0040752C B7 44 33 76 70 1B 32 76 稤3vp 2v

00407534 8B 88 3C 00 00 00 00 00 媹.....

这样IAT的大小是终点-始点=00407530-004072EC=244,RVA=72EC。为什么是这样呢,我们看到很多77XXXXXX之类的,而到了00407534处是8B 88 3C 00,为了确定其是否在IAT内,我们可以在OD的CPU窗口内定位光标到401000处,然后Ctrl B,填入 34 75 40,结果搜索不到,而30 75 40能够搜索到,是JMP [407530],因此确定IAT的终点点是407530,用同样的方法可以确定起点点是4072EC。

好了,IAT的RAV以及大小确定了,现在就要修复IAT了,用OD再一次载入未脱壳的程序,bp DebugActiveProcess,F9断下。看堆栈窗口:

0012DAC4 00423BDB /CALL 到 DebugActiveProcess 来自 NOTEPAD.00423BD5

0012DAC8 00000324 \ProcessId = 324=====子进程句柄

0012DACC 0012FF2C

打开另一个OD附加324这个子进程。然后ALT+F9返回程序:

00433999 N - EB FE jmp short NOTEPAD.ModuleEntryPoint====中断在此处,还原代码

0043399B EC in al,dx

0043399C |. 6A FF push -1

0043399E |. 68 503C4500 push NOTEPAD.00453C50

还原00433999处代码代码,EB FE改为55 8B,接下来就要按照FLY等大虾们的方法了。在接下来的步骤中前一部分可以参考Fly的《壹次脱壳法——Armadillo 双进程标准壳 快速脱壳》,我们从Magic Jump,避开IAT加密开始,取消以前断点,下断:BP GetModuleHandleA 5,

77E59F98 /0F84 23060000 je kernel32.77E5A5C1====中断在此处,注意看堆栈

77E59F9E |FF7424 04 push dword ptr ss:[esp 4]

77E59FA2 |E8 55080000 call kernel32.77E5A7FC

77E59FA7 |85C0 test eax,eax

在这里中断若干次,注意堆栈窗口的变化,当出现:

......

0012BF20 00AAC807 返回到 00AAC807 来自 kernel32.GetModuleHandleA

0012BF24 00ABD6C8 ASCII "kernel32.dll"

0012BF28 00ABE67C ASCII "VirtualAlloc"

0012BF20 00AAC824 返回到 00AAC824 来自 kernel32.GetModuleHandleA

0012BF24 00ABD6C8 ASCII "kernel32.dll"

0012BF28 00ABE670 ASCII "VirtualFree"

0012BC98 00A9799B 返回到 00A9799B 来自 kernel32.GetModuleHandleA

0012BC9C 0012BDD4 ASCII "kernel32.dll"

然后Alt F9返回,

00A97995 FF15 C480AB00 call dword ptr ds:[AB80C4] ; kernel32.GetModuleHandleA

00A9799B 8B0D E011AC00 mov ecx,dword ptr ds:[AC11E0]====返回到这里

00A979A1 89040E mov dword ptr ds:[esi ecx],eax

00A979A4 A1 E011AC00 mov eax,dword ptr ds:[AC11E0]

00A979A9 393C06 cmp dword ptr ds:[esi eax],edi

00A979AC 75 16 jnz short 00A979C4

00A979AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]

00A979B4 50 push eax

00A979B5 FF15 CC80AB00 call dword ptr ds:[AB80CC] ; kernel32.LoadLibraryA

00A979BB 8B0D E011AC00 mov ecx,dword ptr ds:[AC11E0]

00A979C1 89040E mov dword ptr ds:[esi ecx],eax

00A979C4 A1 E011AC00 mov eax,dword ptr ds:[AC11E0]

00A979C9 393C06 cmp dword ptr ds:[esi eax],edi

00A979CC 0F84 AD000000 je 00A97A7F====Magic Jump,修改为JMP

00A979D2 33C9 xor ecx,ecx

00A979D4 8B03 mov eax,dword ptr ds:[ebx]

修改了上面的Magic Jump后,清除所有断点,Alt M ,在401000上下 内存访问断点,F9运行,这次中断到了OEP,然后运行ImportREC,选择324这个进程,OEP填:10CC,RVA:72EC,SIZE:244,然后“Get Imports”,再按“Show Invalid”地址,剪掉修复抓取文件,程序能够正常运行,至此脱壳完毕 !第一次用OD脱壳,感觉就是爽,和Softice比起来,感觉OD脱壳很方便.

《Go语言程序设计》epub下载在线阅读全文,求百度网盘云资源

《Go 语言程序设计》(Mark Summerfield)电子书网盘下载免费在线阅读

资源链接:

链接:

提取码: kqzi  

书名:Go 语言程序设计

作者:Mark Summerfield

译者:许式伟

豆瓣评分:6.9

出版社:人民邮电出版社

出版年份:2013-8-1

页数:354

内容简介:

国外最经典的Go语言著作,Go语言编程的先驱者Mark Summerfield的实践经验总结。

这是一本Go语言实战指南,帮你了解Go语言,按Go语言的方式思考,以及使用Go语言来编写高性能软件。

作者展示了如何编写充分利用Go语言突破性的特性和惯用法的代码,以及Go语言在其他语言之上所做的改进,并着重强调了Go语言的关键创新。

注重实践教学,每章都提供了多个经过精心设计的代码示例。

由国内第一个核心服务完全采用Go语言实现的团队——七牛团队核心成员翻译。

作者简介:

Mark Summerfield Qtrac公司创始人,独立的培训讲师、顾问、技术编辑,Go、Python、C++、Qt和PyQt方面的技术作家。他的著作包括Rapid GUI Programming with Python and Qt、C++ GUI Programming with Qt 4(与Jasmin Blanchette合著)、Programming in Python 3和Advanced Qt Programming等。

许式伟——七牛云存储CEO,开源爱好者,发布过十余个C++开源项目,拥有超过15年的C/C++开发经验。

吕桂华——七牛云存储联合创始人,拥有十余年的C/C++大型项目开发经验,也曾在Java和.NET平台上探索多年。

徐 立——七牛云存储首席布道师,前盛大创新院高级研究员。

何李石——七牛云存储布道师。

七牛云存储技术团队是国内第一个核心服务完全采用Go语言实现的团队。

调试Go语言的核心转储(Core Dumps)

英文原文链接【Go, the unwritten parts】 发表于2017/05/22 作者JBD是Go语言开发小组成员

检查程序的执行路径和当前状态是非常有用的调试手段。核心文件(core file)包含了一个运行进程的内存转储和状态。它主要是用来作为事后调试程序用的。它也可以被用来查看一个运行中的程序的状态。这两个使用场景使调试文件转储成为一个非常好的诊断手段。我们可以用这个方法来做事后诊断和分析线上的服务(production services)。

在这篇文章中,我们将用一个简单的hello world网站服务作为例子。在现实中,我们的程序很容易就会变得很复杂。分析核心转储给我们提供了一个机会去重构程序的状态并且查看只有在某些条件/环境下才能重现的案例。

作者注 : 这个调试流程只在Linux上可行。我不是很确定它是否在其它Unixs系统上工作。macOS对此还不支持。Windows现在也不支持。

在我们开始前,需要确保核心转储的ulimit设置在合适的范围。它的缺省值是0,意味着最大的核心文件大小是0。我通常在我的开发机器上将它设置成unlimited。使用以下命令:

接下来,你需要在你的机器上安装 delve 。

下面我们使用的 main.go 文件。它注册了一个简单的请求处理函数(handler)然后启动了HTTP服务。

让我们编译并生产二进制文件。

现在让我们假设,这个服务器出了些问题,但是我们并不是很确定问题的根源。你可能已经在程序里加了很多辅助信息,但还是无法从这些调试信息中找出线索。通常在这种情况下,当前进程的快照会非常有用。我们可以用这个快照深入查看程序的当前状态。

有几个方式来获取核心文件。你可能已经熟悉了奔溃转储(crash dumps)。它们是在一个程序奔溃的时候写入磁盘的核心转储。Go语言在缺省设置下不会生产奔溃转储。但是当你把 GOTRACEBACK 环境变量设置成“crash”,你就可以用 Ctrl+backslash 才触发奔溃转储。如下图所示:

上面的操作会使程序终止,将堆栈跟踪(stack trace)打印出来,并把核心转储文件写入磁盘。

另外个方法可以从一个运行的程序获得核心转储而不需要终止相应的进程。 gcore 可以生产核心文件而无需使运行中的程序退出。

根据上面的操作,我们获得了转储而没有终止对应的进程。下一步就是把核心文件加载进delve并开始分析。

差不多就这些。delve的常用操作都可以使用。你可以backtrace,list,查看变量等等。有些功能不可用因为我们使用的核心转储是一个快照而不是正在运行的进程。但是程序执行路径和状态全部可以访问。


分享名称:go语言程序加壳 go语言开发文档
网站URL:http://www.cdkjz.cn/article/docsoes.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220