程序的自我修改

逆向入门,一个变形程序的逆向过程。 记录教程的课后作业心路。 要求去掉该程序的nag窗口。 先运行一遍查看情况。 首先试试最简单的办法,字符串查找大法。 很简单就找到了我们想要的字符串。 就在开始的下面,直接上断点爆破试试。 但是在单步调试的时候,发现出现nag窗口时,程序并没有经过这个函数。 **就知道没这么容易,这个字符串就是个幌子而已。 ** 那我就试试,查看它调用了哪些函数吧,但是下了断点却报错了。 只好慢慢来了... 阅读详情

 程序的自我修改收藏

本文目的在于向读者说明程序进行自我修改的基本方法,并希望可以起到抛砖引玉的作用。 如果读者有更好的方法或见解,欢迎来信交流E-mail: default_and_default@yahoo.cn /*////////////////////////////////////////////////////////////////////////////// This program will modify itself at the running time, These  methods will be very useful in some situations, Gook Luck! //////////////////////////////////////////////////////////////////////////////*/ #include<stdio.h> #include<windows.h> void main() {   TCHAR Info001[MAX_PATH]="Welcome to Big Apple!";   TCHAR Info002[MAX_PATH]="Welcome to Washington!";   char temp=(char)0x90;   WORD temp001=0x9090;   DWORD temp002=0x90909090;   PVOID BaseAddressOne=NULL;   PVOID BaseAddressTwo=NULL;   _asm   {     mov BaseAddressOne,offset LabelOne     mov BaseAddressTwo,offset LabelTwo   }   MessageBox(NULL,Info001,"Information",MB_OK|MB_ICONINFORMATION); //a kind of method to modify itself   WriteProcessMemory(GetCurrentProcess(),BaseAddressTwo,&temp001,2,NULL);   WriteProcessMemory(GetCurrentProcess(),BaseAddressOne,&temp001,2,NULL); /* //Another method to modify itself,this method needs to modify the code section's //characteristics in PE file.   _asm   {     mov ebx,BaseAddressOne     mov ecx,BaseAddressTwo     mov dx,temp001     mov [ebx],dx     mov [ecx],dx   } */ LabelTwo:   _asm   {     jmp LabelOne   }   _asm   {     nop     nop     nop   }   MessageBox(NULL,Info002,"Information",MB_OK|MB_ICONINFORMATION); LabelOne:   _asm   {     jmp Over   }   MessageBox(NULL,Info002,"Information",MB_OK|MB_ICONINFORMATION); Over:   return; } 编译这个程序,我们发现WriteProcessMemory() 成功修改了程序自身代码,程序运行正常。 然后我们屏蔽程序中的WriteProcessMemory()调用,用/*  */之中的代码完成自我修改, 运行后会发现系统抛出异常 Access Violation.这是因为PE 中 代码节的属性默认为 0x60000020, 20 表示代码 20000000表示可执行,40000000表示可读,如果我们在此基础上加上 0x80000000(可写) 操作系统的loader在装载可执行文件时,便会将存放代码节数据的内存标记为可读,可写,可执行。 这样就不会有异常了。 读者可使用下面的程序来修改节属性: /**************************************************************************************/ //The following code is used to modify characteristics of sections #include<windows.h> #include<stdio.h> BOOL ModifyCharacteristicsOfSections (LPCTSTR FileName) {   DWORD i=0;   HANDLE hDestinationFile=NULL;   TCHAR  DestinationPEFile[MAX_PATH];   DWORD NumberOfBytesRead=0;   //Number of bytes read   DWORD NumberOfBytesWritten=0; //Number of bytes written   DWORD ImageNtSignature=0;  //PE signature   DWORD OffsetOfNewHeader=0;   DWORD NumberOfSections=0;   DWORD SizeOfSectionTable=0;           //size of section table      HANDLE hGlobalAllocatedMemory=NULL;  //use GlobalAlloc();      PIMAGE_SECTION_HEADER pImageSectionHeader=NULL; //a pointer to IMAGE_SECTION_TABLE   IMAGE_DOS_HEADER ImageDosHeader;   IMAGE_NT_HEADERS ImageNTHeaders;   IMAGE_FILE_HEADER ImageFileHeader;      IMAGE_OPTIONAL_HEADER ImageOptionalHeader;   IMAGE_SECTION_HEADER ImageSectionHeader;   DWORD dwFileSize=0;   RtlZeroMemory(&ImageDosHeader,sizeof(IMAGE_DOS_HEADER));   RtlZeroMemory(&ImageNTHeaders,sizeof(IMAGE_NT_HEADERS));   RtlZeroMemory(&ImageFileHeader,sizeof(IMAGE_FILE_HEADER));      RtlZeroMemory(&ImageOptionalHeader,sizeof(IMAGE_OPTIONAL_HEADER));   RtlZeroMemory(&ImageSectionHeader,sizeof(IMAGE_SECTION_HEADER));      strcpy(DestinationPEFile,FileName);   hDestinationFile=CreateFile(DestinationPEFile,     FILE_WRITE_DATA|FILE_READ_DATA,     FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);      if(hDestinationFile==INVALID_HANDLE_VALUE)   { //    printf("/nCreateFile() fails!Can't open file. Please try again!/n"); //    CloseHandle(hDestinationFile);     return TRUE;   }   else   {     dwFileSize=GetFileSize(hDestinationFile,NULL);   }   SetFilePointer(hDestinationFile,0,NULL,FILE_BEGIN); //Revert the file pointer,this is very important.      ReadFile(hDestinationFile,&ImageDosHeader,     sizeof(IMAGE_DOS_HEADER),&NumberOfBytesRead,NULL);   if(NumberOfBytesRead!=sizeof(IMAGE_DOS_HEADER))   { //    printf("/nReadFile() fails! Can't get IMAGE_DOS_HEADER./n");     CloseHandle(hDestinationFile);     return FALSE;   }      OffsetOfNewHeader=ImageDosHeader.e_lfanew; //File address of new exe header      SetFilePointer(hDestinationFile,(LONG)OffsetOfNewHeader,NULL,FILE_BEGIN);      ReadFile(hDestinationFile,&ImageNTHeaders,     sizeof(IMAGE_NT_HEADERS),&NumberOfBytesRead,NULL); //Retrieve IMAGE_NT_HEADERS   if(NumberOfBytesRead!=sizeof(IMAGE_NT_HEADERS))   {     CloseHandle(hDestinationFile);     return FALSE;   }   if(ImageNTHeaders.Signature!=0x00004550)   { //    printf("Error./nPE signature is invalid!/n");     CloseHandle(hDestinationFile);     return FALSE;   }         SetFilePointer(hDestinationFile,OffsetOfNewHeader+4,NULL,FILE_BEGIN);  //Set the file pointer to point to IMAGE_FILE_HEADER   ReadFile(hDestinationFile,&ImageFileHeader,     sizeof(IMAGE_FILE_HEADER),&NumberOfBytesRead,NULL); //Retrieve IMAGE_FILE_HEADER   if(NumberOfBytesRead!=sizeof(IMAGE_FILE_HEADER))   { //    printf("/nReadFile() fails! Can't get IMAGE_FILE_HEADER./n");     CloseHandle(hDestinationFile);     return FALSE;   }   if(ImageFileHeader.NumberOfSections<1)   {     CloseHandle(hDestinationFile);     return FALSE;   }      if(dwFileSize<(sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ImageFileHeader.NumberOfSections))   {     CloseHandle(hDestinationFile);     return FALSE;   }   ReadFile(hDestinationFile,&ImageOptionalHeader,     sizeof(IMAGE_OPTIONAL_HEADER),&NumberOfBytesRead,NULL); //Retrieve IMAGE_OPTIONAL_HEADER   if(NumberOfBytesRead!=sizeof(IMAGE_OPTIONAL_HEADER))   { //    printf("/nReadFile() fails! Can't get IMAGE_OPTIONAL_HEADER./n");     CloseHandle(hDestinationFile);     return FALSE;   }   if(ImageOptionalHeader.SectionAlignment<ImageOptionalHeader.FileAlignment)   {     CloseHandle(hDestinationFile);     return FALSE;   }   NumberOfSections=ImageFileHeader.NumberOfSections; //Number of sections   SizeOfSectionTable=sizeof(IMAGE_SECTION_HEADER)*NumberOfSections; //Get the size of Section Table      hGlobalAllocatedMemory=GlobalAlloc(GPTR,SizeOfSectionTable);      //Allocate memory and initialize with zero   if(hGlobalAllocatedMemory==NULL)   { //    printf("/nGlobalAlloc() failed! Please try again./n"); //if failed,return     CloseHandle(hDestinationFile);     return FALSE;   }           pImageSectionHeader=(PIMAGE_SECTION_HEADER)hGlobalAllocatedMemory; //Convert a handle to a pointer to IMAGE_SECTION_HEADER      for(i=0;i<NumberOfSections;i++)  //Retrieve the Section Table   {     ReadFile(hDestinationFile,pImageSectionHeader+i,       sizeof(IMAGE_SECTION_HEADER),&NumberOfBytesRead,NULL);     if(NumberOfBytesRead!=sizeof(IMAGE_SECTION_HEADER))     { //      printf("Error.Can't get IMAGE_SECTION_HEADER./n");       CloseHandle(hDestinationFile);       return FALSE;     }   }   for(i=0;i<NumberOfSections;i++)   {     DWORD dwTempCharacteristics=0;     if((*(pImageSectionHeader+i)).PointerToRawData+(*(pImageSectionHeader+i)).SizeOfRawData>dwFileSize)     {       CloseHandle(hDestinationFile);       return FALSE;     }     if((*(pImageSectionHeader+i)).PointerToRawData % ImageOptionalHeader.FileAlignment!=0)     {       CloseHandle(hDestinationFile);       return FALSE;     }     printf("/nThe name of the section%d: ",i);     printf("%s/n",(*(pImageSectionHeader+i)).Name);          printf("Characteristics: %#x/n",(*(pImageSectionHeader+i)).Characteristics);     printf("/nPlease input the new characteristics of the section./n");     printf("If you enter 0,the characteristics of the section will not be modified./n");     scanf("%x",&dwTempCharacteristics);     if(dwTempCharacteristics!=0)       (*(pImageSectionHeader+i)).Characteristics=dwTempCharacteristics;       printf("------------------------------------------------------");   }   SetFilePointer(hDestinationFile,-((long)SizeOfSectionTable),NULL,FILE_CURRENT); //Set the file poiner   WriteFile(hDestinationFile,pImageSectionHeader,SizeOfSectionTable,&NumberOfBytesWritten,NULL);   if(NumberOfBytesWritten==SizeOfSectionTable)   {     printf("/nComplete successfully!/n");   }   else   {        printf("/nWriteFile() failed!/n");   }   GlobalFree(hGlobalAllocatedMemory); //Free memory   CloseHandle(hDestinationFile);   return TRUE;     } void main(int argc,char *argv[]) {   if(argc!=2)   {     printf("Error/nUsage:ModifyCharacteristicsOfSections CompleteDestinationFileName/n");     return;   }   if(!ModifyCharacteristicsOfSections(argv[1]))   {     printf("/nError.This usually means that this file is not a valid PE file or/n");     printf("that this PE file has been modified by another program,for example,shell programm./n");   } } /**********************************************************************************************/ 以下是上面程序的输出信息: The name of the section0: .text Characteristics: 0x60000020 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. e0000020 ------------------------------------------------------ The name of the section1: .rdata Characteristics: 0x40000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section2: .data Characteristics: 0xc0000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section3: .idata Characteristics: 0xc0000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section4: .reloc Characteristics: 0x42000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ Complete successfully! //////////////////////////////////////////////////////////////////////////// The name of the section0: .text Characteristics: 0xe0000020 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section1: .rdata Characteristics: 0x40000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section2: .data Characteristics: 0xc0000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section3: .idata Characteristics: 0xc0000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ The name of the section4: .reloc Characteristics: 0x42000040 Please input the new characteristics of the section. If you enter 0,the characteristics of the section will not be modified. 0 ------------------------------------------------------ Complete successfully!
echarts实现折线图上下限区域展示 效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、 阅读详情

相关推荐

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

程序删除自己,改写自己

用C/C++编程,实现删除自己改写自己

lichao17909的博客 1473

开关电源EMC整改实录:用WSX系列共模电感搞定30MHz辐射超标

本文详细介绍了开关电源EMC整改实战,通过WSX系列共模电感成功解决30MHz频段辐射超标问题。文章分析了共模干扰的产生机制,对比了不同磁芯材料的性能差异,并提供了电路布局优化与安装技巧,最终通过实测数据验证了整改方案的有效性。

weixin_29305313的博客 415

让程序修改自己

今天读了Paul Graham的文章《书呆子的复仇》(节选自《***与画家》),作者详细列举了Lisp语言的优势。这是我第一次接触Lisp,原来Lisp语言可以写一个能编程序的程序?太酷了!这不正是我以前经常想的问题吗——为什么程序不能修改自己呢? 因为程序只能修改数据,不能直接修改自己。所以我那时构想了一种用数据来表示程序语句的方法,大致上是可以用有限状态机来实现的。我觉...

weixin_33737774的博客 397

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.youkuaiyun.com/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

eLabRadio软件无线电虚实结合仿真开发平台简介

在使用仿真平台时,不要关闭设备或断开设备与PC机之间的网络连接,否则,仿真平台将无法正常工作。注:采用eNodeX设备认证方式,当出现“设备不存在”的报错时,请检查计算机IP是否和硬件设备IP处于同一网段,或者是否是先连接好网线,再开启硬件设备的。①此登录方式下,需要先建立软件与硬件的通信:在登录窗口点击【网络配置】,参照下图输入设备IP,服务器地址无需设置,设置完成后点击确认,此时登录界面无需设置账号密码;,拷贝到电脑上,使用管理员权限运行setup.exe,下一步直到安装完成,桌面会生成快捷方式。

weixin_55349105的博客 6320

计算机科学导论实验(二)

计算机科学导论实验 ——存储程序式计算机的简单程序设计 文章目录计算机科学导论实验——存储程序式计算机的简单程序设计前言一、实验目的二、实验内容1.使用Vcomputer存储程序式计算机仿真软件,编写机器代码程序2.验证、理解,并能设计一个包含“溢出”和程序自修改的简单机器代码程序。三、实验总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、实验目的 1、理解自然语言与形式语言的区别。 2、理解机器指令和汇编指令的基本概念和功能。 3、观察机器指令程序和汇编指令程序的执行并解释程序的含义

young的博客 8991

IMEI引起的无法驻网问题

问题不复杂,场景很简单,如上图,UE在进行LTE attach过程时,在送完NAS security mode complete后,就立刻收到了网络attach reject 带cause 6 Illegal ME,根据协议描述这个cause 代表ME不被网络可接受,例如ME在禁止名单或者黑名单中就会有这种cause。然而前方在报这个问题的时候,也是知道SIM卡和手机IMEI在运营商那边没能成功绑定,然后才报的问题,要查看手机是不是有问题...... 告诉前方原因后,还认为是手机问题,告知要继续查。

asd199086的博客 1426

程序自修改(SMC)

理论:所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解 密,从而正常运行程序和访问数据。本篇通过一个简单的实例来介绍这个技术。需要的运行环境vc6,程序编译为release版。由于本篇我们要在程序执行过程中,修改代码段中的一个函数内容,而默认情况下,我们编译生成

jia_xiaoxin的专栏 3647

VS code 调试显示preLaunchTask“g++“已终止,退出代码为-1。 生成‘... .exe‘文件错误

总结: 以后每个工程都需要按照这样的流程:创建一个.c/.cpp文件 -> F5运行 -> 配置tasks.json文件-> launch.json文件 -> 运行

qq_45151652的博客 2517

通信算法之264: DJI O2 协议物理层逆向工程解析

对于 DroneID,标志之间的间隙由循环前缀 (CP) 填充:每个标志末尾的副本附加在相应标志的开头。有了关于确切标志开始的信息,可以使用 FFT 将标志转移到频域 - 来自时域的 1024 个样本导致频域中的 1024 个子载波。使用比特流的解扰和涡轮解码,并将生成的数据映射到如上的DroneID 结构,通过逆向工程在无人机的固件中找到了它。注意到一些无人机(Mavic 2 和更早的 OcuSync 无人机)不发送第一个标志(标志 1),这导致更短的帧持续时间为 576 µs。//产品型号数字代号。

leegang12的专栏 3948

程序的自我修改收藏

本文目的在于向读者说明程序进行自我修改的基本方法,并希望可以起到抛砖引玉的作用。如果读者有更好的方法或见解,欢迎来信交流E-mail: default_and_default@yahoo.cn/*//////////////////////////////////////////////////////////////////////////////This pro

大浪淘沙的专栏 941

华为OD机试真题 新系统 - 勇攀数字高峰 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2098

程序员自我修改之读书学习

程序员的读书历程:x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅

寒风的技术博客 2208

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

实现可自我修改的Go程序 | Gopher Daily (2022.01.31) ʕ◔ϖ◔ʔ

每日一谚:When Go eschewed the popular exception model of errors, it made a statement that error ha...

TonyBai 200

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从自修改代码到递归自举:程序如何实现“自我认知”?

在计算机科学中,自指与递归是理解程序如何操作自身的关键概念。冯·诺依曼架构将代码与数据等同存储于内存,为程序自修改提供了物理基础。这种能力在底层编程中可实现代码的动态改写,例如通过汇编指令直接覆盖内存中的指令流,从而让程序具备影响自身与他者执行状态的能力。自修改代码虽在特定场景(如代码生成、软件保护)中有其技术价值,但在现代工程实践中往往因可调试性、安全性及性能优化等问题而被视为禁忌。递归则提供了更结构化的自指方式,函数通过调用自身来分解问题,体现了计算过程中的自我映射。更进一步,编译器的自举过程展示了系统

weixin_31528001的博客 288

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

程序的自我改写

曾经,程序的自动改写是每个黑客必备的知识,因为这样可以有效的节约内存,下面是在现代的GNU/Linux 操作系统上实现的程序自我改写。列一下环境:speller@SHELL-LAB:~/code/c$ egrep "model name" /proc/cpuinfo | uniq -c      2 model name      : Pentium(R) Dual-Core  CPU     

海阔天空的专栏 478

linux修改代码段,自修改代码总是在Linux上出现分段错误

我找到了一篇有关自我修改代码的文章,并尝试做一些示例,但是我总是遇到分段错误。据我所了解,fas违反了内存权限。代码段是(r)ead /e(x)ecute,因此尝试将结果写入此错误。是否可以通过在运行时或之前更改内存许可来测试程序?我使用的是linux,示例是用GAS汇编编写的。.extern memcpy.section .datastring:.asciz "whatever"string_...

weixin_29189987的博客 406

一种实现人工智能程序自进化的概念原理

一种实现人工智能程序自进化的概念原理

qq_44995144的博客 139

Python自修改程序

Python自修改程序 属实无聊之举 修改内容:第一行注释的数字,每次运行+1并输出 参数修改:name.py num直接修改数字 例如:cmd运行1.py 55 代码: # 1 import os import sys n = '' if len(sys.argv) == 2: n = sys.argv[1] with open(sys.argv[0],'r',encoding = 'utf-8') as fp: s = fp.readlines() a = s[0][2:-1]

浪速之星的博客 762

程序的自动改写

<br />曾经,程序的自动改写是每个黑客必备的知识,因为这样可以有效的节约内存,下面是在现代的GNU/Linux 操作系统上实现的程序自我改写。<br />列一下环境:<br />speller@SHELL-LAB:~/code/c$ egrep "model name" /proc/cpuinfo | uniq -c<br />      2 model name      : Pentium(R) Dual-Core  CPU      E6300  @ 2.80GHz<br />speller@SH

软件安全 678

黄金岛斗地主游戏修改器

黄金岛斗地主游戏辅助程序 每天上下班都要做好长时间的公交车,在车上也没事干,就下了个“黄金岛斗地主”游戏来打发时间,这个游戏挺不错,界面比较华丽,带真人语方,并且还很智能,比如当农民的时候你出的牌另一个农民(电脑)不会管你。 我玩游戏一向都喜欢修改才过瘾,可是这个游戏有自我保护,可以防止游戏修改器修改,如果你使用游戏修改器修改它,那么它就会自动退出,本程序可以解除它的自我保护防...

weixin_30564785的博客 482
上一篇: 内核驱动主要数据结构
下一篇: 第三方二进制汇编代码在VC中的移植和应用
大浪淘沙1
博客等级 码龄19年 42粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值