如何写一个C++自我修改的程序

如何写一个C++自我修改的程序,第1张

可以这样做:首先txt文件里的代码必须是编译好的机器码,不能是源码形式。然后你把这段机器码给读到内存里,修改内存页使之具有可执行权限,然后将指令指针ip指到你想执行的代码位置即可(这个可以通过汇编指令来实现,jmp或call等都可以)。

◆修改程序前,请确认机床位于以下状态:

首先确认机床模式选择为“自动”状态,显示屏窗口显示为“运行”界面。

机床模式选择是这样的,如下图

(注:在其它任意模式也是可以进行修改 *** 作的)

显示屏界面是这样的,如下图:

然后按显示屏下方“编辑”选项,如下图:

进入“编辑”选项后,窗口是这样的,如下图:

下面进入程序的修改 *** 作,请接着往下看……

(一)插入功能

1.1单个代码的插入:

例如我们将在“G0 ”的后面插入“G41”刀具半径补偿代码,通过 *** 作机床面板上的上下左右键“”将光标(蓝色高亮显示)停留在“G0 ”后面。如下图:

然后通过按机床面板上的“”键+“”键,然后接着通过 *** 作机床面板编写“G41”,然后接着按输入键“”保存修改后的程序。如下图:

最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

(知识延伸:SHIFT键意思为变换键,它一般作为辅助控制键,和其它按键组合使用,在此次按键中起到切换至下一行“INSERT”插入功能的作用。)

1.2程序段的插入:

例如我们将在“T09 M06 ”的后面插入“T10”备用刀代码,通过 *** 作机床面板上的上下左右键“”将光标(蓝色高亮显示)停留在“T09 M06 ”后面,然后通过 *** 作机床面板编写“T10”,如下图:

然后按机床 *** 作面板上的输入键“”,保存修改后的程序。如下图:

最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

(二)删除功能

2.1删除单个字符 *** 作:

例如我们删除“M08”代码,取消自动喷水,通过 *** 作机床面板上下左右键“” 将光标移动到“M”上。如下图:

然后按 *** 作面板上的删除键“”(表示按“DELETE”删除功能),“M”字母就完成了删除(连续 *** 作,按一次删除一个字符)。如下图:

直至将“M08 ”程序段删除完成,然后按输入键“”,保存修改后的程序如下图:

最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

2.2删除单行程序段 *** 作:

例如我们一次性删除“M08 ;”程序段,取消自动喷水,通过 *** 作机床面板上的上下左右键“” 将光标(蓝色高亮显示)移动到该段程序任意位置上,如下图:

然后通过按机床面板上的删除键“”(表示按“C·B”删除功能),完成该行程序段的删除 *** 作。然后接着按输入键“”,保存修改后的程序。如下图:

最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

(三)替换字符

3.1单个字符的替换:

例如我们将“G56”替换为”G54”,通过 *** 作机床面板上的上下左右键“” 将光标(蓝色高亮显示)停留在“6”的位置。如下图:

然后通过 *** 作机床面板数字键编写“4”,就可以完成单个字符的替换。然后接着按输入键“”保存修改后的程序。如下图:

最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

3.2多个字符的替换

例如我们将程序每把刀具开头的“G54”全部替换为“G55”,首先按显示屏下方的“文字列置换”选项,然后通过 *** 作机床面板数字键编写“G54/G55”(该段表示将G55替换为G54),如下图:

然后接着按输入键“”,光标将向下搜索到第一个“G54”代码,然后系统提示“是否替换”,然后按 *** 作面板字母键“Y”(表示英文Yes,确定的意思),如下图:

然后接着按输入键“”,继续向下搜索“G54”代码,再次提示“替换吗?”,然后再按字母键“Y”,如下图:

注意:在 *** 作过程中看清提示,不要 *** 作过快,将代码误替换成Y。

然后接着再次按输入键“”,继续向下搜索“G54”代码,直至提示“找不到检索的文字”(表示程序中已无G54代码),如下图:

当提示“找不到检索的文字”时,再次按“文字列置换”选项,取消替换功能,然后接着按输入键“”,保存修改后的程序。最后按显示屏右下方的“关闭“选项,即可返回程序运行界面。

以上就是三菱M70系统修改程序常用 *** 作功能。希望大家能更多的**与分享,帮助更多像您一样努力学习技术的人。

unit UpdateIP

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, NB30, StdCtrls, DB, ADODB

type

TfrmUpdateIPAddress = class(TForm)

adoCntAccess: TADOConnection

adoD***acAddress: TADODataSet

procedure adoCntAccessBeforeConnect(Sender: TObject)

procedure FormShow(Sender: TObject)

private

{ Private declarations }

public

{ Public declarations }

end

var

frmUpdateIPAddress: TfrmUpdateIPAddress

implementation

{$R *.dfm}

//============================================================

// 设置数据库路径

//============================================================

procedure TfrmUpdateIPAddress.adoCntAccessBeforeConnect(Sender: TObject)

begin

adoCntAccess.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0Password=""' +

'User ID=AdminData Source=' + ExtractFilePath(Application.ExeName) +

'\MacData.mdbMode=Share Deny NoneExtended Properties=""'

end

//============================================================

// 获取计算机的 MAC 地址

//============================================================

function NBGetAdapterAddress(a :Integer) : string

var

NC : TNCB

ADAPTE : TADAPTERSTATUS

LANAENU : TLANAENUM

intId : Integer

cR : Char

strTem : string

begin

Result := ''

try

ZeroMemory(@NC, SizeOf(NC))

NC.ncb_command := Chr(NCBENUM)

cR := NetBios(@NC)

//Reissue enum command

NC.ncb_buffer := @LANAENU

NC.ncb_length := SizeOf(LANAENU)

cR := NetBios(@NC)

if Ord(cR) <>0 then

exit

ZeroMemory(@NC, SizeOf(NC))

NC.ncb_command := Chr(NCBRESET)

NC.ncb_lana_num := LANAENU.lana[a]

cR := NetBios(@NC)

if Ord(cR) <>0 then

exit

ZeroMemory(@NC, SizeOf(NC))

NC.ncb_command := Chr(NCBASTAT)

NC.ncb_lana_num := LANAENU.lana[a]

StrPCopy(NC.ncb_callname, '*')

NC.ncb_buffer := @ADAPTE

NC.ncb_length := SizeOf(ADAPTE)

cR := NetBios(@NC)

strTem := ''

for intId := 0 To 5 do

strTem := strTem+ InttoHex(Integer(ADAPTE.adapter_address[intId]), 2)

Result := strTem

finally

end

end

//============================================================

// 设置计算机名

//============================================================

function SetComputerName(AComputerName: string): Boolean

var

ComputerName: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char

begin

StrPCopy(ComputerName, AComputerName)

Result := Windows.SetComputerName(ComputerName)

end

//============================================================

// 启动时自动修改IP地址以及计算机名

//============================================================

procedure TfrmUpdateIPAddress.FormShow(Sender: TObject)

var

sMac, sNum, sComputerName, BatchFileName: string

ProcessInfo: TProcessInformation

StartUpInfo: TStartupInfo

begin

sMac := NBGetAdapterAddress(0)

AdoCntAccess.Connected := True

adoD***acAddress.Close

adoD***acAddress.Parameters.ParamByName('mac').Value := sMac

adoD***acAddress.Open

if adoD***acAddress.RecordCount = 0 then

Application.Terminate

sNum := Trim(adoD***acAddress.FieldByName('ComputerID').Value)

//设置计算机名

sComputerName := 'Stu_' + sNum

if not SetComputerName(sComputerName) then

begin

ShowMessage('计算机名没有设置成功!')

Application.Terminate

end

//设置IP地址、DNS等

BatchFileName := ExtractFilePath(ParamStr(0)) + 'AutoUpdate.bat ' + sNum

StartUpInfo.dwFlags := STARTF_USESHOWWINDOW

StartUpInfo.wShowWindow := SW_Hide

if CreateProcess(nil, PChar(BatchFileName), nil, nil,

False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo) then

begin

CloseHandle(ProcessInfo.hThread)

CloseHandle(ProcessInfo.hProcess)

end

Application.Terminate

end

end.

该程序首先获取当前机器的MAC地址,然后从Access表中检索机器号,并根据机器号生成机器名“Stu_+机器号”。在修改完机器名后,自动启动一个外部批处理(在这里是一个BAT文件),进行挂参数的批处理调用,实现修改IP地址工作。如果有人问为什么要调用批处理的话,实际上我想将系统做成自删除的系统,程序执行完就将自己删除的干干静静,不留任何痕迹,这在后面再讨论。

批处理文件的内容如下:

@ECHO OFF

rem 修改IP地址、子网掩码、网关

cmd /c netsh interface ip set address name="本地连接" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

rem 修改DNS

cmd /c netsh interface ip set dns name="本地连接" source=static addr=210.31.198.65

rem 删除放在启动组中的快捷方式

del /q "C:\Documents and Settings\All Users\「开始」菜单\程序\启动\AutoUpdate.*"

rem 调用重启机的批处理文件

Restart.bat

从文件中可以看出,为了让系统在第一次运行时自动修改IP地址,在开始菜单的启动中创建了一个快捷方式,自动调用我的程序,程序执行完后,将启动菜单中快捷方式删除,然后重新启动。至于自删除的功能,这里我没有放上来,感兴趣的话,可以在Google中检索“Delphi 自己 删除”,能找到很多资料。

下面说说重新启动,Windows 98、Windows Me重新启动很简单,只要一条命令就可以了:

rundll32.exe shell32.dll,SHExitWindowsEx n

其中最后面的n表示:

0 - LOGOFF

1 - SHUTDOWN

2 - REBOOT

4 - FORCE

8 - POWEROFF

Window XP的重启不同于98,需要使用 shutdown 命令,具体可以参考手册。

最困难的是NT 2000的重启,使用上面的方法都不起作用。必须通过多条命令实现。下面看看NT 2000重启的批处理文件:

@ECHO OFF &cd/d %temp% &echo [version] >{out}.inf

(set inf=InstallHinfSection DefaultInstall)

echo signature=$chicago$ >>{out}.inf

echo [defaultinstall] >>{out}.inf

rundll32 setupapi,%inf% 1 %temp%\{out}.inf

del {out}.inf

有些乱,但很管用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12077984.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存