全局通栏广告

爱盲论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1087|回复: 10
打印 上一主题 下一主题

推荐一种冷门的脚本语言idc

[复制链接]

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
跳转到指定楼层
楼主
发表于 2021-8-5 18:21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主 铁血丹心说:
我是在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,然后你就会有个惊喜哦
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
沙发
 楼主| 发表于 2021-8-5 18:28:19 | 只看该作者
<
沙发 铁血丹心说:回楼主铁血丹心
补充一下,idc和c语言很接近,,学了这个不仅可以熟悉一下c语言的编程方式,也可用这门语言开发网站,有一举两得之效
回复 支持 反对

使用道具 举报

734

主题

1万

帖子

3万

积分

核心会员

Rank: 6Rank: 6

积分
37290
板凳
发表于 2021-8-5 22:38:48 来自手机 | 只看该作者
板凳 风中漫步说:
IDC我还真听说过一次,好像是在北京按摩店的时候,有一个工程师就是用的这个语言

回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
地板
 楼主| 发表于 2021-8-9 00:20:39 | 只看该作者
<
地板 铁血丹心说:回楼主铁血丹心
#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);
}

回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
5#
 楼主| 发表于 2021-8-9 00:35:42 | 只看该作者
<
5楼 铁血丹心说:回楼主铁血丹心
上面这段是一个把exe中的所有函数都列出来的程序
把这段文字复制到那个某某某.idc里面,用上面同样的方法执行一下。在和你加载的ex文件的同一文件夹下会多出一个以dump.log为结尾的文件,你打开这个文件就能看到这些函数。基本编程思路是用打开一个记事本,用get_func_name这个idc 中的函数,得到函数的名字后把它写到记事本.log里面,反复查看一下这个代码读懂之后你就可以用这个方法来调试你的程序,和c++一样的语法,你在调试时就可用这个方法,把调试信息写在记事本里
回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
6#
 楼主| 发表于 2021-8-9 01:07:50 | 只看该作者
<
6楼 铁血丹心说:javascript:void(0)
本帖最后由 铁血丹心 于 2021-8-9 01:20 编辑

回风中漫步的三楼给ida编写插件用,可以弥补忙人不方便用ida的不足
来自 畅游助手
回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
7#
 楼主| 发表于 2021-8-10 09:26:22 | 只看该作者
<
7楼 铁血丹心说:回楼主铁血丹心
#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);
}
回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
8#
 楼主| 发表于 2021-8-10 09:33:57 | 只看该作者
<
8楼 铁血丹心说:回7楼铁血丹心
这段是全量反汇编,就是把exe文件全部的反汇编代码都写到记事本里面,我们是站在巨人的肩膀上用的是idc里面内部的函数,就这样轻松的把反汇编的代码给提取出来了,然后你就可以分析别人写的代码喽
回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
9#
 楼主| 发表于 2021-8-10 09:42:36 | 只看该作者
<
9楼 铁血丹心说:回8楼铁血丹心
当然有些ex e程序是加壳的还有的是用花指令和加密过的 则需要去花指令和别的处理你才能看到他的反汇编后的汇编代码,这个日后我将慢慢道来
回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

积分
5725
10#
 楼主| 发表于 2021-8-11 01:08:25 | 只看该作者
<
10楼 铁血丹心说:回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);
                                                                                }
}

回复 支持 反对

使用道具 举报

83

主题

1678

帖子

5725

积分

金牌会员

Rank: 5Rank: 5

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋| 爱盲论坛  

GMT+8, 2024-11-24 11:05 , Processed in 0.058591 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表