第二个程序修改第一个程序(50分)

C

cnbobo

Unregistered / Unconfirmed
GUEST, unregistred user!
我的第一个程序的FROM1里的有一个EDIT1.TEXT:='浙江省'.(打开FROM时显示的默认值)<br>现在能不能不编译这程序,在另外写个程序来改变这个值.<br>这样做难不难?请大家说的详细一点!最好有源程序!<br>谢谢!!!!!
 
用exescope打开资源进行修改,或用Hex WorkShop进行修改
 
我想的是要用DELPHI自已写程序来完成这个工作.
 
运行时改变:<br><br>获得 Edit1 的窗口句柄,然后用postMessage 向它发送 WM_SETTEXT &nbsp;消息进行修改<br><br>EXE文件修改:用资源修改程序进行修改。<br><br>
 
同意jsxjd的意见<br>你可以获取它的句柄,但是也不是修改哟~
 
自己编程序长期修改的话要获取那个地址,以及长度,然后祛替换。
 
我怎么样才能获得 Edit1 的窗口句柄,然后在用postMessage 向它发送 WM_SETTEXT &nbsp;消息进行修改<br>在这方面我懂,如方便的话能否举个例子.
 
PostMessage(H, WM_SETTEXT, 0,Integer(PChar('你要设置的值')));<br><br>H为句柄,如果是窗体的用findwindow,若是窗体内的控件,用findwindowEx<br>参考一下win32Api大全
 
第二个文件读第一个文件(二进制),查到“浙江省”这6个字节,改成你要的东东。<br>保存。<br><br>这样做有以下局限:<br>1。第一个程序“浙江省”只出现一次。<br>2。要改成的字符也必须是6个字节。<br>3。第一个程序没有经过对exe文件的压缩。(如用aspack,usp之类的)
 
用UltraEdit之类的或是WinHex编辑一下就行了,用VC也行!很多方法的!<br>打开后搜索浙江省然后改改就行了!
 
难是难,不过碰见我算你幸运。~~~~~~[8D]~~~~~~别忘了给分<br>这是一个程序见传递参数的问题,共有三种方法可以实现,如下<br><br>利用WM_COPYDATA消息<br><br>使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:<br>dwData 是一个32位的附加参数<br>cbData 表示要传递的数据区的大小<br>lpData 表示要传递的数据区的指针<br><br>下面举个例子。该例子由两个程序构成,分别为SendData和GetData。<br><br>SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。<br><br>SendData程序:<br>……<br><br>var<br>Form1: TForm1;<br>implementation<br>{$R *.DFM}<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>ds: TCopyDataStruct;<br>hd: THandle;<br>begin<br>ds.cbData := Length (Edit1.Text) + 1;<br>GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存<br>StrCopy (ds.lpData, PChar (Edit1.Text));<br>Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄<br>if Hd &lt;&gt; 0 then<br>SendMessage (Hd, WM_COPYDATA, Handle,<br>Cardinal(@ds)) // 发送WM_COPYDATA消息<br>else<br>ShowMessage ('目标窗口没找到!');<br>FreeMem (ds.lpData); //释放资源<br>end;<br><br>GetData程序:<br><br>TForm2 = class(TForm)<br>Edit1: TEdit;<br>private<br>{ Private declarations }<br>public<br>procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;<br>{ Public declarations }<br>end;<br><br>var<br>Form2: TForm2;<br>implementation<br>procedure TForm2.Mymessage(var t:TWmCopyData);<br>begin<br>Edit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。<br>end;<br><br>使用这种方法是WIN32应用程序进行交互的最简单的方法。<br><br>使用全局原子<br>Win32系统中,为了实现信息共享,系统维护了一张全局原子表。每个原子中存放了一些共享数据。关于对原子的操作,有一组专门的API函数:<br><br>GlobalAddAtom 在表中增加全局原子<br>GlobalDeleteAtom 在表中删除全局原子<br>GlobalFindAtom 在表中搜索全局原子<br>GlobalGetAtomName 从表中获取全局原子<br><br>笔者用这种方法实现了避免程序二次启动,但把第二次启动所带的参数传到第一个实例中以进行相应的处理的程序。基本处理如下:<br><br>在工程文件中:<br><br>program Pvdde;<br>uses<br>Forms,shellapi,Windows,dialogs,dde in 'dde.pas' {Form1};<br>{$R *.RES}<br>begin<br>if GlobalFindAtom(PChar('PDDE_IS_RUNNING')) = 0 then<br>//避免二次启动<br>begin<br>K:=GlobalAddAtom(PChar('PDDE_IS_RUNNING'));<br>Application.Initialize;<br>Application.CreateForm(TForm1, Form1);<br>Application.Run;<br>end<br>else<br>begin<br><br>//传递二次启动时的参数到第一个实例<br><br>H := FindWindow(PChar('TForm1'), PChar('资料保密 严禁外传'));<br>if ParamCount &gt; 0 then<br>begin<br>L := GlobalAddAtom(PChar(ParamStr(1)));<br>if H&lt;&gt;0 then<br>SendMessage(H, WM_MYMESSAGE, 0, L);<br>{ 传递原子句柄 }<br>GlobalDeleteAtom(L); { 使用后释放 }<br>end;<br><br>Application.Terminate;<br>end;<br>end.<br><br>在相应的窗口单元dde.pas增加对自定义消息WM_MYMESSAGE的处理:<br><br>procedure TForm1.MyMessage(var T:TMessage);<br>{对 WM_MYMESSAGE消息进行处理 }<br>var<br>P:Array [0..255] of char;<br>begin<br>GlobalGetAtomName(T.LParam, P,255); { 接受数据到p数组中 }<br>。。。<br><br>end;<br><br>使用存储映象文件<br>这种方法相对较复杂一些。<br><br>当Win95与Winows Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或DLL文件)时,它们实际可以在内存中共享其执行代码。<br><br>笔者通过调用一个带有特殊参数的CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。<br><br>HANDLE CreateFileMapping(<br>HANDLE hFile, //文件句柄<br>LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可选安全属性<br>DWORD flProtect, // 映象文件保护方式<br>DWORD dwMaximumSizeHigh, // 映象文件区域的底值<br>DWORD dwMaximumSizeLow, // 映象文件区域的顶值<br>LPCTSTR lpName // 映象文件的名字<br>);<br><br>如果hFile是0xFFFFFFFF,在调用程序中必须指定dwMaximumSizeHigh 和dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。<br><br>在建立了映象文件之后,我们可以通过调用另外一个API函数MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。<br><br>LPVOID MapViewOfFile(<br>HANDLE hFileMappingObject, // 映象文件句柄<br>DWORD dwDesiredAccess, // 访问方式<br>DWORD dwFileOffsetHigh, // 映象文件区域的底值<br>DWORD dwFileOffsetLow, // 映象文件区域的顶值<br>DWORD dwNumberOfBytesToMap // 映射字节数<br>);<br><br>如果 dwNumberOfBytesToMap 是0,映射整个文件。以下举例说明:<br><br>private<br>hMapFile: THandle;<br>MapFilePointer: Pointer;<br>public<br>{ Public declarations }<br>end;<br>var<br>Form1: TForm1;<br>implementation<br>{$R *.DFM}<br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>hMapFile := CreateFileMapping (<br>$FFFFFFFF, // 特殊内存映射句柄<br>nil, page_ReadWrite, 0,10000,<br>'DdhDemoMappedFile'); // 文件名<br>if hMapFile &lt;&gt; 0 then<br>MapFilePointer := MapViewOfFile (<br>hMapFile, // 上面映象文件的句柄<br>File_Map_All_Access,<br>0, 0, 0) // 访问整个映象文件<br>else<br>ShowMessage ('hMapFile = 0');<br>if MapFilePointer = nil then<br>ShowMessage ('MapFilePointer = nil');<br>end;<br><br>procedure TForm1.BtnWriteClick(Sender: TObject);<br>begin<br>StrCopy (PChar (MapFilePointer),<br>PChar (EditWrite.Text));//把内容写入共享内存<br>end;<br><br>procedure TForm1.BtnReadClick(Sender: TObject);<br>var<br>S: string;<br>begin<br>S := PChar (MapFilePointer);//从共享内存读出内容<br>EditRead.Text := S;<br>end;<br><br>用这种方法,不但可以在不同的程序之间共享数据,还可以在同一程序的不同实例间共享数据。为了及时通知其它进程共享数据的变化,可以自定义一条用户消息,通过发消息来实现,这里不再赘述。<br>
 
先通过findwindow要修改的主窗口,再通过enumchildwindows枚举子窗口(即edit1的句柄)<br>得到edit1的句柄后,调用setwindowtext就可以修改了edit1的值了。<br>api用法,参考win32 sdk。
 
to: weichao9999<br>谢谢你。<br>也许是我没说清楚,我想的是第一程序的EDIT1里有个默认值,也就是窗口打开EDIT1:=123<br>现在是要用第二程序改变这个值,让第一个程序以后运行时的都是EDIT1:=456;不是在程序<br>运行中去改变。<br>但我还是要谢谢你!在帮帮我!!!
 
那你就要通过修改文件的方法来实现,先通过Ultraedit之类的软件找到你要修改的字段 在文件<br>中的偏移,通过程序修改那个值,就OK了。
 
很容易:<br>用记事本(NotePad)打开Form1的.dfm或者.~dfm文件,找到Edit1的Text='浙江省',直接修改就行了,如果你想编一个程序专门用于此目的,也不难,但我认为没有必要,因为这本身在Delphi IDE下是很容易作的事情
 
to chuguozhen<br>我改的是一个程序(EXE),只有一个EXE文件,没有.dfm或者.~dfm文件。
 
只能修改EXE文件的方法,关键是找对偏移。
 
将第一个文件编译成exe,然后记住该文件大小。将EDIT1.TEXT的内容填入exe文件的结尾部分,<br>程序照样能运行。<br>当然form1.create 中要读取原来文件大小后面的文本部分,然后填入EDIT1.TEXT<br>现在很多木马都用这个原理<br>利用这个原理应该能实现你想要的功能。
 
好方法!!!!
 
始终关注<br>
 
顶部