|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-09-25, 03:38 PM | #1 |
榮譽會員
|
資訊 - 彙編debug速查手冊資料傳輸指令集
彙編速查手冊資料傳輸指令集
彙編速查手冊一、資料傳輸指令 ─────────────────────────────────────── 它們在存貯器和暫存器、暫存器和輸入輸出連接阜之間傳送資料. 1. 通用資料傳送指令. MOV 傳送字或字節. MOVSX 先符號擴展,再傳送. MOVZX 先零擴展,再傳送. PUSH 把字壓入堆疊. POP 把字彈出堆疊. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆疊. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆疊. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆疊. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆疊. BSWAP 交換32位暫存器裡字節的順序 XCHG 交換字或字節.( 至少有一個操作數為暫存器,段暫存器不可作為操作數) CMPXCHG 比較並交換操作數.( 第二個操作數必須為累加器AL/AX/EAX ) XADD 先交換再累加.( 結果在第一個操作數里 ) XLAT 字節查表轉換. ── BX 指向一張 256 字節的表的起點, AL 為表的索引值 (0-255,即 0-FFH); 返回 AL 為查表結果. ( [BX+AL]->AL ) 2. 輸入輸出連接阜傳送指令. IN I/O連接阜輸入. ( 語法: IN 累加器, {連接阜號│DX} ) OUT I/O連接阜輸出. ( 語法: OUT {連接阜號│DX},累加器 ) 輸入輸出連接阜由立即方式指定時, 其範圍是 0-255; 由暫存器 DX 指定時, 其範圍是 0-65535. 3. 目的位址傳送指令. LEA 裝入有效位址. 例: LEA DX,string ;把偏移位址存到DX. LDS 傳送目標指標,把指標內容裝入DS. 例: LDS SI,string ;把段位址:偏移位址存到DS:SI. LES 傳送目標指標,把指標內容裝入ES. 例: LES DI,string ;把段位址:偏移位址存到ESI. LFS 傳送目標指標,把指標內容裝入FS. 例: LFS DI,string ;把段位址:偏移位址存到FSI. LGS 傳送目標指標,把指標內容裝入GS. 例: LGS DI,string ;把段位址:偏移位址存到GSI. LSS 傳送目標指標,把指標內容裝入SS. 例: LSS DI,string ;把段位址:偏移位址存到SSI. 4. 標誌傳送指令. LAHF 標誌暫存器傳送,把標誌裝入AH. SAHF 標誌暫存器傳送,把AH內容裝入標誌暫存器. PUSHF 標誌入棧. POPF 標誌出棧. PUSHD 32位標誌入棧. POPD 32位標誌出棧. 二、算術運算指令 ─────────────────────────────────────── ADD 加法. ADC 帶進位加法. INC 加 1. AAA 加法的ASCII碼調整. DAA 加法的十進制調整. SUB 減法. SBB 帶借位減法. DEC 減 1. NEC 求反(以 0 減之). CMP 比較.(兩操作數作減法,僅修改標誌位,不回送結果). AAS 減法的ASCII碼調整. DAS 減法的十進制調整. MUL 無符號乘法. IMUL 整數乘法. 以上兩條,結果回送AH和AL(字節運算),或DX和AX(字運算), AAM 乘法的ASCII碼調整. DIV 無符號除法. IDIV 整數除法. 以上兩條,結果回送: 商回送AL,餘數回送AH, (字節運算); 或 商回送AX,餘數回送DX, (字運算). AAD 除法的ASCII碼調整. CBW 字節轉換為字. (把AL中字節的符號擴展到AH中去) CWD 字轉換為雙字. (把AX中的字的符號擴展到DX中去) CWDE 字轉換為雙字. (把AX中的字元號擴展到EAX中去) CDQ 雙字擴展. (把EAX中的字的符號擴展到EDX中去) 三、邏輯運算指令 ─────────────────────────────────────── AND 與運算. OR 或運算. XOR 異或運算. NOT 取反. TEST 測試.(兩操作數作與運算,僅修改標誌位,不回送結果). SHL 邏輯左移. SAL 算術左移.(=SHL) SHR 邏輯右移. SAR 算術右移.(=SHR) ROL 循環左移. ROR 循環右移. RCL 通過進位的循環左移. RCR 通過進位的循環右移. 以上八種移位指令,其移位次數可達255次. 移位一次時, 可直接用操作碼. 如 SHL AX,1. 移位>1次時, 則由暫存器CL給出移位次數. 如 MOV CL,04 SHL AX,CL 四、串指令 ─────────────────────────────────────── DS:SI 源串段暫存器 :源串變址. ESI 目標串段暫存器:目標串變址. CX 重複次數計數器. AL/AX 掃瞄值. D標誌 0表示重複操作中SI和DI應自動增量; 1表示應自動減量. Z標誌 用來控制掃瞄或比較操作的結束. MOVS 串傳送. ( MOVSB 傳送字元. MOVSW 傳送字. MOVSD 傳送雙字. ) CMPS 串比較. ( CMPSB 比較字元. CMPSW 比較字. ) SCAS 串掃瞄. 把AL或AX的內容與目標串作比較,比較結果反映在標誌位. LODS 裝入串. 把源串中的元素(字或字節)逐一裝入AL或AX中. ( LODSB 傳送字元. LODSW 傳送字. LODSD 傳送雙字. ) STOS 儲存串. 是LODS的逆過程. REP 當CX/ECX<>0時重複. REPE/REPZ 當ZF=1或比較結果相等,且CX/ECX<>0時重複. REPNE/REPNZ 當ZF=0或比較結果不相等,且CX/ECX<>0時重複. REPC 當CF=1且CX/ECX<>0時重複. REPNC 當CF=0且CX/ECX<>0時重複. 五、程式轉移指令 ─────────────────────────────────────── 1>無條件轉移指令 (長轉移) JMP 無條件轉移指令 CALL 過程呼叫 RET/RETF過程返回. 2>條件轉移指令 (短轉移,-128到+127的距離內) ( 當且僅當(SF XOR OF)=1時,OP1<OP2 ) JA/JNBE 不小於或不等於時轉移. JAE/JNB 大於或等於轉移. JB/JNAE 小於轉移. JBE/JNA 小於或等於轉移. 以上四條,測試無符號整數運算的結果(標誌C和Z). JG/JNLE 大於轉移. JGE/JNL 大於或等於轉移. JL/JNGE 小於轉移. JLE/JNG 小於或等於轉移. 以上四條,測試帶符號整數運算的結果(標誌S,O和Z). JE/JZ 等於轉移. JNE/JNZ 不等於時轉移. JC 有進位時轉移. JNC 無進位時轉移. JNO 不溢出時轉移. JNP/JPO 奇偶性為奇數時轉移. JNS 符號位為 "0" 時轉移. JO 溢出轉移. JP/JPE 奇偶性為偶數時轉移. JS 符號位為 "1" 時轉移. 3>循環控制指令(短轉移) LOOP CX不為零時循環. LOOPE/LOOPZ CX不為零且標誌Z=1時循環. LOOPNE/LOOPNZ CX不為零且標誌Z=0時循環. JCXZ CX為零時轉移. JECXZ ECX為零時轉移. 4>中斷指令 INT 中斷指令 INTO 溢出中斷 IRET 中斷返回 5>處理器控制指令 HLT 處理器暫停, 直到出現中斷或復位信號才繼續. WAIT 當晶片引線TEST為高電平時使CPU進入等待狀態. ESC 轉換到外處理器. LOCK 封鎖總線. NOP 空操作. STC 置進位標誌位. CLC 清進位標誌位. CMC 進位標誌取反. STD 置方向標誌位. CLD 清方向標誌位. STI 置中斷允許位. CLI 清中斷允許位. 六、偽指令 ─────────────────────────────────────── DW 定義字(2字節). PROC 定義過程. ENDP 過程結束. SEGMENT 定義段. ASSUME 建立段暫存器尋址. ENDS 段結束. END 程式結束. 8088 彙編跳轉一、狀態暫存器 PSW(Program Flag)程式狀態字暫存器,是一個16位暫存器,由條件碼標誌(flag)和控制標誌構成,如下所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 條件碼: 1OF(Overflow Flag)溢出標誌。溢出時為1,否則置0。 2SF(Sign Flag)符號標誌。結果為負時置1,否則置0. 3ZF(Zero Flag)零標誌,運算結果為0時ZF位置1,否則置0. 4CF(Carry Flag)進位標誌,進位時置1,否則置0. 5AF(Auxiliary carry Flag)輔助進位標誌,記錄運算時第3位(半個字節)產生的進位置。有進位時1,否則置0. 6PF(Parity Flag)奇偶標誌。結果操作數中1的個數為偶數時置1,否則置0. 控制標誌位: 7DF(Direction Flag)方向標誌,在串處理指令中控制訊息的方向。 8IF(Interrupt Flag)中斷標誌。 9TF(Trap Flag)陷阱標誌。 二、 直接標誌轉移(8位尋址) 指令格式 機器碼 測試條件 如...則轉移 指令格式 機器碼 測試條件 如...則轉移 JC 72 C=1 有進位 JNS 79 S=0 正號 JNC 73 C=0 無進位 JO 70 O=1 有溢出 JZ/JE 74 Z=1 零/等於 JNO 71 O=0 無溢出 JNZ/JNE 75 Z=0 不為零/不等於 JP/JPE 7A P=1 奇偶位為偶 JS 78 S=1 負號 JNP/IPO 7B P=0 奇偶位為奇 三、間接標誌轉移(8位尋址) 指令格式 機器碼 測試格式 如...則轉移 JA/JNBE(比較無符號數) 77 C或Z=0 > 高於/不低於或等於 JAE/JNB(比較無符號數) 73 C=0 >= 高於或等於/不低於 JB/JNAE(比較無符號數) 72 C=1 < 低於/不高於或等於 JBE/JNA(比較無符號數) 76 C或Z=1 <= 低於或等於/不高於 JG/JNLE(比較帶符號數) 7F (S異或O)或Z=0 > 大於/不小於或等於 JGE/JNL(比較帶符號數) 7D S異或O=0 >= 大於或等於/不小於 JL/JNGE(比較帶符號數) 7C S異或O=1 < 小於/不大於或等於 JLE/JNG(比較帶符號數) 7E (S異或O)或Z=1 <= 小於或等於/不大於 四、無條件轉移指令(fisheep譯 fisheep@sohu.com) 操作碼 偽碼指令 含義 EB cb JMP rel8 相對短跳轉(8位),使rel8處的代碼位下一條指令 E9 cw JMP rel16 相對跳轉(16位),使rel16處的代碼位下一條指令 FF /4 JMP r/m16 絕對跳轉(16位),下一指令位址在r/m16中給出 FF /4 JMP r/m32 絕對跳轉(32位),下一指令位址在r/m32中給出 EA cb JMP ptr16:16 遠距離絕對跳轉, 下一指令位址在操作數中 EA cb JMP ptr16:32 遠距離絕對跳轉, 下一指令位址在操作數中 FF /5 JMP m16:16 遠距離絕對跳轉, 下一指令位址在記憶體m16:16中 FF /5 JMP m16:32 遠距離絕對跳轉, 下一指令位址在記憶體m16:32中 五、16位/32位尋址方式(fisheep譯 fisheep@sohu.com) 操作碼 偽碼指令 跳轉含義 跳轉類型 跳轉的條件(標誌位) 0F 87 cw/cd JA rel16/32 大於 near (CF=0 and ZF=0) 0F 83 cw/cd JAE rel16/32 大於等於 near (CF=0) 0F 82 cw/cd JB rel16/32 小於 near (CF=1) 0F 86 cw/cd JBE rel16/32 小於等於 near (CF=1 or ZF=1) 0F 82 cw/cd JC rel16/32 進位 near (CF=1) 0F 84 cw/cd JE rel16/32 等於 near (ZF=1) 0F 84 cw/cd JZ rel16/32 為0 near (ZF=1) 0F 8F cw/cd JG rel16/32 大於 near (ZF=0 and SF=OF) 0F 8D cw/cd JGE rel16/32 大於等於 near (SF=OF) 0F 8C cw/cd JL rel16/32 小於 near (SF<>OF) 0F 8E cw/cd JLE rel16/32 小於等於 near (ZF=1 or SF<>OF) 0F 86 cw/cd JNA rel16/32 不大於 near (CF=1 or ZF=1) 0F 82 cw/cd JNAE rel16/32 不大於等於 near (CF=1) 0F 83 cw/cd JNB rel16/32 不小於 near (CF=0) 0F 87 cw/cd JNBE rel16/32 不小於等於 near (CF=0 and ZF=0) 0F 83 cw/cd JNC rel16/32 不進位 near (CF=0) 0F 85 cw/cd JNE rel16/32 不等於 near (ZF=0) 0F 8E cw/cd JNG rel16/32 不大於 near (ZF=1 or SF<>OF) 0F 8C cw/cd JNGE rel16/32 不大於等於 near (SF<>OF) 0F 8D cw/cd JNL rel16/32 不小於 near (SF=OF) 0F 8F cw/cd JNLE rel16/32 不小於等於 near (ZF=0 and SF=OF) 0F 81 cw/cd JNO rel16/32 未溢出 near (OF=0) 0F 8B cw/cd JNP rel16/32 不是偶數 near (PF=0) 0F 89 cw/cd JNS rel16/32 非負數 near (SF=0) 0F 85 cw/cd JNZ rel16/32 非零(不等於) near (ZF=0) 0F 80 cw/cd JO rel16/32 溢出 near (OF=1) 0F 8A cw/cd JP rel16/32 偶數 near (PF=1) 0F 8A cw/cd JPE rel16/32 偶數 near (PF=1) 0F 8B cw/cd JPO rel16/32 奇數 near (PF=0) 0F 88 cw/cd JS rel16/32 負數 near (SF=1) 0F 84 cw/cd JZ rel16/32 為零(等於) near (ZF=1) 註:一些指令操作數的含義說明: rel8 表示 8 位相對位址 rel16 表示 16 位相對位址 rel16/32 表示 16或32 位相對位址 r/m16 表示16位暫存器 r/m32 表示32位暫存器 浮點指令 對下面的指令先做一些說明: st(i):代表浮點暫存器,所說的出棧、入棧操作都是對st(i)的影響 src,dst,dest,op等都是指指令的操作數,src表示源操作數,dst/dest表示目的操作數 mem8,mem16,mem32,mem64,mem80等表示是記憶體操作數,後面的數值表示該操作數的記憶體位數(8位為一字節) x <- y 表示將y的值放入x,例st(0) <- st(0) - st(1)表示將st(0)-st(1)的值放入浮點暫存器st(0) 1. 資料傳遞和對常量的操作指令 指令格式 指令含義 執行的操作 FLD src 裝入實數到st(0) st(0) <- src (mem32/mem64/mem80) FILD src 裝入整數到st(0) st(0) <- src (mem16/mem32/mem64) FBLD src 裝入BCD數到st(0) st(0) <- src (mem80) FLDZ 將0.0裝入st(0) st(0) <- 0.0 FLD1 將1.0裝入st(0) st(0) <- 1.0 FLDPI 將pi裝入st(0) st(0) <- ?(ie, pi) FLDL2T 將log2(10)裝入st(0) st(0) <- log2(10) FLDL2E 將log2(e)裝入st(0) st(0) <- log2(e) FLDLG2 將log10(2)裝入st(0) st(0) <- log10(2) FLDLN2 將loge(2)裝入st(0) st(0) <- loge(2) FST dest 儲存實數st(0)到dest dest <- st(0) (mem32/mem64) FSTP dest dest <- st(0) (mem32/mem64/mem80);然後再執行一次出棧操作 FIST dest 將st(0)以整數儲存到dest dest <- st(0) (mem32/mem64) FISTP dest dest <- st(0) (mem16/mem32/mem64);然後再執行一次出棧操作 FBST dest 將st(0)以BCD儲存到dest dest <- st(0) (mem80) FBSTP dest dest<- st(0) (mem80);然後再執行一次出棧操作 2.比較指令 指令格式 指令含義 執行的操作 FCOM 實數比較 將標誌位設置為 st(0) - st(1) 的結果標誌位 FCOM op 實數比較 將標誌位設置為 st(0) - op (mem32/mem64)的結果標誌位 FICOM op 和整數比較 將Flags值設置為st(0)-op 的結果op (mem16/mem32) FICOMP op 和整數比較 將st(0)和op比較 op(mem16/mem32)後;再執行一次出棧操作 FTST 零檢測 將st(0)和0.0比較 FUCOM st(i) 比較st(0) 和st(i) [486] FUCOMP st(i) 比較st(0) 和st(i),並且執行一次出棧操作 FUCOMPP st(i) 比較st(0) 和st(i),並且執行兩次出棧操作 FXAM Examine: Eyeball st(0) (set condition codes) 3.運算指令 指令格式 指令含義 執行的操作 加法 FADD 加實數 st(0) <-st(0) + st(1) FADD src st(0) <-st(0) + src (mem32/mem64) FADD st(i),st st(i) <- st(i) + st(0) FADDP st(i),st st(i) <- st(i) + st(0);然後執行一次出棧操作 FIADD src 加上一個整數 st(0) <-st(0) + src (mem16/mem32) 減法 FSUB 減去一個實數 st(0) <- st(0) - st(1) FSUB src st(0) <-st(0) - src (reg/mem) FSUB st(i),st st(i) <-st(i) - st(0) FSUBP st(i),st st(i) <-st(i) - st(0),然後執行一次出棧操作 FSUBR st(i),st 用一個實數來減 st(0) <- st(i) - st(0) FSUBRP st(i),st st(0) <- st(i) - st(0),然後執行一次出棧操作 FISUB src 減去一個整數 st(0) <- st(0) - src (mem16/mem32) FISUBR src 用一個整數來減 st(0) <- src - st(0) (mem16/mem32) 乘法 FMUL 乘上一個實數 st(0) <- st(0) * st(1) FMUL st(i) st(0) <- st(0) * st(i) FMUL st(i),st st(i) <- st(0) * st(i) FMULP st(i),st st(i) <- st(0) * st(i),然後執行一次出棧操作 FIMUL src 乘上一個整數 st(0) <- st(0) * src (mem16/mem32) 除法 FDIV 除以一個實數 st(0) <-st(0) /st(1) FDIV st(i) st(0) <- st(0) /t(i) FDIV st(i),st st(i) <-st(0) /st(i) FDIVP st(i),st st(i) <-st(0) /st(i),然後執行一次出棧操作 FIDIV src 除以一個整數 st(0) <- st(0) /src (mem16/mem32) FDIVR st(i),st 用實數除 st(0) <- st(i) /st(0) FDIVRP st(i),st FDIVRP st(i),st FIDIVR src 用整數除 st(0) <- src /st(0) (mem16/mem32) FSQRT 平方根 st(0) <- sqrt st(0) FSCALE 2的st(0)次方 st(0) <- 2 ^ st(0) FXTRACT Extract exponent: st(0) <-exponent of st(0); and gets pushed st(0) <-significand of st(0) FPREM 取餘數 st(0) <-st(0) MOD st(1) FPREM1 取餘數(IEEE),同FPREM,但是使用IEEE標準[486] FRNDINT 取整(四捨五入) st(0) <- INT( st(0) ); depends on RC flag FABS 求絕對值 st(0) <- ABS( st(0) ); removes sign FCHS 改變符號位(求負數) st(0) <-st(0) F2XM1 計算(2 ^ x)-1 st(0) <- (2 ^ st(0)) - 1 FYL2X 計算Y * log2(X) st(0)為Y;st(1)為X;將st(0)和st(1)變為st(0) * log2( st(1) )的值 FCOS 餘弦函數Cos st(0) <- COS( st(0) ) FPTAN 正切函數tan st(0) <- TAN( st(0) ) FPATAN 反正切函數arctan st(0) <- ATAN( st(0) ) FSIN 正弦函數sin st(0) <- SIN( st(0) ) FSINCOS sincos函數 st(0) <-SIN( st(0) ),並且壓入st(1) st(0) <- COS( st(0) ) FYL2XP1 計算Y * log2(X+1) st(0)為Y; st(1)為X; 將st(0)和st(1)變為st(0) * log2( st(1)+1 )的值 處理器控制指令 FINIT 初始化FPU FSTSW AX 儲存狀態字的值到AX AX<- MSW FSTSW dest 儲存狀態字的值到dest dest<-MSW (mem16) FLDCW src 從src裝入FPU的控制字 FPU CW <-src (mem16) FSTCW dest 將FPU的控制字儲存到dest dest<- FPU CW FCLEX 清除異常 FSTENV dest 儲存環境到記憶體位址dest處 儲存狀態字、控制字、標誌字和異常指標的值 FLDENV src 從記憶體位址src處裝入儲存的環境 FSAVE dest 儲存FPU的狀態到dest處 94字節 FRSTOR src 從src處裝入由FSAVE儲存的FPU狀態 FINCSTP 增加FPU的棧指標值 st(6) <-st(5); st(5) <-st(4),...,st(0) <-? FDECSTP 減少FPU的棧指標值 st(0) <-st(1); st(1) <-st(2),...,st(7) <-? FFREE st(i) 標誌暫存器st(i)未被使用 FNOP 空操作,等同CPU的nop st(0) <-st(0) WAIT/FWAIT 同步FPU與CPU:停止CPU的執行,直到FPU完成當前操作碼 FXCH 交換指令,交換st(0)和st(1)的值 st(0) <-st(1) st(1) <- st(0) 分析技術 在進行軟件的破解、解密以及電腦病毒分析工作中,一個首要的問題是對軟件及病毒進行分析。這些軟件都是機器代碼程式,對於它們分析必須使用靜態或動態除錯工具,分析跟蹤其彙編代碼。 一、從軟件使用說明和操作中分析軟件 欲破解一軟件,首先應該先用用這軟件,瞭解一下功能是否有限制,最好閱讀一下軟件的說明或手冊,特別是自己所關心的關鍵部分的使用說明,這樣也許能夠找點線索。 二、靜態反彙編 所謂靜態分析即從反彙編出來的程式清單上分析,從提示訊息入手進行分析。目前,大多數軟件在設計時,都採用了人機對話方式。所謂人機對話,即在軟件執行過程中,需要由用戶選擇的地方,軟件即顯示相應的提示訊息,並等待用戶按鍵選擇。而在執行完某一段程式之後,便顯示一串提示訊息,以反映該段程式執行後的狀態,是正常執行,還是出現錯誤,或者提示用戶進行下一步工作的幫助訊息。為此,如果我們對靜態反彙編出來的程式清單進行閱讀,可瞭解軟件的編程思路,以便順利破解。 常用的靜態分析工具是W32DASM、IDA和HIEW等。 三、動態跟蹤分析 雖然從靜態上可以瞭解程式的思路,但是並不可能真正瞭解地瞭解軟件的細節,如靜態分析找不出線索,就要動態分析程式,另外,碰到壓縮程式,靜態分析也無能為力了,只能動態分析了。所謂動態分析是利用SOFTICE或TRW2000一步一步地單步執行軟件。為什麼要對軟件進行動態分析呢?這主要是因為: 1、許多軟件在整體上完成的功能,一般要分解成若干模塊來完成,而且後一模塊在執行時,往往需要使用其前一模塊處理的結果,這一結果我們把它叫中間結果。如果我們只對軟件本身進行靜態地分析,一般是很難分析出這些中間結果的。而只有通過跟蹤執行前一模塊,才能看到這些結果。另外,在程式的執行過程中,往往會在某一地方出現許多分支和轉移,不同的分支和轉移往往需要不同的條件,而這些條件一般是由執行該分支之前的程式來產生的。如果想知道程式執行到該分支的地方時,去底走向哪一分支,不進行動態地跟蹤和分析是不得而知的。 2、有許多軟件在執行時,其最初執行的一段程式往往需要對該軟件的後面各個模塊進行一些初始始化工作,而沒有依賴系統的重定位。 3、有許多加密保護程式為了阻止非法跟蹤和閱讀,對執行代碼的大部分內容進行了加密保護變換,而只有很短的一段程式是明文。加密保護程式執行時,採用了逐塊解密,逐塊執行和方法,首先執行最初的一段明文程式,該程式在執行過程中,不僅要完成阻止跟蹤的任務,而且還要負責對下一塊密碼進行解密。顯然僅對該軟件的密碼部分進行反彙編,不對該軟件動態跟蹤分析,是根本不可能進行解密的。 由於上述原因,在對軟件靜態分析不行的條件下,就要進行動態分析了。哪麼如何有效地進行動態跟蹤分析呢?一般來說有如下幾點: 1、對軟件進行粗跟蹤 所謂粗跟蹤,即在跟蹤時要大塊大塊地跟蹤,也就是說每次遇到呼叫CALL指令、重複操作指令REP.循環操作LOOP指令以及中斷呼叫INT指令等,一般不要跟蹤進去,而是根據執行結果分析該段程式的功能。 2、對關鍵部分進行細跟蹤 對軟件進行了一定程度的粗跟蹤之後,便可以獲取軟件中我們所關心的模塊或程式段,這樣就可以針對性地對該模塊進行具體而詳細地跟蹤分析。一般情況下,對關鍵代碼的跟蹤可能要反覆進行若干次才能讀懂該程式,每次要把比較關鍵的中間結果或指令位址記錄下來,這樣會對下一次分析有很大的幫助。軟件分析是一種比較複雜和艱苦的工作,上面的幾點分析方法,只是提供了一種基本的分析方法。要積累軟件分析的經驗需要在實踐中不斷地探索和總結。 中斷點大全 密碼常用中斷 Hmemcpy (win9x專用) GetDlgItemTextA GetDlgItemInt vb: getvolumeinformationa vbastrcomp (trw) Bpx __vbaStrComp (記得是兩個 '_') MSVBVM60!_vbastrcomp|sofice MSVBVM50! | VBAI4STR Ctrl+D bpx msvbvm60!__vbastrcomp do "d *(esp+0c)"(softice) 按幾次F5出冊碼出來了。 bpx regqueryvalueexa do "d esp->8"(trw) vbaVarTstEq 判斷是否註冊的函數 (0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], ax 改為0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], bx) 時間常用中斷 GetSystemTime GetLocalTime GetTickCount vb: rtcGetPresentDate //取得當前日期 殺窗常用中斷 Lockmytask (win9x專用) DestroyWindow mouse_event (滑鼠中斷) postquitmessage (Cracking足彩xp,很有用^_^) vb: _rtcMsgBox ini文件內容常用中斷 GetPrivateProfileStringA GetPrivateProfileProfileInt key文件: getprivateprofileint ReadFile CreateFileA 註冊表常用中斷 RegQueryvalueA RegQueryvalueExA 狗加密保護中斷 BPIO -h 278 R BPIO -h 378 R 其它常用函數中斷點 CreateFileA (讀狗驅動程式), DeviceIOControl, FreeEnvironmentStringsA (對付HASP非常有效). Prestochangoselector (16-bit HASP's), '7242' 查找字元串 (對付聖天諾).具體含義參考下面的範例。 光碟破解中斷 16: getvolumeinformation getdrivetype int 2fh (dos) 32: GetDriveTypeA GetFullPathNameA GetWindowsDirectoryA 讀磁碟中斷 GETLASTERROR 返回擴充出錯代碼 限制中斷 EnableMenuItem 允許、禁止或變灰指定的表菜單條目 EnableWindow 允許或禁止滑鼠和鍵盤控制指定視窗和條目(禁止時表菜單變灰) 不知道軟碟中斷是什麼了?還有其它特殊中斷,不知道其他朋友可否說一下了? 如:Lockmytask and mouse_event,這些就不是api32函數? win9x 與 win2k進行破解,以上中斷有部分已經不能用了? 不知道在win2k上,以上常用中斷函數是什麼了? 也就是問密碼、時間、視窗、ini、key、註冊表、加密保護狗、光碟、軟碟、限制等! 瞭解常用的中斷,對破解分析可以做到事半功倍! 請大家說一下!還有如何破解了某個軟件時,一重啟就打回原形? 不知道下什麼中斷了?可以分為三種情況: 1.比較可能在註冊表中 2.比較在特殊文件(*.key *.ini *.dat等) 3.比較在程式中,沒有任何錯誤提示或者反譯也找不到明顯字元(這個就是我想問的) 還有一個是最難的,就是去掉水印! 也可以三種情況: A.水印是位圖文件(bitblt,creatBITMAP等位圖函數) B.水印是明顯字元(反譯分析) C.水印不是明顯字元(如:This a demo!它只是顯示在另一個製作文件上,可是*.htm *.exe等) C.才是最難搞,也是很多人想知道的!包括我在內。不知道高手們有何提示了? 廣告條: 可以分兩種情況: A.從創建視窗進手,可以用到movewindow或者其它視窗函數! B.從位圖進手,也可以用到bitblt或者其它位圖函數! 最後可以借助一些現有工具(如:api27,vwindset,freespy之類的工具) 葡萄雖無樹,籐生棚中秧。 人處凡塵中,豈不惹塵埃? 小球[CCG] 那要看是在哪作的標記,通常是在註冊表中留下訊息! 在softice中就要用bpx regqueryvalueexa do "d esp->8"來中斷看看, 在trw中要用bpx regqueryvalueexa do "d*(esp+8)"來中斷看看。 還有的是在本目錄下留下註冊訊息,常見的有.dat .ini .dll等等, 我是用bpx readfile來中斷的,還有的是在windows目錄下留下註冊訊息。 你可以借助專用的工具幫助你檢視,入filemon等! vb: 1、__vbaVarTstNe //比較兩個變數是否不相等 2、rtcR8ValFromBstr //把字元串轉換成浮點數 3、rtcMsgBox 顯示一訊息交談視窗 4、rtcBeep //讓揚聲器叫喚 5、rtcGetPresentDate //取得當前日期 針對字串: __vbaStrComp __vbaStrCmp __vbaStrCompVar __vbaStrLike __vbaStrTextComp __vbaStrTextLike 針對變數: __vbaVarCompEq __vbaVarCompLe __vbaVarCompLt __vbaVarCompGe __vbaVarCompGt __vbaVarCompNe VB的指標: THROW VB DLL還呼叫了oleauto32.dll中的部分函數。oleauto32.dll是個通用的proxy/stub DLL,其每個函數的原型在<oleauto.h>中定義,並在MSDN中有詳細描述。這也有助於理解VB DLL中的函數的作用。 舉例: LEA EAX, [EBP-58] PUSH EAX CALL [MSVBVM60!__vbaI4Var] 執行call之前敲dd eax+8,得到的值為3; 執行完call之後,eax = 3 從而可知__vbaI4Var的作用是將一個VARIANT轉換為I4(即一個長整數)。 __vbaVarTstNe似乎是用來進行自校驗的,正常情況下返回值為0。 已知適用的軟件有:網路三國智慧式機器人、音樂賀卡廠。當這兩個軟件被脫殼後都回出錯,網路三國智慧式機器人會產生非法*作,而音樂賀卡廠會告訴你是非法拷貝,通過修改__vbaVarTstNe的返回值都可讓它們正常執行。 所以當您遇到一個VB軟件,脫殼後無法正常執行,而又找不出其它問題時,可試試攔截這個函數,說不定會有用哦。8-) API不太知道,也許可以通過BIOS在98平台上讀寫扇區,不過在2000/NT下可以通過內黑ATAPI,HAL寫扇區 machoman[CCG] bpx WRITE_PORT_BUFFER_USHORT NT/2000下這個中斷點,當edx=1f0h,時,可以看見EDI位址內資料為扇區位置資料,必須先 在winice.dat 中裝入hal.sys 詳細內容看ATAPI手冊 補充篇: 關於對VB程式和時間限製程序的中斷點 CrackerABC 先給出修改能正確反編譯VB程式的W32DASM的位址: ====================== offsets 0x16B6C-0x16B6D 修改機器碼為: 98 F4 ====================== VB程式的跟蹤中斷點: ============ MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp __vbaStrComp __vbaStrCopy __vbaStrMove __vbaVarTstNe rtcBeep rtcGetPresentDate (時間API) rtcMsgBox ========= 時間限制中斷點: ================ CompareFileTime GetLocalTime GetSystemTime GetTimeZoneInformation msvcrt.diffTime() msvcrt.Time() ================ |
__________________ |
|
送花文章: 3,
|
向 psac 送花的會員:
|
wulihua (2006-09-26)
感謝您發表一篇好文章 |