把ida的匯編代碼扒到VC中沒(méi)什么技術(shù)含量,牛牛請無(wú)視
有時(shí)候把匯編的算法還原成C代碼是一件令人頭大的事,
索性直接從ida的反匯編代碼中扒出來(lái)用
但是我不習慣用masm寫(xiě)代碼,還是喜歡用VC,那怎么辦呢?
當然是扒到VC中了.
先把IDA中的反匯編代碼復制到一個(gè)文本文件里面,然后跑一段replace.pl,把前面的.data:0042E76C等無(wú)用代碼去掉
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);
|
然后把過(guò)濾后的asm代碼復制到c文件中
一般我們的做法是放到一個(gè)函數中用
__asm
{ }進(jìn)行包裹
但是vc所生成的函數代碼都要進(jìn)行棧幀和返回處理
也就是產(chǎn)生
push ebp
mov ebp,esp
和
pop ebp
ret 類(lèi)似的代碼,
這個(gè)是我們廣大中國人民所不愿意看到滴
幸好VC還有__declspec(naked) 參數,放在你指定的函數前,可以讓函數"裸奔" :-P 例如:
Code: #include <stdio.h> __declspec(naked) void test(char* msg) { printf(msg); }
void main() { test("hello world\n"); }
|
用Ollydbg看生成的匯編代碼,可以看到test函數是"裸"的
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
|
好了,剩下的我們要做的工作就是搞清楚被扒代碼的函數參數個(gè)數和入棧順序,寫(xiě)個(gè)函數聲明,然后把反匯編代碼填到里面,
PS: 差點(diǎn)忘了說(shuō)ida中的參數替換怎么處理
Code: .text:0040F100 var_C = dword ptr -0Ch .text:0040F100 var_8 = byte ptr -8 .text:0040F100 arg_0 = dword ptr 4 .text:0040F100
|
寫(xiě)成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ù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。