把ida的汇编代码扒到VC中
没什么技术含量,牛牛请无视
有时候把汇编的算法还原成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文件中 一般我们的做法是放到一个函数中用 __asm { }进行包裹 但是vc所生成的函数代码都要进行栈帧和返回处理 也就是产生 push ebp mov ebp,esp 和 pop ebp ret 类似的代码, 这个是我们广大中国人民所不愿意看到滴
幸好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
|
好了,剩下的我们要做的工作就是搞清楚被扒代码的函数参数个数和入栈顺序,写个函数声明,然后把反汇编代码填到里面, PS: 差点忘了说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
|
写成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 } }
|
|