把ida的匯編代碼扒到VC中
沒什么技術(shù)含量,牛牛請無視
有時候把匯編的算法還原成C代碼是一件令人頭大的事, 索性直接從ida的反匯編代碼中扒出來用 但是我不習慣用masm寫代碼,還是喜歡用VC,那怎么辦呢? 當然是扒到VC中了.
先把IDA中的反匯編代碼復制到一個文本文件里面,然后跑一段replace.pl,把前面的.data:0042E76C等無用代碼去掉 Code:
my $infile; my $outfile; my $line;
printf "請輸入文件名:"; chop($infile =<STDIN> ); open(READ_FILE, "<$infile"); $outfile = $infile.".asm"; open(WRITE_FILE, ">$outfile");
foreach $line (<READ_FILE> ) { #去除ida匯編代碼前面的東西 $line =~ s/^.data:[0-9A-F]{8,8}//; printf(WRITE_FILE "$line"); }
close(READ_FILE); close(WRITE_FILE);
|
然后把過濾后的asm代碼復制到c文件中 一般我們的做法是放到一個函數(shù)中用 __asm { }進行包裹 但是vc所生成的函數(shù)代碼都要進行棧幀和返回處理 也就是產(chǎn)生 push ebp mov ebp,esp 和 pop ebp ret 類似的代碼, 這個是我們廣大中國人民所不愿意看到滴
幸好VC還有__declspec(naked) 參數(shù),放在你指定的函數(shù)前,可以讓函數(shù)"裸奔" :-P 例如: Code:
#include <stdio.h> __declspec(naked) void test(char* msg) { printf(msg); }
void main() { test("hello world\n"); }
|
用Ollydbg看生成的匯編代碼,可以看到test函數(shù)是"裸"的 Code:
00401000 /$ 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] 00401003 |. 50 PUSH EAX ; |format 00401004 |. FF15 00204000 CALL DWORD PTR DS:[<&MSVCRT.printf>] ; printf 0040100A |. 83C4 04 ADD ESP,4 0040100D |$ 55 PUSH EBP 0040100E |. 8BEC MOV EBP,ESP 00401010 |. 68 10304000 PUSH naked.00403010 ; ASCII "hello world\n" 00401015 |. E8 E6FFFFFF CALL naked.00401000 0040101A |. 83C4 04 ADD ESP,4 0040101D |. 5D POP EBP 0040101E . C3 RETN
|
好了,剩下的我們要做的工作就是搞清楚被扒代碼的函數(shù)參數(shù)個數(shù)和入棧順序,寫個函數(shù)聲明,然后把反匯編代碼填到里面, PS: 差點忘了說ida中的參數(shù)替換怎么處理 Code:
.text:0040F100 var_C = dword ptr -0Ch .text:0040F100 var_8 = byte ptr -8 .text:0040F100 arg_0 = dword ptr 4 .text:0040F100
|
寫成C的宏,然后放在拔出代碼前面即可,最終如下: Code:
__declspec(naked) void codec(unsigned char* Input, unsigned int size, unsigned char* Key) { __asm { #define var_C -0Ch #define var_8 -8 #define arg_0 4 // // 添加扒出的代碼 // #undef var_C #undef var_8 #undef arg_0 } }
|
|