如何修改已编译好的EXE内部函数?
想写一个 程序 打开后 先写入 要用的数据。然后确定后释放(或生成)一个 exe 这个exe包含 刚才写入的那个数据。
不要 带INI 的只单独的一个exe
也就是说 那个程序对 这个exe 有修改内部函数的功能。。
改如何做呢?怎么修改 那个 exe内部数据?
老大们 给个招把。。
前几天论坛不是一直在研究这个问题吗?还写在UDF了,去UDF区看一下。 额。。我去看看。。谢谢`{:face (356):} 我之前提过类似的问题,可以看看那些帖子。 本帖最后由 woeiwoei 于 2010-6-29 14:36 编辑
我之前提过类似的问题,可以看看那些帖子。
feicuiboy 发表于 2010-6-29 14:09 http://www.autoitx.com/images/common/back.gif
貌似你的的帖子也没解决?
论坛发的那个exe注入的,貌似只正对加载的文件。没看说明里有直接修改函数的操作啊?
我的思路和你的差不多,也是运行A程序 释放B程序。A程序算是B程序的修改器把。
但是B程序不带配置文件。那个A程序可以直接修改B程序特定的函数。
例如修改 B程序原有的 $url='www.baidu.com'为$url='www.google.com'.修改完毕后B程序自动保存被A程序更新的参数。。 帮帮我呀。给我点思路把。。{:face (52):} 帮帮忙呀。没人愿意伸出援手吗?{:face (396):} 用odby改{:face (456):} 等结果!!!!!!!!!!!!!!!! 回复 5# woeiwoei
我现在的采用的方法就是在程序中包含 AU3的编译文件,编译新文件并自杀原文件。可以做到,但是不是很喜欢这种方法,没能直接改写。
听高手讲改PE结构。。不过俺不会 本帖最后由 C.L 于 2010-6-30 08:02 编辑
回复 5# woeiwoei
例如修改 B程序原有的 $url='www.baidu.com'为$url='www.google.com'.修改完毕后B程序自动保存被A程序更新的参数。。
基本不大可能,代码编译后,这句赋值已经被编译器改成了机器代码,不大可能去改写
不过,应该有变通的方法
1、把B中在把某个特定的地址用来存放数据作为$url的值,每次B程序从这个特定的地址中读取数据,A程序释放出B程序后,先按需要更改B程序这个特定地址的内容,然后运行B程序。
exe注入的那个UDF是支持读写外部文件的。
2、在b中建立一个内部的ini格式的文件(注意,这个ini是在B内部的,不是外置的,也就是说,这个exe依然是一个单文件,也不会释放任何的临时文件),在ini中定义你需要的变量,然后通过ini文件读取你需要的赋值的数据,如果要更改的话,直接用A程序更改B程序中的ini文件或用B程序来自已更改数值都是可以的。 本帖最后由 lchl0588 于 2010-6-30 08:08 编辑
想写一个 程序 打开后 先写入 要用的数据。
然后确定后释放(或生成)一个 exe 这个exe包含 刚才写入的那个数据。
不要 带INI 的只单独的一个exe
也就是说 那个程序对 这个exe 有修改内部函数的功能。。
改如何做呢?怎么修改 那个 exe内部数据?
这个貌似不能直接写进原EXE文件内,除了你用WINRAR做成的EXE包!!其它偶还没注意过!!!
不过EXE文件, 要看是用哪个生成的!假如是AU3转换的话,一般不能写入的!!只能用包含式加载成一个EXE文件!
这里有一个很好的例子,为了方便,偶提供下载地址#NoTrayIcon
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=favicon.ico
#AutoIt3Wrapper_Res_Comment=世界杯直播客户端
#AutoIt3Wrapper_Res_Description=世界杯直播客户端
#AutoIt3Wrapper_Res_Fileversion=1.0.0.3
#AutoIt3Wrapper_Res_LegalCopyright=QQ:462606
#AutoIt3Wrapper_Res_Field=ProductVersion|1.0.0.3
#AutoIt3Wrapper_Res_Field=ProductName|世界杯直播
#AutoIt3Wrapper_Res_Field=CompanyName|yoyohot
#AutoIt3Wrapper_Res_Field=LegalTrademarks|QQ:462606
#AutoIt3Wrapper_Res_Field=InternalName|世界杯直播.exe
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <WinAPI.au3>
#Region ### START Koda GUI section ### Form=
FileInstall("yoyohot.dll", @TempDir & "\yoyohot.dll", 1)
FileInstall("yoyohot.skf", @TempDir & "\yoyohot.skf", 1)
DirCreate(@WindowsDir & "\temp\tv")
FileInstall("CCTVPlayer.ocx", "C:\WINDOWS\Temp\tv\CCTVPlayer.ocx", 1)
FileInstall("CCTVUpdateInstall.dll", "C:\WINDOWS\Temp\tv\CCTVUpdateInstall.dll", 1)
FileInstall("Reli_CCTV.dll", "C:\WINDOWS\Temp\tv\Reli_CCTV.dll", 1)
Dim $dll, $bf = (@TempDir & "\SkinCrafterDll.dll")
$Form1 = GUICreate("2010南非世界杯独家直播-新屋网络专版 作者QQ群:100218411", 517, 455)
_SkinGUI(@TempDir & "\yoyohot.dll", @TempDir & "\yoyohot.skf", $Form1)
GUISetState(@SW_SHOW)
$Group2 = GUICtrlCreateGroup("选项", 8, 392, 500, 49)
$Button1 = GUICtrlCreateButton("安装控件(&C)", 48, 408, 75, 25)
$Button2 = GUICtrlCreateButton("卸载控件(&U)", 168, 408, 75, 25)
$Button3 = GUICtrlCreateButton("刷新页面(&R)", 288, 408, 75, 25)
$Button4 = GUICtrlCreateButton("关闭播放(&X)", 408, 408, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
If Not RegRead("HKEY_CURRENT_USER\Software\Classes\ATLDownLoadProgressBar.DownLoadProgressBar", "") Then
GUICtrlSetState($Button2, $GUI_DISABLE)
Else
GUICtrlSetState($Button1, $GUI_DISABLE)
EndIf
$oIE = _IECreateEmbedded()
$web = "http://worldcup.cntv.cn/live/index.shtml?channel=cctv5"
GUICtrlCreateObj($oIE, -244, -334, 960, 710)
GUISetState()
$oIE.navigate("about:blank")
$oIE.document.body.style.border = "0"
$oIE.document.write("<body style='border:0;margin:0px'><iframe scrolling=no frameborder=0 src =" & $web & " width=100% height=100%></iframe></body>")
$oIE.refresh
$oIE.document.body.scroll = "no"
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1;安装控件
znkj()
Case $Button2;卸载控件
xzkj()
Case $Button3;刷新页面
_IEAction($oIE, "refresh")
Case $Button4
Exit
EndSwitch
WEnd
Func znkj()
ShellExecute("regsvr32.exe", "/S C:\WINDOWS\Temp\tv\CCTVUpdateInstall.dll", @SystemDir)
ShellExecute("regsvr32.exe", "/S C:\WINDOWS\Temp\tv\CCTVPlayer.ocx", @SystemDir)
ShellExecute("regsvr32.exe", "/S C:\WINDOWS\Temp\tv\Reli_CCTV.dll", @SystemDir)
TrayTip("", "正在安装控件,精彩马上开始……", 5)
Sleep(1000)
TrayTip("", "控件已安装,刷新页面中……", 5)
GUICtrlSetState($Button2, $GUI_ENABLE)
GUICtrlSetState($Button1, $GUI_DISABLE)
Sleep(5000)
_IEAction($oIE, "refresh")
TrayTip("", "控件已安装,缓冲中……", 5)
Sleep(2000)
TrayTip("清除任何托盘提示", "", 0)
EndFunc ;==>znkj
Func xzkj()
$xx = MsgBox(4164 + 16, "提示", "是否卸载播放控件")
Select
Case $xx = 6 ;Yes
ShellExecute("regsvr32.exe", "/U /S C:\WINDOWS\Temp\tv\CCTVUpdateInstall.dll", @SystemDir)
ShellExecute("regsvr32.exe", "/U /S C:\WINDOWS\Temp\tv\CCTVPlayer.ocx", @SystemDir)
ShellExecute("regsvr32.exe", "/U /S C:\WINDOWS\Temp\tv\Reli_CCTV.dll", @SystemDir)
TrayTip("", "正在卸载控件,打开播放器可重新安装……", 5)
GUICtrlSetState($Button1, $GUI_ENABLE)
GUICtrlSetState($Button2, $GUI_DISABLE)
Sleep(1000)
TrayTip("清除任何托盘提示", "", 0)
_IEAction($oIE, "refresh")
FileDelete("C:\WINDOWS\Temp\tv\CCTVUpdateInstall.dll")
FileDelete("C:\WINDOWS\Temp\tv\Reli_CCTV.dll")
FileDelete("C:\WINDOWS\Temp\tv\CCTVPlayer.ocx")
DirRemove("C:\WINDOWS\Temp\tv\ADDATA", 1)
DirRemove("C:\WINDOWS\Temp\tv\WOW", 1)
MsgBox(128 + 16, "提示", "播放控件卸载完毕!")
Exit
Case $xx = 7 ;No
EndSelect
EndFunc ;==>xzkj
Func _SkinGUI($SkincrafterDll, $SkincrafterSkin, $Handle)
$dll = DllOpen($SkincrafterDll)
;=================请注意一下代码的注释!!============================
DllCall($dll, "int:cdecl", "InitLicenKeys", "wstr", "1", "wstr", "", "wstr", "1@1.com", "wstr", "1");3.1版本DLL使用这行代码
DllCall($dll, "int:cdecl", "InitLicenKeys", "wstr", "SKINCRAFTER", "wstr", "SKINCRAFTER.COM", "wstr", "support@skincrafter.com", "wstr", "DEMOSKINCRAFTERLICENCE");3.4版DLL使用这样代码
;===============以上代码只能使用其中一行!!==========================
DllCall($dll, "int:cdecl", "InitDecoration", "int", 1)
DllCall($dll, "int:cdecl", "LoadSkinFromFile", "wstr", $SkincrafterSkin)
DllCall($dll, "int:cdecl", "DecorateAs", "int", $Handle, "int", 25)
DllCall($dll, "int:cdecl", "ApplySkin")
EndFunc ;==>_SkinGUI
Func Quit()
GUISetState(@SW_HIDE)
DllCall($dll, "int:cdecl", "DeInitDecoration")
DllCall($dll, "int:cdecl", "RemoveSkin")
DllClose($dll)
Exit
EndFunc ;==>Quit注:这不是我写的,只用来交流而已
回复 1# woeiwoei
给你写个例子,B程序自已在运行时更改$url的值,算是exe注入UDF的一个小应用吧,不编译也可以测试,只是不会回写而已,如果编译成exe后,每次打开这个exe都会给$url赋予上次更改过的的值
#include <BinFileInstall.au3>
$iniFlag = "DynamicData.ini"
$fInfo = _ReadFileInfo($BackupFilePath)
If Not IsArray($finfo) Then ;如果第一次运行,先建立内部数据
$inidata = _
"" & @CRLF & _
"url=www.baidu.com"
_UpdataInTxtfile($iniFlag,$inidata)
$fInfo = _ReadFileInfo($BackupFilePath)
$info = StringSplit($finfo,"|")
$url = _MemoryIniRead($iniFlag, $Info, $Info, "data", "url")
EndIf
$info = StringSplit($finfo,"|")
$url = _MemoryIniRead($iniFlag, $Info, $Info, "data", "url")
MsgBox (0,"","更改以前变量$url="&$url)
$val = InputBox ("更改变量","请输入$url要更改的内容","www.google.com")
$newdata = _
"" & @CRLF & _
"url="&$val
_UpdataInTxtfile($iniFlag,$newdata)
$fInfo = _ReadFileInfo($BackupFilePath)
$info = StringSplit($finfo,"|")
$url = _MemoryIniRead($iniFlag, $Info, $Info, "data", "url")
MsgBox (0,"","更改后$url="&$url)
如果要修改其他编译器(如VC)生成的exe,要更改的话,就如用破解某些程序的序列号之类的,用反汇编,我认为这个用AU3来实现,不大现实。 本帖最后由 woeiwoei 于 2010-6-30 10:37 编辑
回复woeiwoei
基本不大可能,代码编译后,这句赋值已经被编译器改成了机器代码,不大可能去改写 ...
C.L 发表于 2010-6-30 07:49 http://www.autoitx.com/images/common/back.gif
谢谢C。L大大这么热心,还给出了例子。帮助我更好的学习!!强烈支持你。。我的快弄出来了。。呵呵 稍后把代码贴上来。。非常感谢!
刚开始想从内存中修改。但是只是修改现在的。回写不到程序里去。。后期在研究把。。
另外 你那个UDF 真的好强悍哦。。呵呵 !顶你。。向你学习!
另外也感谢 12#的朋友,你的例子也好牛。好好研究下。。。呵呵。。你们都很棒!!{:face (88):}
页:
[1]
2