国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路)

這篇具有很好參考價值的文章主要介紹了關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

幾年前,公司買了臺國產(chǎn)貼片機(jī),里面的主程序是QT編寫,運行在WINDOW XP系統(tǒng)上。主程序打開的界面,如圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

我來簡單介紹下程序界面,各位讀者不需要搞明白功能,只要知道大體的流程即可。

分析主界面:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

一、左邊的列表:

貼片生產(chǎn)文件,里面包括了貼片時元器件的坐標(biāo)、飛達(dá)安裝的元器件類型、Mark定位點等信息的貼片機(jī)工藝文件(文件的格式為CSV),使用和編輯工藝文件時,需先點擊選中。

二、右邊的三個按鈕:

  1. 用打開自帶的WPS,以便直接編輯CSV工藝文件,但是因為CSV文件格式比較復(fù)雜,一般不使用此功能;
  2. 中間的編輯是在程序中詳細(xì)設(shè)定CSV
  3. 最后的加工按鈕,就是進(jìn)入貼片加工工藝,也是我們今天需要分析的重點項目。?

分析加工界面:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

注意: 因為逆向不能影響生產(chǎn),我是在虛擬機(jī)下運行的主程序,所以下面的6個攝像頭控件是不工作的,實際是顯示了6個吸嘴取料的放大照片。同時因為我運行的是貼片機(jī)的默認(rèn)工藝文件,所以左邊的列表也是不顯示內(nèi)容的

一、左側(cè)部分:

  1. 最左側(cè)的列表,顯示了MARK點信息(MARK點是PCB板上的一個標(biāo)記,因為每次進(jìn)板時位置的不同,所以需要MARK點,來定位每塊PCB板的實際坐標(biāo),方便程序換算實際貼片坐標(biāo)用的)。
  2. 中間的列表顯示的貼片元器件的詳細(xì)參數(shù)列表。

二、右側(cè)部分:

  1. ?加工日志,顯示了PCB加工的結(jié)果信息。
  2. 功能按鈕區(qū)域:
    1. 啟動:開始貼片
    2. 單步(Enter):貼片每步細(xì)化,按此按鈕一次即操作一步,比如:進(jìn)板-->識別板邊-->識別Mark點-->吸嘴取料-->貼裝-->吸嘴再次取料-->再次貼裝-->吸嘴N次取料-->N次貼裝-->結(jié)束貼裝
    3. 停止:在貼裝時的暫停操作
    4. 配置:這個我們在下面會詳細(xì)說說,里面包括了我們需要修改的同取功能
    5. 退出加工:顧名思義退出貼片
    6. PCB退板:把貼好的或者不貼的PCB板退出貼片機(jī)

三、下部:

  1. 六個貼裝頭取料時的照片(飛行相機(jī)拍攝)
  2. MARK點圖片(MARK相機(jī)識別,在圖1,復(fù)用貼裝頭1)

因為這臺貼片機(jī)是多個貼裝頭的,所以取料時可以并排同時取多個料棧的元器件(需要滿足連續(xù)的料棧才能同取),但是讓人費解的是,這個主程序的貼片配置中(功能按鈕中的"配置"按鈕),關(guān)于同取的設(shè)置,每次退出加工程序都會重置,如果沒有設(shè)置,就會變成沒有同取,如下圖所示:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

逆向目標(biāo):?

????????所以我們需要實現(xiàn)的目的已經(jīng)明確:"取料支持同取"自動勾選(不用每次去按"配置"按鈕,自動設(shè)置同取操作)

逆向思路:

在這里我想分享我逆向程序的一些經(jīng)驗給大家:

  1. 針對一個未知源代碼程序時,我們需要大體知道一個程序的界面流程,可以在心里構(gòu)建出一個大概的分析目標(biāo),不能沒有目的。
  2. 特別是定位關(guān)鍵的代碼時,我們至少需要大體知道代碼所在的區(qū)域在哪里。
  3. 使用IDA找到函數(shù)調(diào)用堆棧鏈。
  4. 還有這個關(guān)鍵代碼一定是修改了某些變量,我們只要定位到這個變量。
  5. 使用我們的二分算法,在這個區(qū)域內(nèi)的中間函數(shù)下斷點,觀察定位到的變量是否改變成理想值。
    1. 如變量改變,則在前半段代碼區(qū)域使用相同的方法,不??s小范圍,最終定位到關(guān)鍵函數(shù)。
    2. 如變量不改變,則在后半段區(qū)域再次使用二分法不??s小范圍,最終定位到關(guān)鍵函數(shù)。
  6. 在關(guān)鍵函數(shù)內(nèi),通過同樣的二分法,定位到關(guān)鍵代碼跳轉(zhuǎn)即可。

接下來,我就為大家演示下分析流程。

逆向分析流程:

根據(jù)上面的逆向思路,我們已經(jīng)有了第一條的分析目標(biāo)--"取料支持同取"自動勾選;所以我們看看第二條的代碼所在區(qū)域,根據(jù)我們之前分析的主界面和加工界面相關(guān)信息,我們知道,點擊主界面的"加工"按鈕會進(jìn)入加工界面,再點擊"配置"按鈕可以設(shè)置"取料支持同取"。

流程如下:"加工"-->"配置"-->"取料支持同取"

因為我們需要勾選"取料支持同取"(下面簡稱:"同取"),所以不免要從程序初始化CheckBox控件代碼入手,我們暫時還不知道QT里是怎么初始化CheckBox控件(因為CheckBox控件有選中和未選中兩種狀態(tài),所以這個初始化的過程包括:修改并保存一個類似布爾值的公共變量,然后通過讀取這個公共變量的值,來修改CheckBox的屬性。PS:因為代碼設(shè)計的關(guān)系,點擊退出加工后,這個布爾值會重置),我們現(xiàn)在還不知道這個變量的位置,但是可以確定的是,初始化這個控件時,一定會初始化"同取"字符串,如果我們能定位到初始化"同取"的代碼處,我們就可以通過IDA的Xref grap to確定初始化CheckBox的函數(shù)調(diào)用鏈。

如果大家還不是太明白,我們實際來操作一下吧!

打開我們的IDA8.3,加載貼片機(jī)主程序,按Shift+F5打開字符串窗口(怎么使用IDA8.3搜索中文字符串的方法請看以下鏈接。)

最新IDA8.3安裝后需要做的一些完善工作(包括IDAPython報錯、ChatGPT的模塊安裝、中文字符串的顯示,各種問題解決方法合集)https://blog.csdn.net/donglxd/article/details/135243027如下圖所示,在String窗口中,我們搜索下"取料支持同取"字符串,可以看到有一個結(jié)果,點擊后,我們很方便的定位到調(diào)用它的代碼處。

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

點擊上面的搜索到的字符串來到字符串的定義位置,如下圖所示:?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

點擊上圖中字符串后面的引用代碼地址,我們來到了如下圖的地址處:?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

選中如上圖中的引用代碼位置,然后按一下空格,切換到如下圖的方框格模式,方便我們找到函數(shù)頭,我們只要點擊下圖中紅框處的函數(shù)規(guī)??傮w預(yù)覽圖的最上面,就可以快速定位到函數(shù)頭部。?

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如下圖:來到函數(shù)頭部后,我們右擊第一行代碼,在彈出的菜單中選擇Xrefs graph to來顯示函數(shù)的調(diào)用鏈?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?如下圖就是剛剛引用"同取"字符串之前運行的所有調(diào)用函數(shù)鏈。關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?知道了函數(shù)調(diào)用鏈,我們接下去分析下,因為我們要找到設(shè)置CheckBox的公共變量,而設(shè)置CheckBox的操作,QT一定有相應(yīng)的API函數(shù),我們打開IDA搜索下導(dǎo)入表,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?至于那個API,查詢微軟的Copilot AI后,給出了下面的鏈接(QT系統(tǒng)學(xué)習(xí)系列:1.1 QAbstractButton(按鈕抽象基類)),這個鏈接中說明了AbstractButton是checkbox的基類,CheckBox有兩個函數(shù)setChecked和isChecked,分別是設(shè)置CheckBox和讀取CheckBox狀態(tài)。

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

然后我們再次使用Copilot查詢setChecked函數(shù)的名稱修飾,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

所以,我們IDA查詢到的第一個函數(shù)"_ZN15QABstractButton10setCheckedEb"就是setChecked,同樣的方法查詢到"_ZNK15QAbstractButton9isCheckedEv" 就是isChecked,既然知道了setChecked這個API函數(shù),我們查找下引用他的地址有哪些,方法如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?點擊上圖中的setChecked名稱修飾,定位到下圖中的函數(shù)輸入表位置,右擊后打開函數(shù)調(diào)用鏈圖關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?如下圖所示,setChecked的調(diào)用鏈,咋一看很復(fù)雜是不是?是不是想放棄不接著看了,其實不用想的太復(fù)雜,有時答案就在眼前,只要你耐心查找。請接著讀下去。

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

你們還記得,我們剛剛也查找過一個函數(shù)調(diào)用鏈嗎? 對了,就是調(diào)用同取函數(shù)那個調(diào)用鏈,我們把兩張圖放一起對比下,如下圖所示:?

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?我用紅筆圈出的兩張圖的相同之處,顯然這個函數(shù)調(diào)用鏈(sub_4A2500-->sub_4A23E0-->sub_4362F0-->sub_491660-->sub_4CBB40)中的最后一鏈sub_491660-->sub_4CBB40中包含了sub_491230-->"_ZN15QABstractButton10setCheckedEb"(setChecked),所以我們只需找到sub_491230中的setChecked,以方便之后,我們定位到之前提到的公共變量位置。

我們先用IDA定位到sub_491230函數(shù)看看,因為里面有setChecked函數(shù)調(diào)用,具體的分析請看下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

因為程序是X86的,所以我們用X32DBG調(diào)試下,如下圖:?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

可以看到內(nèi)存地址74D0C8就是setChecked的公共變量參數(shù)(根據(jù)call esi得知,esp就是第一參數(shù),而mov dword ptr ss:[esp],eax這句設(shè)置了esp,所以eax的賦值語句就是這個第一參數(shù),也就是公共變量),打開主程序后運行啟動,打開加工窗口后這個變量會一直存在,我們可以嘗試設(shè)置下復(fù)選框,看看這個公共變量會改變嗎?如下圖:

?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

可以看到公共變量74D0C8變成了00 00 01 01的格式,因為內(nèi)存中是從高到低讀取,所以我們需要的是從右往左數(shù)第二個字節(jié)的01 。關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?既然我們知道了公共變量,讓我們再來分析下程序的流程,根據(jù)之前的程序流程分析,在主程序頁面點擊加工后,公共變量就建立了(這點從退出加工頁面就會重置"同取"設(shè)置就可以判斷出來),所以我們從主程序頁面的"啟動"這個字符串"開刀",Strings搜索下"啟動",如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?下圖是函數(shù)頭部:

?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

右擊這個sub_433830,點擊Xrefs graph to,查看函數(shù)調(diào)用鏈:?

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt函數(shù)sub_433830的調(diào)用鏈如下圖右半部分,可以看到sub_433830的調(diào)用鏈在setChecked調(diào)用鏈的前面,和我們分析的一樣:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?如上圖,我們需要判斷設(shè)定公共變量74D0C8是否在藍(lán)色部分的這些函數(shù)里? 所以我們先把藍(lán)色部分的這些函數(shù)頭部都下斷點,使用之前文章中提到的二分法,逐步縮小區(qū)域即可。我們在x32dbg中使用bp命令快速下斷點,如bp 4352C0,下斷之后的效果如下:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

然后重新運行程序,把下面的內(nèi)存也設(shè)置到公共變量74D0C8的地址觀察變化。程序啟動后,點擊主界面的"啟動"按鈕,遺憾的是程序直接運行到了加工界面,斷點并沒有斷下,而是需要點擊加工界面里的配置才會斷下,觀察公共變量74D0C8發(fā)現(xiàn),在進(jìn)入加工界面后,就已經(jīng)被設(shè)置,所以我們可以嘗試sub_433830函數(shù)的另一邊調(diào)用鏈,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

我為了調(diào)試時,觀察方便,把紅框中下斷的每個函數(shù)都注釋了一個簡稱,如sub1、sub2這樣的,方便辨認(rèn),并在X32dbg中也對應(yīng)的注釋了函數(shù)簡稱,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

然后,我們用x32dbg重新運行程序,我們一邊觀察公共變量74D0C8的變化,一邊在中斷時按運行按鈕,跳過不需要的斷點,如果x32dbg不中斷時,我們再切會貼片機(jī)程序正常操作下,如點擊項目名、點擊啟動等,經(jīng)過幾次中斷后,我發(fā)現(xiàn)公共變量74D0C8變化成我們需要的00 00 00 01了,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如上圖,因為中斷在sub5函數(shù)頭部,所以設(shè)置公共變量的代碼一定在sub4函數(shù),然后我們可以使用,如下圖的二分法,逐步縮小查找范圍,定位到關(guān)鍵代碼(記住每次都要重啟程序調(diào)試,我們可以按空格鍵把不需要的斷點關(guān)掉,加快調(diào)試速度。還有別忘了重啟后每次都要在內(nèi)存1中定位到公共變量74D0C8)。

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

通過上面的方法,我們很快定位到了關(guān)鍵函數(shù),如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如上圖,可以看到運行過注釋的這句關(guān)鍵點,下面的公共變量74D0C8變成了00 00 00 01,顯然設(shè)置代碼在這個函數(shù)(關(guān)鍵點)中,在這個關(guān)鍵函數(shù)上下斷。

把不需要的斷點取消,重新運行程序,按F7進(jìn)這個函數(shù)看看,如圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如上圖,進(jìn)關(guān)鍵函數(shù)后是一個大跳轉(zhuǎn),此時單步下去,并注意下面的公共變量74D0C8的值。

我們跟進(jìn)這個大跳轉(zhuǎn),如圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如上圖,我們來到了設(shè)置公共變量74D0C8的關(guān)鍵函數(shù)處,粗略看了下都是mov的賦值操作,看來地方來對了。這個函數(shù)不長,我們一行行單步觀察公共變量的值變化就好。?

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

如上圖可知,我們運行了上面4行mov的賦值代碼后,74D0C8變量成我們需要的值,但是這個00 00 00 01是不設(shè)置同取的變量。不知道大家還記得之前我們調(diào)試時,嘗試點擊"同取"復(fù)選框改變的值嗎??

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

就是上圖第3個字節(jié)位,而我們再看這4句mov賦值,顯然賦值的地址也是按ecx的寄存器累加上去,一位位的設(shè)置的,顯然mov byte ptr ds:[ecx+0x02], 0x00,這句就是我們需要修改的,把后面的0x00改成0x01即可,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt?

?然后右擊修改的代碼,點擊補(bǔ)丁保存修改后的文件,我們可以另起一個名稱,如下圖:

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

然后我們運行下這個修改后的主程序看看。

關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路),開發(fā)語言,安全,windows,測試工具,qt

?可以看到,修改成功了,教程到此也寫完了,感謝大家的耐心觀看,本人不才,但是希望大家有學(xué)到新知識,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-820901.html

到了這里,關(guān)于關(guān)于一個QT程序的簡單破解思路(不需要分析信號和槽的方法,通用所有程序的破解思路)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包