qq724174 发表于 2011-11-10 14:56:44

[已解决]EXE文件末尾的办法。

本帖最后由 qq724174 于 2011-11-11 15:08 编辑

需要用au3获取指定exe文件末尾的一个数值 进行替换后写入exe
看过pcbar发的文件自身crc32写入文件尾,但是只能追加写入 不知道怎么实现替换写入$f=FileOpenDialog("EXE文件CRC32校验码插入程序",@ScriptDir,'程序文件(*.exe)')
If Not FileExists($f) Then
        MsgBox(64,"错误!","文件不存在。",10)
        Exit
EndIf

$file=FileOpen($f,16)
$fs=FileRead($file)
MsgBox(0,0,$file)
;MsgBox(0,0,BinaryToString($fs,5))
FileClose($file)

FileWrite($f&'.bak',$fs)
MsgBox(0,'之前文件长度',BinaryLen($fs))

$crc='123456'
$file=FileOpen($f,17)
FileWrite($file, Binary($crc))
FileClose($file)

$file=FileOpen($f,16)
$fs=FileRead($file)
FileClose($file)
MsgBox(0,'之后文件长度',BinaryLen($fs))
;FileSetPos这样的效果是会在exe的末尾追加123456进去 但是没办法把原有的替换
比如原exe文件末尾有个abcd1234 我需要把这个1234替换成5678 请各位大侠帮帮忙
这里的abcd是固定的 1234可能是2-6位数字

qq724174 发表于 2011-11-10 15:45:41

自己顶一下,各位好心人知道的请帮下忙。

xms77 发表于 2011-11-10 16:58:54

本帖最后由 xms77 于 2011-11-10 17:01 编辑

可执行文件修改比较困难啊,没有源代码,只能以二进制模式代开,二进制文件转码的话,不知道文本是哪些二进制代码啊?貌似比做外挂还难!等待楼下高人出现!

qq724174 发表于 2011-11-10 18:05:00

哎、蛋疼的事

xms77 发表于 2011-11-10 21:03:21

楼主你到底是为什么要改啊,我以前就搞过改软件版本。

pusofalse 发表于 2011-11-10 22:50:14

FileOpen、FileGetSize、FileSetPos、FileWrite,这几个函数足够了。

qq724174 发表于 2011-11-11 01:19:28

本帖最后由 qq724174 于 2011-11-11 05:07 编辑

回复 6# pusofalse $sss = _tihuan("test1.exe", "abcd1234", "abcd5780.", "asc")
MsgBox(0, "替换成功次数", $sss)

Func _tihuan($file, $a, $b, $num = 0)
        $files = FileOpen($file, 16)
        $fileshex = FileRead($files)
        FileClose($files)
        $isin = StringInStr($fileshex, _txt2hex($a))
        If $isin = 0 Then
                Return 0 ;$a不存在
        Else
                $ddds = StringReplace($fileshex, _txt2hex($a), _txt2hex($b), $num)
                If @extended > 0 Then
                        $re = @extended
                        $files = FileOpen($file, 18)
                        If FileWrite($files, $ddds) = 0 Then Return -1
                        Return $re
                Else
                        Return -2
                EndIf
        EndIf
EndFunc   ;==>_tihuan

Func _txt2hex($sString) ;thanks 丨悠闲丨
        Dim $BinaryString
        For $i = 1 To StringLen($sString)
                $STR = StringMid($sString, $i, 1)
                If String(Binary($STR)) > 0xFF Then Return Binary($sString)
                If String(Binary($STR)) < 0x80 Then
                        $BinaryString &= String(Binary($STR))
                Else
                        $BinaryString &= String(Binary($STR & $STR))
                EndIf
        Next
        $BinaryString = StringReplace($BinaryString, '0x', '')
        Return $BinaryString
EndFunc   ;==>_txt2hex找遍论坛所有关于hex的例子,以上代码可以成功替换
但是郁闷的事"abcd1234"要是固定的值,不知道怎么在这里面使用正则找出abcd后面的2-6位纯数字。$iId = StringRegExp($test, '(?i)abcd(\d+)', 1)这样在 $test是普通文本的时候可以正则提取到1234但是hex的话 实在无解了,老大指点一下。

qq724174 发表于 2011-11-11 15:11:02

谢谢pusofalse和ceoguang的帮助以及my788521的原始贴
页: [1]
查看完整版本: [已解决]EXE文件末尾的办法。