您的位置:首页 > 其它

加密与解密第三章:IDA的基本操作

2018-07-10 00:45 555 查看

IDA编辑二进制代码

edit->patch program



参考:https://blog.csdn.net/hgy413/article/details/50650232

IDA打开应用程序时,会为其创建一个数据库,后缀为IDB。IDB由4个文件组成:

后缀为id0的二叉树形式的数据库,
后缀为id1的程序字节标识,
后缀为nam的Named窗口的索引信息,
后缀为til的给定数据库的本地类型定义的相关信息。



更改数据为结构体和枚举类型

查看输入和输出的idc脚本

#include <idc.idc>

static GetImportSeg()
{
auto ea, next, name;
ea = FirstSeg();
next = ea;
while ( (next = NextSeg(next)) != -1) {
name = SegName(next);
if ( substr( name, 0, 6 ) == ".idata" ) break;
}
return next;
}

static main()
{
auto BytePtr, EndImports;
BytePtr = SegStart( GetImportSeg() );
EndImports = SegEnd( BytePtr );
Message(" \n" + "Parsing Import Table...\n");
while ( BytePtr < EndImports ) {
if (LineA(BytePtr, 1) != "") Message("\n" + "____" + LineA(BytePtr,1) + "____" + "\n");
Message(Name(BytePtr) + "\n");
BytePtr = NextAddr(BytePtr);
}
Message("\n" + "Import Table Parsing Complete\n");
}

//exports.idc
//(c)  www.PEDIY.com 2000-2008

#include <idc.idc>

static main()
{
auto x, ord, ea;
Message("\n Program Entry Points: \n \n");
for ( x=0; x<= GetEntryPointQty(); x = x+1){  //GetEntryPointQty()得到入口点个数
ord =  GetEntryOrdinal( x );          //得到该入口点的序列数
ea = GetEntryPoint( ord );
Message( Name( ea ) + ":  Ordinal " + ltoa( ord,16 ) + " at offset " + ltoa( ea, 16) + "\n");
}
Message("\n" + "Export Parsing Complete\n");
}

解密self modify code

idc文件如下:

//encrypted.idc
//(c)  www.PEDIY.com 2000-2008

#include <idc.idc>
static decrypt(from, size, key ) {
auto i, x;
for ( i=0; i < size; i=i+1 ) {
x = Byte(from);
x = (x^key);
PatchByte(from,x);
from = from + 1;
}

}
static main() {
decrypt(0x00401060,0x15,0x1);
}

如果遇到ida未识别十六进制数据,直接强转为代码即可。

FLIRT

能使IDA能在一系列编译器的标准库里自动找出调用的函数

用法打开如下 signatures



导入我们想加载的库的签名文件



之后函数就出来了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  加密 解密