找回密码
 加入
搜索
查看: 11880|回复: 23

[AU3基础] 如何修改已编译好的EXE内部函数?

 火.. [复制链接]
发表于 2010-6-29 13:18:12 | 显示全部楼层 |阅读模式
想写一个 程序 打开后 先写入 要用的数据。
然后确定后释放(或生成)一个 exe 这个exe包含 刚才写入的那个数据。
不要 带INI 的只单独的一个exe
也就是说 那个程序对 这个exe 有修改内部函数的功能。。
改如何做呢?怎么修改 那个 exe内部数据?
老大们 给个招把。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-6-29 13:29:11 | 显示全部楼层
前几天论坛不是一直在研究这个问题吗?还写在UDF了,去UDF区看一下。
 楼主| 发表于 2010-6-29 13:30:39 | 显示全部楼层
额。。我去看看。。谢谢`
发表于 2010-6-29 14:09:11 | 显示全部楼层
我之前提过类似的问题,可以看看那些帖子。
 楼主| 发表于 2010-6-29 14:31:16 | 显示全部楼层
本帖最后由 woeiwoei 于 2010-6-29 14:36 编辑
我之前提过类似的问题,可以看看那些帖子。
feicuiboy 发表于 2010-6-29 14:09



    貌似你的的帖子也没解决?
论坛发的那个exe注入的,貌似只正对加载的文件。没看说明里有直接修改函数的操作啊?
我的思路和你的差不多,也是运行A程序 释放B程序。A程序算是B程序的修改器把。
但是B程序不带配置文件。那个A程序可以直接修改B程序特定的函数。
例如修改 B程序原有的 $url='www.baidu.com'为$url='www.google.com'.修改完毕后B程序自动保存被A程序更新的参数。。
 楼主| 发表于 2010-6-29 14:35:21 | 显示全部楼层
帮帮我呀。给我点思路把。。
 楼主| 发表于 2010-6-29 16:20:44 | 显示全部楼层
帮帮忙呀。没人愿意伸出援手吗?
发表于 2010-6-29 17:35:26 | 显示全部楼层
用odby改
发表于 2010-6-29 19:05:42 | 显示全部楼层
等结果!!!!!!!!!!!!!!!!
发表于 2010-6-29 22:47:32 | 显示全部楼层
回复 5# woeiwoei

我现在的采用的方法就是在程序中包含 AU3的编译文件,编译新文件并自杀原文件。可以做到,但是不是很喜欢这种方法,没能直接改写。

听高手讲改PE结构。。不过俺不会
发表于 2010-6-30 07:49:36 | 显示全部楼层
本帖最后由 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程序来自已更改数值都是可以的。
发表于 2010-6-30 08:05:18 | 显示全部楼层
本帖最后由 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
注:这不是我写的,只用来交流而已

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-6-30 08:41:45 | 显示全部楼层
回复 1# woeiwoei

给你写个例子,B程序自已在运行时更改$url的值,算是exe注入UDF的一个小应用吧,不编译也可以测试,只是不会回写而已,如果编译成exe后,每次打开这个exe都会给$url赋予上次更改过的的值
#include <BinFileInstall.au3>

$iniFlag = "DynamicData.ini"
$fInfo = _ReadFileInfo($BackupFilePath)
If Not IsArray($finfo) Then ;如果第一次运行,先建立内部数据
        $inidata = _
                        "[data]" & @CRLF & _
                        "url=www.baidu.com"                 
        _UpdataInTxtfile($iniFlag,$inidata)
        $fInfo = _ReadFileInfo($BackupFilePath)
        $info = StringSplit($finfo[1],"|")
        $url = _MemoryIniRead($iniFlag, $Info[3], $Info[2], "data", "url")
EndIf
$info = StringSplit($finfo[1],"|")
$url = _MemoryIniRead($iniFlag, $Info[3], $Info[2], "data", "url")
MsgBox (0,"","更改以前变量$url="&$url)

$val = InputBox ("更改变量","请输入$url要更改的内容","www.google.com")

$newdata = _
                "[data]" & @CRLF & _
                "url="&$val
_UpdataInTxtfile($iniFlag,$newdata)                
$fInfo = _ReadFileInfo($BackupFilePath)
$info = StringSplit($finfo[1],"|")
$url = _MemoryIniRead($iniFlag, $Info[3], $Info[2], "data", "url")

MsgBox (0,"","更改后$url="&$url)
发表于 2010-6-30 09:13:55 | 显示全部楼层
如果要修改其他编译器(如VC)生成的exe,要更改的话,就如用破解某些程序的序列号之类的,用反汇编,我认为这个用AU3来实现,不大现实。
 楼主| 发表于 2010-6-30 10:30:20 | 显示全部楼层
本帖最后由 woeiwoei 于 2010-6-30 10:37 编辑
回复  woeiwoei


  
基本不大可能,代码编译后,这句赋值已经被编译器改成了机器代码,不大可能去改写 ...
C.L 发表于 2010-6-30 07:49



    谢谢C。L大大这么热心,还给出了例子。帮助我更好的学习!!强烈支持你。。我的快弄出来了。。呵呵 稍后把代码贴上来。。非常感谢!
刚开始想从内存中修改。但是只是修改现在的。回写不到程序里去。。后期在研究把。。
另外 你那个UDF 真的好强悍哦。。呵呵 !顶你。。向你学习!

另外也感谢 12#的朋友,你的例子也好牛。好好研究下。。。呵呵。。你们都很棒!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 18:38 , Processed in 0.082670 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表