把ida的匯編代碼扒到VC中沒什么技術(shù)含量,牛牛請無視
有時候把匯編的算法還原成C代碼是一件令人頭大的事,
索性直接從ida的反匯編代碼中扒出來用
但是我不習(xí)慣用masm寫代碼,還是喜歡用VC,那怎么辦呢?
當(dāng)然是扒到VC中了.
先把IDA中的反匯編代碼復(fù)制到一個文本文件里面,然后跑一段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代碼復(fù)制到c文件中
一般我們的做法是放到一個函數(shù)中用
__asm
{ }進(jìn)行包裹
但是vc所生成的函數(shù)代碼都要進(jìn)行棧幀和返回處理
也就是產(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: 差點(diǎn)忘了說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 } }
|
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。