リバースバイナリ実行ファイルの意味のある分析を覚えています

免責事項:この唯一の個人的な興味として研究、および商業目的のために使用することはできません。私は一切の責任を負いかねた後、読者の他の用途!

1.背景

        同社はスカイネットモニター事業を行ってきた、H5プレーヤーによってテレビ側で、その後、リアルタイムビデオH264パッケージに変身する監視カメラRTSP必要が、プラットフォームは、7585高精細のセットトップボックスの波とAndroidセットトップボックスの他のいくつかのメーカーがあるが、すべての統一規格。しかしプッシュが工場出荷時にインストールされたトランスコードプログラムストリームで、メーカーは、個人的な利益のために、19桁のライセンスとしてライセンス認証アルゴリズムプログラムの研究を開始する必要があると言うことはありません。

2、アイデアや準備

2.1愚かなアイデア

    認可コードとして必要なライセンスの最初の19以来、私は、ライン上で実行たまには、トランスコードプログラムを横断しに行きました起動するプログラムを使用して、プログラムが正常に検出を​​開始し、その後、確かにこの数は、ファイルに書き込まれます,,私は次のようにプログラムが書かれている走りました。

#coding:utf-8
import time
import commands
#import subprocess
def AddStr(s):
	if(len(str(s))==1):
		s='0000'+str(s)
	elif(len(str(s))==2):
		s='000'+str(s)
	elif(len(str(s))==3):
		s='00'+str(s)
	elif(len(str(s))==4):
		s='0'+str(s)
	elif(len(str(s))==5):
		s=str(s)
	return s
	#print(type(s))
for i in range(0,9999):
	for m in range(0,99999):
		for n in range(0,99999):
			for j in range(0,99999):
				#i
				if(len(str(i))==1):
					i='000'+str(i)
				elif(len(str(i))==2):
					i='00'+str(i)
				elif(len(str(i))==3):
					i='0'+str(i)
				#print(type(i))
				#m
				AddStr(m)
				#n
				AddStr(n)
				#j
				AddStr(j)
				MyStr=str(i)+AddStr(m)+AddStr(n)+AddStr(j)
				with open('monitor_license','w+') as f:
					f.write(MyStr+'\n')
				status,output = commands.getstatusoutput('./Sdgd_Monitor')
				if 'Monitor Server Running...' in output:
					with open('license.txt','w+') as f:
						f.write(MyStr)
						exit('已成功获取license')

私は私が行うには非常に愚かなことをした見つかった2日間については、1ミリ秒の試みあれば、あなたも1ナノ秒の動作時間あれば、/3600/24/365=31709791.983764585年1000分の9999999999999999999秒に必要でなく、317年の蘭、 、その時間が永遠に......方法がないと推定され、私はそう遊びに行く、魔法の逆コンパイルツールは、やる方が良いと思うことを、IDA考えます。

2.2アイデア

ローカル認証コードを必要とするので、それは確かに行くと、サーバーのコントラストを置くために、プログラムの実行を生成し、その上にのみ解析アルゴリズムの生成プロセス

2.3コード分析

コンパイルがコースを専門にされていますが、先生に戻ってきた、または擬似コードのフライを見にかかわらず、F5キーを押してデコンパイル擬似コード、電子情報工学を見て、私は、学びました。リストの主な機能は以下の通り、逆コンパイル後:

メイン:主な機能、入口すなわち関数を次のように説明し

                 GetMainbroadSerID:機能サーバのシリアル番号を取得

                  GetLocalProgramName:実行されるプログラムのネームサーバ検出機能

                  関数発生機能認証コード、これはまた、一次分析である:GetLocalAuthorrizeCode

                  GetAuthorizeFileCode:既に認証コードを取得するには、サーバー上に存在し、即ち、比較及び認証コード生成、同じ手順を行いました

                  checkAuthorize:既存の関数として比較すると発生するかどうか、すなわち、認証機能をチェック

                  str2hash:認証コードアルゴリズム関数を生成します

以下のように疑似コードの主な機能は次のとおりです。

実装プロセスの2.4分析

プログラム実行フローは以下の時には、上記の擬似コードに基づいて、それは、ことがわかります。

1)主な機能には、パラメータを渡すプログラムの名前で、checkAuthorize検査証明書を行きます。

認証コードの後GetLocalAuthorrizeCodeに、checkAuthorizeに)2に移動します。

3)GetLocalAuthorrizeCodeに、関数に、サーバ、すなわちのシリアル番号を取得するGetMainbroadSerID

GetMainbroadSerIDがdmidecodeの-sシステムシリアル番号によって生成された後に4)のシーケンス番号がファイルに書き込まれ、メモリにファイルを読み込み、コンテンツへの読み取りアクセス、ファイルを削除し、パラメータとしてコンテンツを読み出されますアルゴリズムを実行するstr2hash。

5)と共にトラバーサルASCIIコードの文字列で、hは一度の範囲にわたる種類、LLタイプことに留意すべきである、str2hash鍵アルゴリズム、プロセスパラメータストリングに、トラバースされた符号なしの33時間を乗じオーバーフロー。LLは、最終的にはまだオーバーフローし、絶対値に対処する必要があるの種類、数、およびコードの原則の値をusign生産します。

3から6)バック)、プラス符号なしのステッチ、アンダースコアだけで、プログラム名を生成し、その後、パラメータstr2hashとして渡され、結果の値は、ライセンスを取得することが最終的なもの。

7)2に戻り)、その後、ファイル名、サーバー上に置かれているファイル名の末尾にローカルライセンス、および読み取り後に生成されたコントラストをお読みください。

比較として、通常のプログラム実行の結果として1〜8)バック)がなく、同じコントラストは、エラーが、失敗しました。

図3に示すように、アナログライセンス生成プログラム

次のように上記生成プロセスに基づいて、シミュレートされたパイソンを生成するために使用することができ、主なコードは次のとおりです。

def str2hash(str0):
	h=123456789098765
	for i in str0:
		h=33*h+ord(i)
		while h>2**64-1:
			h=h-2**64
		#print(hex(h))
	if h>2**63-1:
		h=abs(h-2**64)
	return h

str2='sdgd_Monitor_'+str(str2hash(str1))
print("序列号="+str1+"\n"+"code="+str(str2hash(str2)))

次のように図トラバーサルプロセスは、次のとおりです。

 テストした後、生成された値は、プログラムの実行が成功することができます。

4、要約

        本人是做网络,兼做前端出身,有时也设计后端,主要是php,参加过多次网络安全比赛,只要遇到逆向的题一般直接放弃,这次逆向分析折腾了三天,包括IDA的使用、远程调试、函数查找、代码分析等等,但总算成功了。

        其实刚开始分析时出过好多错,主要浪费在了hash函数上,没有弄清h的类型,导致生产的总不行,后来通过linux远程调试才明白hash的执行过程。

      总之,通过这次的逆向分析让我学到了好多东西,也为以后的学习工作带来了很大的方便。

发布了2 篇原创文章 · 获赞 14 · 访问量 3万+

おすすめ

転載: blog.csdn.net/l123649/article/details/104429560