爱盲论坛

标题: 推荐一种冷门的脚本语言idc [打印本页]

作者: 铁血丹心    时间: 2021-8-5 18:21
标题: 推荐一种冷门的脚本语言idc
我是在idapro这个反编译软件上作的测试,可供学c和idc语言的人学习之用,idc的函数网上有全集,也可以在ida文件里找idc.idc里面有函数的说明。
至于ida脚本之家就有下载,如何加载exe到ida里就不多说了,网上有说明。
首先打开记事本写好下面这个代码

#include <idc.idc>

static main()
{
Warning("i love you\n");   
}

然后把记事本改名为某某某.idc

然后打开ida,随便加载一个exey,alt找到file菜单里的Script file,对话框里选择那个某某某.idc,然后你就会有个惊喜哦

作者: 铁血丹心    时间: 2021-8-5 18:28
标题: 回楼主铁血丹心
补充一下,idc和c语言很接近,,学了这个不仅可以熟悉一下c语言的编程方式,也可用这门语言开发网站,有一举两得之效
作者: 风中漫步    时间: 2021-8-5 22:38
IDC我还真听说过一次,好像是在北京按摩店的时候,有一个工程师就是用的这个语言


作者: 铁血丹心    时间: 2021-8-9 00:20
标题: 回楼主铁血丹心
#include <idc.idc>

static getFuncName(ea)
{
    auto funcName = get_func_name(ea);
               
    auto dm = demangle_name(funcName, get_inf_attr(INF_LONG_DN));
    if(dm != 0)
    {
        funcName = dm;
    }
    return funcName;
}

static functionDump(ea)
{
    auto funcName = 0;
    auto end = 0x0;
    auto file_open = get_idb_path()[0:-4] + "_dump.log";
    auto stream = fopen(file_open, "w");
    auto peekAhead;

    while( ea != BADADDR )
    {
        ea = NextFunction(ea);               
        peekAhead = NextFunction(ea);
        end = FindFuncEnd(ea);       
        funcName = getFuncName(ea);

        if(peekAhead == BADADDR)
        {
            fprintf(stream, "{ 0x%X, 0x%X, \"%s\" }\n", ea, end, funcName);
            ea = peekAhead;
            continue;
        }
            end = peekAhead - 1;               
            fprintf(stream, "{ 0x%X, 0x%X, \"%s\" }\n", ea, end,funcName);
    }
        fclose(stream);
}

static main()
{
    functionDump(0x40000);
}


作者: 铁血丹心    时间: 2021-8-9 00:35
标题: 回楼主铁血丹心
上面这段是一个把exe中的所有函数都列出来的程序
把这段文字复制到那个某某某.idc里面,用上面同样的方法执行一下。在和你加载的ex文件的同一文件夹下会多出一个以dump.log为结尾的文件,你打开这个文件就能看到这些函数。基本编程思路是用打开一个记事本,用get_func_name这个idc 中的函数,得到函数的名字后把它写到记事本.log里面,反复查看一下这个代码读懂之后你就可以用这个方法来调试你的程序,和c++一样的语法,你在调试时就可用这个方法,把调试信息写在记事本里
作者: 铁血丹心    时间: 2021-8-9 01:07
标题: javascript:void(0)
本帖最后由 铁血丹心 于 2021-8-9 01:20 编辑

回风中漫步的三楼给ida编写插件用,可以弥补忙人不方便用ida的不足
来自 畅游助手
作者: 铁血丹心    时间: 2021-8-10 09:26
标题: 回楼主铁血丹心
#include <idc.idc>

static main(void)
{
    auto file_open = get_idb_path()[0:-4] + "_decp.log";

    auto decode = 0x401000;
    auto xref;
    auto stream = fopen(file_open, "w");   
    for(xref = RfirstB(decode); xref != BADADDR; xref = RnextB(decode,xref))
    {
            fprintf(stream, "wq wq wq 上上 牙wq w q        ");
            fprintf(stream, "xref: %x\n",xref);

   
    auto i = 0;
      auto inst = xref;
    auto op;
        
        
       while((i < 100) )
       {
        inst = FindCode(inst,0x00); // flag set to backwards
      op = GetDisasm(inst); // get
      
            fprintf(stream, "%x --> %s \n",inst,op);
        i++;
       }
    }
        fclose(stream);
}

作者: 铁血丹心    时间: 2021-8-10 09:33
标题: 回7楼铁血丹心
这段是全量反汇编,就是把exe文件全部的反汇编代码都写到记事本里面,我们是站在巨人的肩膀上用的是idc里面内部的函数,就这样轻松的把反汇编的代码给提取出来了,然后你就可以分析别人写的代码喽
作者: 铁血丹心    时间: 2021-8-10 09:42
标题: 回8楼铁血丹心
当然有些ex e程序是加壳的还有的是用花指令和加密过的 则需要去花指令和别的处理你才能看到他的反汇编后的汇编代码,这个日后我将慢慢道来
作者: 铁血丹心    时间: 2021-8-11 01:08
标题: 回9楼铁血丹心
#include "idc.idc"

static main() {
        Warning("hahahahahi i love you ggggggdddddeeeeeerror \n");
  auto x,FBin,ProcRange;

HideJunkCode();

PatchJunkCode();

AnalyzeArea (MinEA(),MaxEA());
                }

static PatchJunkCode() {
  auto x,FBin,ProcRange;

FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){

x = x +5;
PatchByte (x,0x90);
x = x + 3 ;
PatchByte (x,0x90);
x++;
PatchWord (x,0x9090);
x =x +2 ;
PatchDword (x,0x90909090);

                                                                                }

FBin = "74 04 75 02 EB 02 EB 01 81";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){

x = x + 4;
PatchWord (x,0x9090);
x = x + 4;
PatchByte (x,0x90);

                                                                                }

FBin = "50 E8 02 00 00 00 29 5A 58 6B C0 03 E8 02 00 00 00 29 5A 83 C4 04";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){

x = x + 6;
PatchWord (x,0x9090);
x = x + 11;
PatchWord (x,0x9090);
                                                                                }

FBin = "EB 01 68 EB 02 CD 20 EB 01 E8";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){

x = x+2;
PatchByte (x,0x90);
x = x+3;
PatchWord (x,0x9090);
x = x+4;
PatchByte (x,0x90);
                                                                                }
                }

static HideJunkCode() {
  auto x,y,FBin;

FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){
MakeUnknown (x,0x17,1);
y = x + 0x17;
HideArea (x,y,atoa(x),atoa(x),atoa(y),-1);

                                                                                }

FBin = "74 04 75 02 EB 02 EB 01 81";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){
MakeUnknown (x,0x09,1);
y = x + 0x09;
HideArea (x,y,atoa(x),atoa(x),atoa(y),-1);

                                                                                }

FBin = "50 E8 02 00 00 00 29 5A 58 6B C0 03 E8 02 00 00 00 29 5A 83 C4 04";

for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){
MakeUnknown (x,0x17,1);
y = x + 0x17;
HideArea (x,y,atoa(x),atoa(x),atoa(y),-1);

                                                                                }


FBin = "EB 01 68 EB 02 CD 20 EB 01 E8";
for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)){
MakeUnknown (x,0x0a,1);
y = x + 0x0a;
HideArea (x,y,atoa(x),atoa(x),atoa(y),-1);
                                                                                }
}


作者: 铁血丹心    时间: 2021-8-11 01:21
标题: 回10楼铁血丹心
上面这段是重头戏,去掉无用的指令,这些指令干扰反汇编程序,使得ida分析错误,故而应该把它们去掉,去花指令的函数主要过程是用findbinary找到花指令的开头处,然后用PatchByte把这些指令用nop空指令代替 从花指令开始竹行把花指令去掉这样ida就可以继续正确的分析出之后的代码了,后面的代码是把nop处的代码隐藏掉,以方便观瞻,至于哪些是花指令,这个需要熟悉汇编知识 ,平时多看看这类的汇编代码,自然慢慢会熟练运用了 。




欢迎光临 爱盲论坛 (https://aimang.net/) Powered by Discuz! X3.2