把ida的汇编代码扒到VC中
来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:04:50
没什么技术含量,牛牛请无视
有时候把汇编的算法还原成C代码是一件令人头大的事,
索性直接从ida的反汇编代码中扒出来用
但是我不习惯用masm写代码,还是喜欢用VC,那怎么办呢?
当然是扒到VC中了.
先把IDA中的反汇编代码复制到一个文本文件里面,然后跑一段replace.pl,把前面的.data:0042E76C等无用代码去掉
Code:
my $infile;
my $outfile;
my $line;
printf "请输入文件名:";
chop($infile = );
open(READ_FILE, "<$infile");
$outfile = $infile.".asm";
open(WRITE_FILE, ">$outfile");
foreach $line ( )
{
#去除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
__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
}
}
有时候把汇编的算法还原成C代码是一件令人头大的事,
索性直接从ida的反汇编代码中扒出来用
但是我不习惯用masm写代码,还是喜欢用VC,那怎么办呢?
当然是扒到VC中了.
先把IDA中的反汇编代码复制到一个文本文件里面,然后跑一段replace.pl,把前面的.data:0042E76C等无用代码去掉
Code:
my $infile;
my $outfile;
my $line;
printf "请输入文件名:";
chop($infile =
open(READ_FILE, "<$infile");
$outfile = $infile.".asm";
open(WRITE_FILE, ">$outfile");
foreach $line (
{
#去除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
__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
}
}
把ida的汇编代码扒到VC中
VC中生成汇编文件
VC源动力--打造一流的VC技术站点 VC文章VC代码VC教程VC源码VC论坛
VC中坐标系的建立 - VC - 转载
VC设置对话框背景图的代码
编写易于调试的VC代码
VC++7.1转移到VC++2005 需要的一些变动
中石油下扒了高房价的裤子
VC知识库文章 - 关于内联汇编的几个技巧
把协商民主的理念渗透到提案办理中
VC中坐标系的建立 zz - VC - 转载
VC中坐标系的建立 zz - VC - 转载
把QQ空间的皮肤和开场动画代码弄到QQ空间里去
《把思念吹到你的身边》(动画与代码)
扒扒历史--美国人眼中的毛泽东
VC中实现历史记录的全面清除
vc++中error LNK2001的解决方法
VC++中各种字符串的表示方法
VC中全屏窗口的实现
VC中.rc文件的作用
VC++中MFC窗口对象的清除
如何把QQ弄到博客上-网易博客代码
将如下代码分别加到个人档案中,页面就可以显示不同的FLASH动画!
把元素插入到页面中