Wątek zablokowany 2011-06-10 13:18 przez Demonical Monk.

Potrzebuje złamać szyfr, mam kontrolkę dll, muszę odtworzyć kod

0

Witam, posiadam zagłostkę.

Buduję w mojej firmie baze danych sprzedaży, i chcę podłączyć ją pod jak największą liczbę zewnętrznych hurtowni.
Dostałem się do plików jednej hurtowni - pliki są używane przez ich katalog. Chcę aby mój program aktualizował cennik automatycznie (20000 produktów - przepisywanie cen ręcznie nie wchodzi w gre).

Z tej bazy wyłuskałem ceny, jednak są zakodowane:

',"N3		38.52
'*"M9		36.48
',"M3		38.42
+*"O8		76.67
)$"R7		50.96
--"K8		99.27
))"K:		55.29

na pierwszy rzut oka wydaje się to prostym przesunięciem znaków, jednak te przesunięcia są zmienne dla różnych indeksów.

tutaj jak widać jest już inne przesunięcie
96"-' 84.93

Nie potrafię rozszyfrować na jakiej zasadzie obliczane jest przesunięcie znaków.

Znalazłem za to kontrolkę dll która ma wyeksportowane dwie funkcje KODUJ oraz DEKODUJ. Śmiem sądzić że to prosta funkcja kodująca STRING na STRING jednak nie jestem w stanie jej użyć, próbowałem standardowym
function Dekoduj(Input: PChar): PChar; stdcall; external 'cb.dll' name 'Dekoduj';

ale wywala mi błąd.

usunięty link to ta kontrolka dll z tymi dwiema funkcjami.

to kod z deasemblera:

 Dekoduj:
  		push	ebp
  		mov	ebp,esp
  		add	esp,FFFFF004h
  		push	eax
  		add	esp,FFFFFF7Ch
  		push	[ebp+08h]
  		call	SUB_L004029EC
  		pop	ecx
  		mov	[ebp-04h],eax
  		push	[ebp+0Ch]
  		call	SUB_L004029EC
  		pop	ecx
  		mov	[ebp-08h],eax
  		push	00000004h
  		push	00000000h
  		push	[ebp+10h]
  		call	SUB_L0040290C
  		add	esp,0000000Ch
  		push	[ebp-08h]
  		push	[ebp+0Ch]
  		lea	eax,[ebp-00001084h]
  		push	eax
  		call	SUB_L004014EC
  		add	esp,0000000Ch
  		xor	edx,edx
  		mov	[ebp-18h],edx
  		cmp	dword ptr [ebp-04h],00000000h
  		jz 	L004018E2

Zapłacę za złamanie tego szyfru, jest mi to niezmiernie potrzebne do pracy, od tego zależy mój chleb. Pomocy

1

Przeanalizowałem tą bibliotekę, korzysta z blowfisha, napisana w BCB, napisałem przykładowe kody źródłowe, które kodują / dekodują dane (mają inny prototyp i wymagane jest jeszcze hasło), ale za 50 zł jakie mi zaproponowałeś to wysyłam to do kosza, a tutaj masz fajne forum, na którym sam nauczysz się takiej analizy www.woodmann.com wprawdzie potrwa to kilka lat, ale na pewno sobie to potem odbijesz, jak ktoś inny będzie Ci chciał zaproponować równie wysokie wynagrodzenie za przepisanie całkiem sporego kawałka z assemblera na Delphi. Życzę miłej nauki!

0

Zapłacę więcej, nie lubię rzucać cen bo nie znam się ile mogło by to kosztować. Po prostu mi zależy na rozszyfrowaniu tych cen, bo to mi jest potrzebne do pracy. Jak je komuś uda się złamać to zapłacę, i każdy zarobi i wszyscy będą szczęśliwi.

Trochę siedzę w programowaniu, ale wysokopoziomowym, a w pracy programowanie to tylko pomoc bo zajmuje się handlem i na to tylko mam czas.

Proszę mi tylko powiedzieć czy ta dllka przyda mi się przy deszyfrowaniu tych cen, czy to po prostu zwykły śmieć. Bo gdy o to zapytałem powiedziałeś że po prostu dostarczysz mi prototyp tej funkcji, gdy jasno dałem do zrozumienia że wszystko kręci się wokół cen.

Poza tym, jeśli ktoś potrafi wywołać funkcję z dllki to nie potrzebuje prototypu w delphi, po prostu użyje tej dllki w moim programie.

120002	96"-'                84.93

000I1G	',"N3                38.52
000I1H	'*"M9                36.48
000I1I	',"M3                38.42
000I1J	+*"O8                76.67
000I1K	)$"R7                50.96
000I1L	--"K8                99.27
000I1M	))"K:                55.29

czy kluczem przesunięć może być indeks (pierwsza kolumna) lub jego część? Gdyż klucz wydaje się być ten sam dla kilku lub kilkunastu indeksów.

Wynagrodzę jeśli ktoś mi pomoże.

0

Wiesz, najszybciej by było, jakbyś po prostu wrzucił ten plik (albo przynajmniej jego znaczący fragment) na forum - może ktoś się tym zajmie i to przejrzy dla czystej rozrywki. A potem, skoro już oferujesz wynagrodzenie, to za jakąś sumę zdradzi Ci, jaki jest sekret tego kodowania. A ja podejrzewam, że to w ogóle nie musi być kodowanie tylko coś na zasadzie klucza obcego do innej "tabeli".

0

W sumie racja, i tak chciałem podesłać bazę zainteresowanemu, ale może komuś się nudzi, to i zarobi przy okazji ;-)

usunięty link

baza jest w formacie DBF. SDOST to tabela z indeksami towarowymi do których są przypisane numerki.
a tabela ck_c to ceny produktów.

ps. siedzę w handlu częściami samochodowymi, mogę załatwić każdą część bardzo tanio, także wszelka pomoc będzie nagradzana czy to gotówką czy kosmicznym rabatem na części.

0

A czy to jest w ogóle legalne ? Masz prawa do przeglądania tych danych ? Oraz czy jesteś w stanie dostarczyć większą, bardziej zróżnicowaną próbkę cen "zdekodowanych" ? Szczególnie dla cen, które nie posiadają po zakodowaniu znaku " w sobie.

0

Ja mam wrażenie, że to było tak:

  • ktoś stworzył sobie system do zarządzania tymi produktami
  • ktoś potem przyszedł i ulepszył ten system, jednocześnie psując "kodowanie"
  • potem było to samo znów ;p
    Tam są co najmniej dwa sposoby kodowania tej ceny (jeden jest odwrotnością drugiego), a być może jest jeszcze więcej... i chyba są związane ze sobą czasowo (czyli w pewnym okresie było kodowane tak, potem inaczej, a potem jeszcze inaczej...). Ale to wymaga głębszej analizy, na razie tylko piszę, co mi przyszło na myśl ;)
1

To może poproś administratora tej bazy o udostępnienie Ci danych? :P

0

Legalne nielegalne, nikt mnie nie pozwie za to, bo współpraca między firmami to priorytet, oni wiedzą że oczekuję od nich cennika w czytelnej formie (ich informatyk marudził i marudził ale nie daje za wygraną), i wiedzą że jeśli go zdobędę to oni będą nam więcej sprzedawać i my więcej kupować i też sprzedawać, i wszyscy będą zadowoleni.

Poza tym kontrol jakby wpadł do firmy to i tak nie wiedziałby co to za pliki, a czyje to pliki, bo katalogi nie są ogólnodostępne lecz dostarczane przez hurtownie - mój program piszę w Lazarusie, kodu źródłowego nie dostaną bo nie mają prawa, więc nie wie nikt co robi mój program i gdzie zagląda (oczywiście da rade ale kto by się głowił).

Mało tego, katalog dostarczony przez hurtownie jest zainstalowany legalnie, a to że mój program co jakiś czas otworzy sobie jego pliki DBF to już nie ma opcji żeby ktoś to zauważył i się przyczepił :)

Dostarczę więcej cen, z jak największej grupy towarów.

edit:
a np. ceneo? Też trochę sobie leci w kulki z tymi sklepami, i to publicznie. Z wieloma innymi hurtowniami sobie poradziłem, bo mają dostęp przez WWW do cen po zalogowaniu, więc to był pikuś, jak na złość ta hurtownia ma ceny 2x niższe, i było by to wielce atrakcyjne, przebilibyśmy konkurencję cenowo.

0

Tzn wyprosić mogę żeby wygenerowali mi cennik, ale mnie bardziej chodzi o jego aktualność. Nie mogę zawracać gitary im tydzień w tydzień, i czekać aż łaskawie znajdzie ktoś czas. Za to zautomatyzowany dostęp do aktualnych cen i stanów magazynowych (które defacto zmieniają się bardzo często - jeśli mają w magazynie 2-4 sztuki towaru, to może być za chwilę wysprzedany) byłby bajką.

1

Na szybko analiza tego co podałeś:

',"N3 38.52
'"M9 36.48
',"M3 38.42
+
"O8 76.67
)$"R7 50.96
--"K8 99.27
))"K: 55.29

AA BC aa bc

_ _ A _ _
a -> A
0 -> $
1 ->
2 ->
3 -> '
4 ->
5 -> )
6 -> *
7 -> +
8 -> ,
9 -> -

dodatkowe informacje:

0010 0100 	36 	24 	$
0010 0101 	37 	25 	 %
0010 0110 	38 	26 	&
0010 0111 	39 	27 	'
0010 1000 	40 	28 	(
0010 1001 	41 	29 	)
0010 1010 	42 	2A 	*
0010 1011 	43 	2B 	+
0010 1100 	44 	2C 	,
0010 1101 	45 	2D 	-

Wniosek:

char convertA(int a_num)
{
    return '$' + a_num;
}

_ _ B _ _
b -> B
0 ->
1 ->
2 -> K
3 ->
4 -> M
5 -> N
6 -> O
7 ->
8 ->
9 -> R

dodatkowe informacje:

0100 1001 	73 	49 	I
0100 1010 	74 	4A 	J
0100 1011 	75 	4B 	K
0100 1100 	76 	4C 	L
0100 1101 	77 	4D 	M
0100 1110 	78 	4E 	N
0100 1111 	79 	4F 	O
0101 0000 	80 	50 	P
0101 0001 	81 	51 	Q
0101 0010 	82 	52 	R

wniosek:

char convertB(int b_num)
{
    return 'I' + b_num;
}

_ _ C _ _
c -> C
0 ->
1 ->
2 -> 3
3 ->
4 ->
5 ->
6 -> 7
7 -> 8
8 -> 9
9 -> :

dodatkowe informacje:

0011 0001 	49 	31 	1
0011 0010 	50 	32 	2
0011 0011 	51 	33 	3
0011 0100 	52 	34 	4
0011 0101 	53 	35 	5
0011 0110 	54 	36 	6
0011 0111 	55 	37 	7
0011 1000 	56 	38 	8
0011 1001 	57 	39 	9
0011 1010 	58 	3A 	 :

wniosek:

char convertC(int c_num)
{
    return '1' + c_num;
}

Jak na razie wygląda na proste przesunięcie, ale

96"-' 84.93
C? AA

? = () => {'2' + num}

000I1_ -> AABC
120002 -> C?AA

Klucza przesunięcia nie widać... Do kiedy masz termin? Kiedy będę miał więcej czasu (tzn. pewnie weekend) postaram się temu przyjrzeć, kto wie, może coś wymyślę.

0

Jest dokładnie tak, jak napisał MSM, problem w tym, że nie wiadomo, kiedy stosować pierwszą, kiedy drugą i trzecią metodę kodowania. A jeszcze gorsze są przykłady danych bez znaku " albo z dwoma znakami "". To jest jakiś sajgon :D

1

Przytłaczająca ilość danych:

120002        96"-'                84.93
000I1G        ',"N3                38.52
000I1H        '*"M9                36.48
000I1I        ',"M3                38.42
000I1J        +*"O8                76.67
000I1K        )$"R7                50.96
000I1L        --"K8                99.27
000I1M        ))"K:                55.29

I jeśli tam nie ma innych niespodzianek, to poniżej rozwiązanie (z tego już się chyba połapiesz co i jak, na delphi przerobić nie problem):

def decode(index, secret):
    price = []
    #lecimy po wszystkich kolejnych literkach zakodowanej ceny
    for i in range(0, len(secret)):
        #te if-y pozwalają na zdekodowanie ceny (kolejnych cyferek ceny)
        if ord(index[i]) == 48:
            price.append(chr(ord(secret[i]) + 12))
        else:
            price.append(chr(ord(secret[i]) - ord(index[i]) + 48))
    return ''.join(price)

if __name__ == '__main__':
    print decode("120002", "96\"-\'")       #84.93
    print decode("000I1G", "\',\"N3")       #38.52

A na wszelki wypadek jeszcze po polskiemu:

  1. Pobierasz pierwszy znak z indeksu, zamieniasz go na kod ascii (w delphi też jest ord())
  2. Pobierasz pierwszy znak z zakodowanej ceny, zamieniasz go na kod ascii
  3. Jeśli pierwszy znak z indeksu ma kod 48 (czyli znak 0) to zapamiętaj 12, jeśli jest większy to zapamiętaj 48
    a. Jeśli zapamiętana liczba to 12 to dodajesz ją do kodu pierwszego znaku zakodowanego hasła i zamieniasz to na znak
    b. Jeśli zapamiętana liczba to 48 to od kodu pierwszego znaku z zakodowanego hasła odejmujesz kod pierwszego znaku z indeksu, a do tego wszystkiego dodajesz 48, a wynik zamieniasz na znak
  4. W delphi tak samo jest chr() do zamiany z kodu na znak
  5. Cieszysz się, że pierwsza literka odcyfrowana, wracasz do punktu 1 i postępujesz tak samo ze wszystkimi kolejnymi.

Nie wiem jak są kodowane ceny, jeśli "długość" ceny jest większa niż "długość" indeksu (czyli ceny powyżej 999 zł 99 gr), może w takim przypadku indeks jest "obrabiany" w kółko... Jakie dane, takie rozwiązanie... Z powyższego widać, że funkcja na kilka linijek, no chyba, że dll-ka robi jeszcze kawę.

flasher86 napisał(a)

Jak je komuś uda się złamać to zapłacę, i każdy zarobi i wszyscy będą szczęśliwi.
Możesz mnie uszczęśliwić...

0

Tu masz w Delphi:

Function Decode(Index, Secret: String): String;
Var I: Integer;
Begin
 Result := '';
 For I := 1 To Length(Secret) Do
  if Ord(Index[I]) = 48 Then
   Result := Result + Chr(Ord(Secret[I]) + 12) Else
   Result := Result + Chr(Ord(Secret[I]) - Ord(Index[I]) + 48);
End;

Nieco, lecz tylko troszkę dłuższe wydanie tego kodu:

Function Decode(Index, Secret: String): String;
Const oI = 1;
      oS = 2;
Var I: Integer;

 Function CheckIndex: Boolean;
 Begin
  Result := Ord(Index[I]) = 48;
 End;

 Procedure IncResult(I: Integer);
 Begin
  Result := Result + Chr(I);
 End;

 Procedure SetResult(S: String);
 Begin
  Result := S;
 End;

 Function O(What: Integer): Integer;
 Var R: Integer;
 Begin
  R := 0;
  Case What Of
   oI: R := Ord(Index[I]);
   oS: R := Ord(Secret[I]);
  End;
  Result := R;
 End;

 Function Len(What: Integer): Integer;
 Var R: Integer;
 Begin
  R := 0;
  Case What Of
   oI: R := Length(Index);
   oS: R := Length(Secret);
  End;
  Result := R;
 End;

Begin
 SetResult('');
 For I := 1 To Len(oS) Do
  if CheckIndex Then
   IncResult(O(oS) + 12) Else
   IncResult(O(oS) - O(oI) + 48);
End;
0

Madmike jesteś Geniusz!!! Geniusz!!!!!!!!!! Wypas, śmiga na losowych indeksach tak jak trzeba! Mogę usunąć te posty? Wole dmuchać na zimne, żeby jakiś urażony informatyk nie poczuł się durniem skoro ktoś tak łatwo złamał jego kod :] W sumie po co to im było kodować, dla zasady? Chociaż... gdy ja pisałem program, to nawet const stringi z początku kodowałem, żeby nikt nie dopatrzył się linków URL do hurtowni.

wyślij mi nr konta na priv

0

wszystko gra, sprawdziłem ten jeden indeks, to jakiś podnośnik dla warsztatów, 10000 zł kosztuje netto. Mnie takie produkty nie interesują. Poza tym baza zasyfiona jest nieuzywanymi indeksami, ktore wyszly z uzytku, albo sa puste czy cos w tym rodzaju. jakas 1/3 tego to dane ktore sa mi przydatne.

ps. jak komus samochod sie rozdupcy to zapraszam na priv, znajdziemy cos taniego. nie bede tu reklamowal swojego sklepu publicznie, bo tu w koncu hakerzy crackerzy dla rozrywki mi rozwala sklep :]

0

Sprawdziłem to i wykrzacza się dla danych z indeksu 000024 (cena zakodowana: '-))04$ -> jest dłuższa niż indeks, więc nie wiemy, co zrobić... zapętlamy ?), 000098 (ten sam problem), 0000OY, 0000W7 i zapewne setek innych. Przy zapętleniu wszystko działa, natomiast niektóre ceny wydają się być dziwne ;p Końcówki typu .91, .63, .34, .12, .13, .64, .77, .57 nie są zbyt często w handlu spotykane ;) Ale to hurtownia, więc może tam jest inaczej.

0

indeksu 000024 nie ma w kartotece. Jest w cenniku, ale w kartotece indeksów towarów właściwych (używanych w handlu - tabela SDOST) nie ma.

Co do cen, to groszowe końcówki są zupełnie normalne, ceny zaokrąglają sklepy końcowe. Gdy fabryka produkuje części, swoim odbiorcom sprzedaje je po cenach 90-95% niższych niż cena za którą kupi ją klient końcowy. Dlatego każdy grosz się liczy, gdy towar obraca się w tysiącach sztuk. Przykre to niestety, że klient utrzymuje czasami nawet 10 pośredników gdzie każdy chce coś przyciąć.

ps. nawet jeśli cena jest dłuższa niż indeks, to tylko dlatego że to coś kosztuje powyżej 1000 lub 10000 złotych, tak jak mówiłem takie produkty to jakieś wyjątki, zupełnie niepotrzebne w mojej branży. Mnie interesują tarcze, klocki, czujniki, sprzęgła, filtry. Ceny 50-500zł max.

0

Na koniec dam Ci jeszcze do zweryfikowania zestawienie - zdekodowane ceny i przedmioty im odpowiadające (nazwy). Dane pobrane z plików ck_c.csv i noferta.csv. Poza tymi indeksami, których ceny sprawiały kłopoty (i zostały one wymienione przeze mnie w poście) ceny są niezmienione (tym kilku "ręcznie" usunąłem ostatni znak z kodu). Mam nadzieję, że nigdzie się nie pomyliłem przy generowaniu tego zestawienia. Oto link: [link usunięty ;) ]

0

Przez przypadek odkryłem jeszcze to:

INDEKS	cena. zakod.	cena odkod.		   nazwa
 44430	!6=71*!		1293.6- 		-> G˙OWICA VW LT 2,4D 82- /DW/
 78030	#<='1)!		3553.5- 		-> KO˙O DWUMASOWE OPEL OMEGA 2,5 V6 94-

Czy to błąd w mojej implementacji ? Czy informacja, że zapętlanie jest błędne ? Może należy uzupełniać zerami zamiast zapętlać ?

0

cena 1293.61 powinna być.

proszę usuń linka do bazy, nie chce żeby każdy mógł się bawić nią.

0
madmike napisał(a)

Nie wiem jak są kodowane ceny, jeśli "długość" ceny jest większa niż "długość" indeksu (czyli ceny powyżej 999 zł 99 gr), może w takim przypadku indeks jest "obrabiany" w kółko... Jakie dane, takie rozwiązanie...
Bawcie się, ja się boję, że komuś zepsuję znowu zabawę :D

0

Baza danych pochodzi z serwisu Auto-Land:

http://www.auto-land.pl/index.php?mode=kontakt

najprościej się ich zapytać, wysłałem im zapytanie w sprawie tego dekodowania wraz z bazą jaką dałeś, może ktoś z działu informatycznego będzie ci mógł pomóc?

pozdrawiam

0

dzięki ku***... zawsze znajdzie się ktoś komu nie pasuje że ma dobrą prace... co się wkrzaniasz, po co smród mi robisz? nie pojmujesz że możesz narobić problemów? Troskliwy miś się znalazl

co za świat, człowiek liczy na pomoc z dobrego serca, ale dostaje kose w plecy. Ciekawi mnie czy ty jesteś po prostu tępy, czy zły. Jedno z dwojga - skoro napisałeś do nich i wysłałeś im jeszcze moją bazę.

0

Pomoc z dobrego serca powiadasz dobry człowieku?

Kradniesz cudzą pracę włożoną w budowanie baz danych - to ma nazwę ZŁODZIEJSTWO

Ktoś siedział i tworzył te rekordy, ktoś napisał program tworzący nowe wpisy (samo się nie zrobiło), a tobie wygodniej po prostu wziąć co ci pasuje, bo akurat jest ci to potrzebne bez płacenia, czy jak idziesz do sklepu to bierzesz towary i wychodzisz ot tak po prostu, a jak cię złapią to nazywasz to wbijaniem noża w plecy?

Jesteś zwykłym złodziejem i dziwię się, że na forum 4p popierane są tego typu praktyki i jeszcze jest na to przyzwolenie, ba, nawet pomoc moderacji!

Brzydzę się takimi ludźmi jak ty i jeszcze się usprawiedliwiasz (masz tupet!), również posłałem do tej firmy kopię twojej bazy danych, mam nadzieję, że cię namierzą dzięki temu.

PS. Znając życie będziesz teraz kasował wszystkie swoje wpisy dlatego poniżej kopia twojej bazy i biblioteka CB.dll

Baza danych firmy Auto-Land, którą dałeś na początku - [CIACH!]

Biblioteka CB.dll - [CIACH!]

0

E tam... robicie dym ;p Z tego, co ja zrozumiałem, nie robimy nic złego. Po prostu usprawniamy pracę użytkownikowi flasher86 - napisał on, że posiada legalny program, który jest powiązany z tą bazą. A my po prostu robimy inny dostęp do tejże bazy - które np pozwoli flasherowi sprawniej prowadzić swoją firmę, a hurtownia, z której zamawia produkty jeszcze na tym zyska, bo będzie on mógł częściej zamawiać od niej części. Tylko czepialsy by się pienili o to, a normalni ludzie, myślę, że zrozumieją i być może będą chcieli tę metodę rozpropagować nawet wśród swoich potencjalnych klientów. Tyle w temacie wg mnie :)

0

Zależy co jest zapisane w licencji programu/ bazy.

0

Temat uznaję za zamknięty a sprawę wyjaśnimy.

1
lolek napisał(a)

Brzydzę się takimi ludźmi jak ty i jeszcze się usprawiedliwiasz (masz tupet!), również posłałem do tej firmy kopię twojej bazy danych, mam nadzieję, że cię namierzą dzięki temu.

A ja sie brzydze wszelkiej masci donosicielami, podsluchiwaczami i innymi zyczliwymi. Mam nadzieje ze flasherowi uda sie usprawnic prace z baza danych fimy a lolkowi zostanie latka ormowca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1