user-0 提问: 再分享一个有趣的C代码 (比上次的好)

回复:
user: user-1
content: 发现赵老师身影就跟上来图个脸熟

user: user-2
content: 建议楼主先从网上扒一个开源虚拟机，然后从一幅美女图中提取出事先隐写在其中的浮点数，这些浮点数转为十六进制字节序列刚好是对应虚拟机的指令，虚拟机的指令对应的功能又刚好是关机。

user: user-3
content: 楼主辛苦了，为挖黑历史翻了6年前的帖，依然不能解释自己发一个会让人家关机的垃圾代码的本质

user: user-2

user: user-4
content: 引用 29 楼 赵4老师 的回复:建议楼主先从网上扒一个开源虚拟机，然后从一幅美女图中提取出事先隐写在其中的浮点数，这些浮点数转为十六进制字节序列刚好是对应虚拟机的指令，虚拟机的指令对应的功能又刚好是关机。   你还别以为没这技术，CIA90年代开发的数字水印技术就可以做到，把任意数据融合到jpeg图像或者mpeg视频流中，只能通过特定的程序还原，而且能抗二次有损压缩，绝对是牛擦的情报传递工具，把小姐姐视频嵌入到xx大宣传片中都没人知道~~~

user: user-0
content: 引用 20 楼 niiiloc 的回复:有病治病，这种有啥值得分享的，我们这里不是抖音，谢谢  终于明白你为什么喜欢在论坛骂人了，原本是以为你没刷牙，现在明白了，你所谓的“意义”就是在论坛各版块骂人吧，可能生活压力大吧。不过这种减压方式不值得提倡。如果你再想骂人，我建议你找个镜子，对着镜子骂，这样就你好我好大家好了。 我们老师说过两句话：一句是，只有那些懦弱无能的人才喜欢骂人，这样就诠释了“君子”动口不动手； 另一句是：如果你和一个人关系不好，可能是那个人的问题；如果你是和一些人关系不好，那就要自己找找原因了；

user: user-3
content: 这种代码除了秀没有任何意义，学汇编也不会写这种破烂代码，公司里写这种代码直接开除，够明白了么？

user: user-3
content: 引用 21 楼 那年那人 的回复:[quote=引用 20 楼 niiiloc 的回复:] 有病治病，这种有啥值得分享的，我们这里不是抖音，谢谢  你的自问自答，不是挺好的吗？既然自己有病就去看病啊。  引用楼上的一些内容： “电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……”     看似很啰嗦的一段话，其实都是一样的道理。    代码本身没啥作用，算是一个小玩笑，可以用shutdown -a取消。    分享只是觉得全字符串的shellcode有值得学习借鉴的地方，人们对知识向来都是各取所需，值得看就看，不值得看就不看。没必要冷嘲热讽，酸言酸语，话又说回来了，虽然这两段代码是我发的，但是我真的不是很明白第二段那个纯字符串的原理，是真的不完全明白，因为我刚学汇编，你能讲一下吗怎么实现的？（虚心请教）   [/quote] 有病，今天是愚人节么？人家执行了关机了你很开心么？

user: user-5
content: 代码对我这样的萌新有一些启发，学习了

user: user-0
content: 第一个代码只是很简单的转换，刚开始不知道vc高版本是否能通过，如果能成功运行，有30s的时间可以在cmd里执行shutdown -a取消关机，如果不会，30s内保存好需要保存的文档就可以了，不会造成数据丢失的。也可以在虚拟机里测试。  第二个代码是把机器码重新编码成了纯字母字符， 是别人帮我转的，我只知道好像是类似 base64那样重新编码的，字符串最前面应该是解码部分，由于没有源码，我不理解的是解码部分如何做到也是全字母的，有兴趣的可以逆向下那个字符串，我也好学习下。  感觉无意义的请忽略。

user: user-0
content: 引用 23 楼 niiiloc 的回复:这种代码除了秀没有任何意义，学汇编也不会写这种破烂代码，公司里写这种代码直接开除，够明白了么？ 如果你的电脑被关机了，真的很不好意思。代码只是简单的一个调用数组来验证shellcode是否有效，会有30s的延时提示关机，原本我以为那个弹出的对话框大家一看就知道是shutdown执行的，都知道shutdown -a来取消呢，再加上之前楼上@_ZGq有人也发帖提示过要想知道结果最好保存项目，我以为都能看到呢。这是我的疏忽。  你说“这种代码除了秀没有任何意义”，说到意义，也是针对不同的人的，你觉得没意义，你可以秀一个让大家觉得有意义的代码，你可以不用回帖，你可以不看；我觉得有意义就可以了，你能说草书你看不懂不会写你就说它没意义？你在论坛骂人就有意义？ 我相信csdn论坛官方更喜欢发帖“秀”代码的，而不是发帖“秀”怎么骂人的。  另外谢谢你的建议，每个行业都有每个行业的规范，每个公司大多有自己的编程代码规范，公司项目大多是团队开发，便于维护和升级产品，代码规范是必须的，所以你多虑了，在公司里没人会这么写的，就好比，有几个人会把项目计划书用草书打印，跟领导开会穿拖鞋? 人们都知道做事情要分场合。其次这俩代码不是汇编是C语言，只是数组中的机器码是用汇编转换的，shellcode大多应用在漏洞安全方面，个人代码怎么方便怎么写。

user: user-3
content: 有病治病，这种有啥值得分享的，我们这里不是抖音，谢谢

user: user-0
content: 引用 20 楼 niiiloc 的回复:有病治病，这种有啥值得分享的，我们这里不是抖音，谢谢  你的自问自答，不是挺好的吗？既然自己有病就去看病啊。  引用楼上的一些内容： “电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……”     看似很啰嗦的一段话，其实都是一样的道理。    代码本身没啥作用，算是一个小玩笑，可以用shutdown -a取消。    分享只是觉得全字符串的shellcode有值得学习借鉴的地方，人们对知识向来都是各取所需，值得看就看，不值得看就不看。没必要冷嘲热讽，酸言酸语，话又说回来了，虽然这两段代码是我发的，但是我真的不是很明白第二段那个纯字符串的原理，是真的不完全明白，因为我刚学汇编，你能讲一下吗怎么实现的？（虚心请教）

user: user-6
content: 引用 10 楼 赵4老师 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  这是最强的心法了。

user: user-0
content: 引用 12 楼 早打大打打核战争 的回复:double data[]只是一个障眼法，和用char data[]在数据段嵌入指令是一回事，让你不能直接看到机器码而已~~~  这么写确实是障眼法，因为本质上还是有汇编符号的；我修改了下，写成了纯字符串的了。  #pragma comment(linker,"/section:.data,rwe") char str[]= "PYVTX10X41PZ41H4A4I1TA71TADVTZ32PZNBFZDQC02DQD0D13DJE5I16OK4C162K5D16695J1TMN3P1"             "W0P5J0D7N7Z9L9K2I1W5B1M439LLM060L0R691Z414K2Z0M8O5H3Y8M3V604N13KK3L6O0R5JKO0A9Y5"             "B7O6P0N9S3Y0B1H5K100N2Z9R3A0F61075H114S1A9PMK4L5D6P1DML0L7M0F325G0H00MLKN0P7ZMN3"             "H8M0N0G0T060G2OMNJM1I3Z0K1M065A0Q3T2Z7N5KML2E0P3P3B2D8L02OK1W2C0I0U0S0O8L667M0QK"             "K660Y2H1C1U1S3X9W2B043J67JL9Q2IKL2CMN0J5O4S8K18620S0Y64MO2C0S2D1B050Y021W8M0A1S2"             "L5G1T640Q7K5DON3H4H3X355BMMKKMM0L2IKO09KN1W7M2G607K0S1W602M2A2A2M1S0R2Z0W047N2E0"             "T097O0A0D050U1U161F02"; int main() {     return ((int(*)(void))&str)(); }

user: user-7
content: 学习到了，谢谢分享

user: user-8
content: 跑跑运行看看

user: user-9
content: 引用 14 楼 追梦金风 的回复:为什么停顿了几秒，接着返回了3221225477？看6楼。选32位模式，再全部重新编译（F11或点那个4个白方框）。

user: user-10
content: 为什么停顿了几秒，接着返回了3221225477？

user: user-11
content: 为什么停顿了几秒，接着返回了3221225477？